今回は、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)監修のもと掲載しています。
元記事は、こちら