FreshConnectionをロードバランサー環境で実際に動かしてみた
関連 : RailsでMysqlスレーブ群をロードバランサ経由で使用できる、FreshConnectionを作り始めました
今日は実際にMySQLスレーブ群の前にロードバランサーを置いて、FreshConnectionを使ってみました。
ロードバランサーはLVS+keepalivedで簡単に構築したものです。
RailsApp --------- Mysql(Master) localhost
|
| +------ Mysql(Slave1) 192.168.11.5
| |
+---- LVS ------------+
192.168.11.60 |
+------ Mysql(Slave2) 192.168.11.16
Railsのアクションは前回のテストのものと同様です。実際にブラウザでアクセスして、それぞれのMySQLのクエリログを確認してみます。
まずはMasterです。Masterにくるもの以外のクエリはきておらず、一つのアクションが終わった時点でコネクションが切断されています。
30秒近く時間が開いているのは、30秒間のsleepをいれているためです。
111018 22:23:06 36 Connect master@localhost on kaeru
36 Query SET NAMES 'utf8'
36 Query SET SQL_AUTO_IS_NULL=0
36 Statistics
36 Query SHOW FIELDS FROM `articles`
36 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 106)
36 Query BEGIN
36 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 107)
36 Query COMMIT
111018 22:23:37 36 Quit
次にSlave1です。FreshConnectionの設定でmax_connectionは5本にしていますが、そのうちの2本がやってきたようです。問題ありません。
111018 22:24:36 1526 Connect slave@192.168.11.60 on kaeru
1526 Query SET NAMES 'utf8'
1526 Query SET SQL_AUTO_IS_NULL=0
1526 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 100)
1527 Connect slave@192.168.11.60 on kaeru
1527 Query SET NAMES 'utf8'
1527 Query SET SQL_AUTO_IS_NULL=0
1527 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 102)
111018 22:25:06 1527 Quit
1526 Quit
最後にSlave2です。こちらには残りの3本がきています。期待どおりです。
111018 22:23:06 87 Connect slave@192.168.11.60 on kaeru
87 Query SET NAMES 'utf8'
87 Query SET SQL_AUTO_IS_NULL=0
87 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 105)
111018 22:23:07 88 Connect slave@192.168.11.60 on kaeru
88 Query SET NAMES 'utf8'
88 Query SET SQL_AUTO_IS_NULL=0
88 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 101)
89 Connect slave@192.168.11.60 on kaeru
89 Query SET NAMES 'utf8'
89 Query SET SQL_AUTO_IS_NULL=0
89 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 103)
87 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 104)
89 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 108)
87 Query SELECT * FROM `articles` WHERE (`articles`.`id` = 109)
111018 22:23:37 87 Quit
89 Quit
88 Quit
この後、Slave2を落としてみました。そうすると、スレーブで処理するクエリはすべてSlave1に投げられたことを確認しました。そしてまたSlave2を起動すると、次のアクションからはSlave2にもクエリが投げられるようになりました。すべて期待どおりです。
あとはアクション処理中にスレーブの1台が落ちると例外が発生してしまうのでこれに対処していきます。