FreshConnectionをロードバランサー環境で実際に動かしてみた

Tsukasa OISHI

関連 : 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台が落ちると例外が発生してしまうのでこれに対処していきます。