おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

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