AWSには手軽にRDBが使えるRDSというサービスがあります。
LAMP環境を利用する事が多く重宝しており、特にReadReplica機能(以下RR)で簡単にリソース増強できるため、
DBへの参照(select)が多い場合とても便利です。
このRRをマスター昇格(Promote)する方法を今回はご紹介します。

・事前確認
MasterとRRがどのようになっているかDB内から確認してみます。
今回はMySQLのRDSです。

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.

※RR操作

[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)

※RR操作

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)
※RR操作

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)

※RR操作

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

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

○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.

※RR操作

[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)

※RR操作

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)

※RR操作

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

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

■元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が
使えなくなった場合に使う事かと思います。

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