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が使えなくなった場合に使う事でしょうか。