今回は、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から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)
図にすると、下記のようになるかと思います。