2012年4月20日金曜日

HAProxyを用いた"Read Replica"(RDS)の振り分け

スズキです。

CDPネタです。今回の対象は「Read Replicaパターン」です。


このパターンの実装に
複数のリードレプリカを利用することでも、そのリードレプリカを複数のデータセンタに配置することも可能だが、アプリケーション側でその振り分けを行う必要がある。HAProxyやMySQL Proxy等のミドルウェアを用いても良い。
といった記載があります。

今回は、HAProxyを用いたリードレプリカの振り分けを試してみました。
まずは下記のRDS(MySQL)群を用意します。
  • Master (master.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com)
  • Read Replica 1 (slave1.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com)
  • Read Replica 2 (slave2.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com)
HAProxyを用いたMySQLの振り分けは、下記でも紹介しています。
HAProxy(1.4)でMySQLの自動フェイルオーバーにあわせて接続先を変更
特にHAProxyからMySQLへのヘルスチェックで、MySQLがHAProxyからの接続を ブロックしてしまう問題を回避するためにMySQLの設定(my.cnf)で
max_connect_errors=999999999
を記述する必要があります。
当然、同様のことをRDSのDBパラメータグループで行なわなければなりません。

まずは、"Master RDS"の接続確認です。

# mysql -h master.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u suzuki -psuzuki123
...

mysql> show master status;
...
1 row in set (0.00 sec)

mysql> show slave status;
Empty set (0.00 sec)

マスターステータスにはデータが有り、スレーブステータスには
データが無いことが分かります。(同期元のマスターMySQLなので当たり前ですが...)

次に、"Read Replica"の接続確認です。

# mysql -h slave1.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u suzuki -psuzuki123
...

mysql> show master status;
Empty set (0.00 sec)

mysql> show slave status;
...
1 row in set (0.00 sec)

"Read Replica"はスレーブMySQLなので、逆にマスターステータスには
データが無く、スレーブステータスにはデータが有ることが分かります。
(同期先のスレーブMySQLなので当たり前ですが...)

そして、下記のような設定で、HAProxy(3306)経由でアクセスが分散するようにしてみます。

listen mysql
    bind    0.0.0.0:3306
    mode    tcp
    option  mysql-check
    balance leastconn
    server  slave1 slave1.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 check port 3306 inter 10000 fall 2
    server  slave2 slave1.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 check port 3306 inter 10000 fall 2
    server  master master.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 check port 3306 backup

ここでのポイントは、"Master RDS"も振り分け先サーバに指定されていることです。
ただし、"backup"オプションをつけているので、二つの"Read Replica"が
利用できなくなって、初めて利用されます。(保険的な利用となります)

それでは接続テストです。

何回かHAProxy経由でアクセスしても、下記のように"Read Replica"のみに
振り分けられることがわかります。("Master RDS"にはアクセスされません)

# mysql -h 127.0.0.1 -u suzuki -psuzuki123
...

mysql> show slave status;
...
1 row in set (0.00 sec)

ここで、すべての"Read Replica"を削除して、再度HAProxy経由でアクセスしてみます。

すると今度は下記のように、"Master RDS"に振り分けられます。

# mysql -h 127.0.0.1 -u suzuki -psuzuki123
...

mysql> show master status;
...
1 row in set (0.00 sec)

図にすると、こんな感じでしょうか?


早くも、週一でCDPブログ書けなくなってきた...
--------
http://www.suz-lab.com/

0 コメント: