📑

Aurora MySQL v3にSwith/Rollback

2024/10/16に公開

過去ログ

1回目

https://zenn.dev/shigeru_oda/articles/57d24dc357f2a0

2回目

https://zenn.dev/shigeru_oda/articles/9ed9194a6384dd

3回目

https://zenn.dev/shigeru_oda/articles/e777bff6db46bc

4回目

https://zenn.dev/shigeru_oda/articles/083917797aac6c

5回目

https://zenn.dev/shigeru_oda/articles/103b61d0b2d3eb

前回と改善

バイナリログが出ないと思ったけど、AWS Documentの日本語の手順では無理なのか
英語記事では消えていた。AWS BLOGの手順を正にして対応する。

日本語

英語

構成図

https://d2908q01vomqb2.cloudfront.net/887309d048beef83ad3eabf2a79a64a389ab1c9f/2024/07/26/arch-diag.png
2以降

やりたいこと

https://aws.amazon.com/jp/blogs/database/implement-a-rollback-strategy-after-an-amazon-aurora-mysql-blue-green-deployment-switchover/

手順概要

  • 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 ブルー/グリーン デプロイメントの切り替えを実行する

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-switching.html#blue-green-deployments-switching-over

切り替え

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