📑
Aurora MySQL v3にSwith/Rollback
過去ログ
1回目
2回目
3回目
4回目
5回目
前回と改善
バイナリログが出ないと思ったけど、AWS Documentの日本語の手順では無理なのか
英語記事では消えていた。AWS BLOGの手順を正にして対応する。
日本語
英語
構成図
2以降
やりたいこと
手順概要
- Aurora MySQL ブルー/グリーン デプロイメントの切り替えを実行します。
- Aurora MySQL ブルー/グリーン デプロイメントを削除します。この段階では、ブルー/グリーン デプロイメントを削除しても、データベース環境には影響しません。
- 実稼働環境からロールバック環境への論理レプリケーションを構成します。
- 運用環境で問題が発生した場合は、ロールバック環境に切り替えます。
手順
ロールバックのためのグリーン環境を準備する
CloudShellでgreen環境にログイン
sudo yum update -y
sudo yum install mariadb -y
mysql --version
# 各人のgreen環境のWriter Endpoint利用
ENDPOINT=xxx
PASSWORD=your_password
mysql -h $ENDPOINT -u admin -p$PASSWORD
Aurora MySQL バイナリログの設定確認
show variables like 'log_bin';
ONであること
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.006 sec)
show variables like 'binlog_format';
ROWであること
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.004 sec)
Aurora MySQL バイナリログの保持の設定
現在の値確認
CALL mysql.rds_show_configuration\G
*************************** 1. row ***************************
name: binlog retention hours
value: NULL
description: binlog retention hours specifies the duration in hours before binary logs are automatically deleted.
1 row in set (0.002 sec)
バイナリログの保持時間を 24 に設定
CALL mysql.rds_set_configuration('binlog retention hours', 24);
更新後の値確認
CALL mysql.rds_show_configuration\G
*************************** 1. row ***************************
name: binlog retention hours
value: 24
description: binlog retention hours specifies the duration in hours before binary logs are automatically deleted.
1 row in set (0.002 sec)
Aurora MySQL ブルー/グリーン デプロイメントの切り替えを実行する
切り替え
ID=$(aws rds describe-blue-green-deployments \
--query "BlueGreenDeployments[*].BlueGreenDeploymentIdentifier" \
--output text);echo $ID
aws rds switchover-blue-green-deployment \
--blue-green-deployment-identifier $ID \
--switchover-timeout 600
切り替え確認
binlog fileのfile、positionを確認
新しいblue環境からbinlog fileのfile、positionを確認
show variables like 'binlog_format';
結果
+----------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-changelog.000015 | 2974 | | | |
+----------------------------+----------+--------------+------------------+-------------------+
blue/green deploymentを削除
旧環境を残す形式でblue/green deploymentを削除
ID=$(aws rds describe-blue-green-deployments \
--query "BlueGreenDeployments[*].BlueGreenDeploymentIdentifier" \
--output text);echo $ID
aws rds delete-blue-green-deployment \
--blue-green-deployment-identifier $ID \
--no-delete-target
blue/green deploymentが削除され、Ver2とVer3のクラスタが残る
古い環境を読み取り専用モードに切り替え
aws rds modify-db-cluster-parameter-group \
--db-cluster-parameter-group-name aurora-mysql-cluster-param-group-57 \
--parameters "ParameterName=read_only,ParameterValue=1,ApplyMethod=immediate"
古い環境にログインして、設定を確認
MySQL [(none)]> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
1 row in set (0.002 sec)
MySQL [(none)]>
本番DBクラスターでレプリケーションユーザーを構成する
新しい環境でユーザーを作成します、IPアドレスはVPCのCIDRにしています。
CREATE USER 'repl_user'@'10.0.0.0/16' IDENTIFIED BY 'your_password';
新しい環境で先ほど作成したユーザーに権限付与します。
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'10.0.0.0/16';
本番環境からロールバック DB クラスターへのバイナリ ログのレプリケーションを構成する
古い環境でレプリケーション構成をします。
指定するのは新しい環境のENDPOINT、前に収集した MySQL binlog ファイル名と位置を使用
call mysql.rds_set_external_master ('aurora-mysql-blue-green-cluster.cluster-cqllvfihq2kn.ap-northeast-1.rds.amazonaws.com', 3306, 'repl_user', 'your_password', 'mysql-bin-changelog.000015', '2974', 0);
古い環境でレプリケーションプロセス開始
MySQL [(none)]> CALL mysql.rds_start_replication;
+-------------------------+
| Message |
+-------------------------+
| Slave running normally. |
+-------------------------+
1 row in set (1.007 sec)
古い環境でステータス確認
以下であることを確認
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
MySQL [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: aurora-mysql-blue-green-cluster.cluster-cqllvfihq2kn.ap-northeast-1.rds.amazonaws.com
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-changelog.000015
Read_Master_Log_Pos: 3520
Relay_Log_File: relaylog.000002
Relay_Log_Pos: 879
Relay_Master_Log_File: mysql-bin-changelog.000015
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table: mysql.rds_replication_status,mysql.rds_monitor,mysql.rds_sysinfo,mysql.rds_configuration,mysql.rds_history
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 3520
Relay_Log_Space: 1079
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1885231699
Master_UUID: 892c1719-004a-3451-b137-a68048cb09eb
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.002 sec)
レプリケーションされていることを確認
新しい環境でデータを登録
MySQL [db1]> INSERT INTO table1 (name,age) VALUES ("REPLICA",1);
Query OK, 1 row affected (0.006 sec)
MySQL [db1]> SELECT * FROM table1 WHERE name = "REPLICA";
+------+---------+------+---------------------+
| id | name | age | created_at |
+------+---------+------+---------------------+
| 1004 | REPLICA | 1 | 2024-10-15 15:21:17 |
+------+---------+------+---------------------+
1 row in set (0.002 sec)
古い環境でデータがレプリケーションされていることを確認
MySQL [db1]> SELECT * FROM table1 WHERE name = "REPLICA";
+------+---------+------+---------------------+
| id | name | age | created_at |
+------+---------+------+---------------------+
| 1004 | REPLICA | 1 | 2024-10-15 15:21:17 |
+------+---------+------+---------------------+
1 row in set (0.002 sec)
ロールバック手順
新しい環境に問題があった前提でROLLBACKします。
ステータス確認
古い環境でステータスを確認
-
Seconds_Behind_Master: 0
→ レプリケーションの遅延はありません。スレーブはマスターと同期しています。 -
Seconds_Behind_Master
が非ゼロ → この数値は、スレーブがマスターの状態に追いつくまでにどれくらいの時間がかかっているかを示します。通常、値が増加している場合は遅延が発生しています。
MySQL [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: aurora-mysql-blue-green-cluster.cluster-cqllvfihq2kn.ap-northeast-1.rds.amazonaws.com
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-changelog.000015
Read_Master_Log_Pos: 3820
Relay_Log_File: relaylog.000002
Relay_Log_Pos: 1179
Relay_Master_Log_File: mysql-bin-changelog.000015
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table: mysql.rds_replication_status,mysql.rds_monitor,mysql.rds_sysinfo,mysql.rds_configuration,mysql.rds_history
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 3820
Relay_Log_Space: 1379
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1885231699
Master_UUID: 892c1719-004a-3451-b137-a68048cb09eb
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.002 sec)
新しい環境を読み取り専用モードに切り替え
aws rds modify-db-cluster-parameter-group \
--db-cluster-parameter-group-name aurora-mysql-cluster-param-group-80 \
--parameters "ParameterName=read_only,ParameterValue=1,ApplyMethod=immediate"
新しい環境にログインして、設定を確認
MySQL [(none)]> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
1 row in set (0.002 sec)
MySQL [(none)]>
バイナリ ログの位置が変更されていないことを確認
新しい環境
MySQL [(none)]> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin-changelog.000015
Position: 3820
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.002 sec)
古い環境環境
MySQL [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: aurora-mysql-blue-green-cluster.cluster-cqllvfihq2kn.ap-northeast-1.rds.amazonaws.com
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-changelog.000015
Read_Master_Log_Pos: 3820
Relay_Log_File: relaylog.000003
Relay_Log_Pos: 273
Relay_Master_Log_File: mysql-bin-changelog.000015
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table: mysql.rds_replication_status,mysql.rds_monitor,mysql.rds_sysinfo,mysql.rds_configuration,mysql.rds_history
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 3820
Relay_Log_Space: 1498
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1885231699
Master_UUID: 892c1719-004a-3451-b137-a68048cb09eb
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.002 sec)
MySQL [(none)]>
確認
- Relay_Master_Log_File、Exec_Master_Log_PosがSlave、Masterで同じであること
- Seconds_Behind_Masterが0であること
古い環境でレプリケーションを停止
MySQL [(none)]> call mysql.rds_stop_replication;
+---------------------------+
| Message |
+---------------------------+
| Slave is down or disabled |
+---------------------------+
1 row in set (1.007 sec)
Query OK, 0 rows affected (1.007 sec)
古い環境でMySQL レプリケーション構成情報を削除
MySQL [(none)]> call mysql.rds_reset_external_master;
+----------------------+
| message |
+----------------------+
| Slave has been reset |
+----------------------+
1 row in set (0.087 sec)
Query OK, 0 rows affected (0.087 sec)
古い環境を読み取り解除
aws rds modify-db-cluster-parameter-group \
--db-cluster-parameter-group-name aurora-mysql-cluster-param-group-57 \
--parameters "ParameterName=read_only,ParameterValue=0,ApplyMethod=immediate"
古い環境にログインして、設定を確認
MySQL [(none)]> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.002 sec)
あと対応
- アプリケーションのENDPOINTを切り替え
- 必要に応じてAurora MySQL Version3を削除
Discussion