2012年4月25日

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

今回は、Cloud Design Pattern(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オプションを付けているので、2つの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)
図にすると、下記のようになるかと思います。




こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら

お問い合わせはこちらから

  • お問い合わせ

0 コメント:

コメントを投稿