2013年2月23日土曜日

RDSのReadReplicaをマスター昇格


AWSではとってもお手軽にRDBが使えるRDSというサービスがある。LAMP環境を使う
事が多いので、これは非常に便利!特にReadReplica機能(以下RR)で簡単にリソース
増強できるのでDBへの参照(select)が多い場合は使わないともったいなーい。
このRRをマスター昇格(Promote)できるのでちょっとやってみましょう^^

・事前確認
一応、MasterとRRがどのようになっているかを実際にdbに入ってみてみます。
今回はMySQLのRDSです。以下Master操作は赤、RR操作は緑で表記します。

Master:test
RR:test-rep

■ログイン
[test ~]# mysql -h test.cabhwlkhzqy6.ap-northeast-1.rds.amazonaws.com -u dbowner -p

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.27-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


[test-rep ~]# mysql -h test-rep.cabhwlkhzqy6.ap-northeast-1.rds.amazonaws.com -u dbowner -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.27 Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

■テーブル内容確認
mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
+------+------------+
1 row in set (0.00 sec)


mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
+------+------------+
1 row in set (0.00 sec)

同じ状態である事がわかります。

■データ書き込み(レプリケーション確認)
mysql> insert into test_tbl values(2, 'test_user2');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
|    2 | test_user2 |
+------+------------+
2 rows in set (0.00 sec)


mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
|    2 | test_user2 |
+------+------------+
2 rows in set (0.00 sec)

Masterに書き込んだ内容がRRにも書き込まれていることが確認できました。

データ削除(レプリケーション確認)
mysql> delete from test_tbl where name = 'test_user2';
Query OK, 1 row affected (0.02 sec)

mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
+------+------------+
1 row in set (0.00 sec)


mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
+------+------------+
1 row in set (0.00 sec)

Masterで削除した内容がRRでも削除されていることが確認できました。

■RR書き込み不可確認
mysql> insert into test_tbl values(2, 'test_user2');
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

RRはReadOnlyで書き込み出来ない事も確認できました。


・RRのMaster昇格(Promote)
では実際にやってみましょう。作業はManagementConsoleから行います。

1.RDSメニューで対象のインスタンスにチェックを入れた状態で「Instance Action」
→「Promote Read Replica」を選択します。


2.設定画面がでます。RRではバックアップが取られない(当たり前ですが)ため、
自動バックアップを行うための設定を行います。
◎Enable Automated Backups 自動バックアップを行うかのを設定できます
◎Backup Retention Period バックアップ保存世代数を設定できます
◎Backup Windows 「Select Windows」を選択すると取得する時間を設定できます
設定したら「Continue」をクリックします。













3.注意書き画面がでます。要約すると下記の内容が書かれています。
【レプリケーションが完全にされている事】
【レプリカに戻す事はできません】
問題なければ「Yes, Promote Read Replica」をクリックするとPromote処理が実行されます。


非常に簡単です。処理自体はディスクサイズにより差がでると思いますが、10GBで
15分程度でした。


・事後確認
本当に元RRがMasterとして機能されているか実際にdbに入ってみてみます。

■ログイン
[test ~]# mysql -h test.cabhwlkhzqy6.ap-northeast-1.rds.amazonaws.com -u dbowner -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.27-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

[test-rep ~]# mysql -h test-rep.cabhwlkhzqy6.ap-northeast-1.rds.amazonaws.com -u dbowner -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.27 Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

■テーブル内容確認
mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
+------+------------+
1 row in set (0.00 sec)

mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
+------+------------+
1 row in set (0.00 sec)

同じ状態である事がわかります。

データ書き込み(非レプリケーション確認)
mysql> insert into test_tbl values(2, 'test_user2');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
|    2 | test_user2 |
+------+------------+
2 rows in set (0.00 sec)

mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
+------+------------+
1 row in set (0.00 sec)

Masterに書き込んだ内容が元RRには書き込まれていないが確認できました。

■元RRへのデータ書き込み
mysql> insert into test_tbl values(3, 'test_user3');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test_tbl;
+------+------------+
| no   | name       |
+------+------------+
|    1 | test_user1 |
|    3 | test_user3 |
+------+------------+
2 rows in set (0.00 sec)

元RRに書き込みできる事が確認できました。

ちなみに現在ではRDSの名前をModifyから変更する事もできるので、repなどの
Replicaであることの識別子を付与していても、変えれば大丈夫です。


・感想
簡単で便利な機能ではありますが、RDSにはSnapshot(バックアップ)から新規で
インスタンスを起動する事ができます。同じ状態のDBを作成したい場合はSnapshot
からの起動の方が利便性が良いような気がします。強いて言えば完全にレプリカ
されている状態のものとして作成できる事ですが、Masterを静的にしてSnaspshotを
とってからインスタンス起動させれば、その問題もありません。
可能性としてはRDSのMulti-AZ機能を使わずにRRを別ゾーンに作成して、ゾーン
障害がおきてMasterが使えなくなった場合に使う事でしょうか。