zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

【AWS】RDSの多段レプリケーションによるupgrade実施

【まとめ】

AWSの(RDS)MySQL5.5→5.7への強制Upgrade予告に対応するため、リードレプリカによる多段レプリケーションを組んだところ、シーケンシャルに行うと4時間弱のサービス停止が20分程度に抑えられた。
詳しくは以下を参照のこと
aws.amazon.com

【概要】

2020年の秋、AWSから以下の様なメールが届いた

Amazon RDS for MySQL 5.5 の廃止に関するお知らせ | Amazon RDS for MySQL 5.5 End-of-Life date is approaching

Amazon RDS は、MySQL メジャーバージョン 5.5 の廃止プロセスを開始します。これは、MySQL コミュニティでは、2018 年 12 月 3 日にすでに MySQL 5.5 のサポートを終了した為です。
Amazon RDS for MySQL 5.5 は、UTC 協定世界時間の 2021 年 2 月 9 日 00:00:01 (JST 日本標準時間の 2021 年 2 月 9 日(火) 09:00:01) に廃止されます。
(中略)
2021 年 2 月 9 日までにデータベースをアップグレードしていない場合、RDS は、2021 年 2 月 9 日 00:00:01 UTC (2021 年 2 月 9 日 09:00:01 JST) から 2021 年 3 月 9 日 00:00:01 UTC (2021 年 3 月 9 日 09:00:01 JST) の間に、スケジュールされたメンテナンスウィンドウ内で MySQL 5.5 のデータベースをバージョン 5.7 にアップグレードします。2021 年 3 月 9 日 00:00:01 UTC (2021 年 3 月 9 日 09:00:01 JST) の時点で、残りのすべての Amazon RDS for MySQL 5.5 インスタンスは、メンテナンスウィンドウ中であるかどうかに問わず、バージョン 5.7 にアップグレードされます。

またか。
検証環境を作成してMySQL5.7での動作に問題がないことは確認できたが、Upgrade作業の間のサービス断をできるだけ短くしたい。

【初期測定】

AWSを利用し始めた最初期の頃のサービス群が対象となるが、運用期間も長くデータも大量で、試しにシーケンシャルにUpgradeを実行したところ(MySQLは一気に5.5→5.7とは出来ず、5.5→5.6、5.6→5.7と1段階ずつUpgradeが必要だった)、本番RDSをクローンした環境で

  • MySQL5.5→5.6で3時間
  • MySQL5.6→5.7で30分

かかった。

【解決策】

4時間弱のサービス停止は厳しいな……と思っていたところ、まとめにも記載した素敵な手順書が。これだ!
aws.amazon.com

RDSのリードレプリカを用いて、

MySQL5.5(親)→MySQL5.6(子)→MySQL5.7(孫)

の様な多段レプリケーションを構成し、レプリケーションが出来たらメンテインして親の更新を止め、孫をマスタに昇格する、といった内容。この手順を使った結果、サービス停止は20分でUpgradeが完了した。(あまり焦ると親→孫間のレプリケーションラグがありうるので確認は慎重に!)

【多段レプリケーション作成】

1)親(hoge-db)のリードレプリカ(子リードレプリカ:hoge-rr)を作成
2)子リードレプリカ(hoge-db-rr)が作成できたら、そのリードレプリカをUpgradeする(MySQL5.5→5.6)
3)子リードレプリカ(hoge-db-rr)がUpgradeできたら、hoge-db-rrに対してさらにリードレプリカ(孫リードレプリカ:hoge-db-rr-rr)を作成する
4)孫リードレプリカ:hoge-db-rr-rrが作成できたら、そのリードレプリカをUpgradeする(MySQL5.6→5.7)

世代 備考
DB名 hoge-db hoge-db-rr hoge-db-rr-rr
エンジンバージョン 5.5.57 5.5.57→5.6.49 5.6.49→5.7.31
Multi-AZ あり なし あり ★親がMylti-AZの場合は孫のRRをMulti-AZにしておくこと
オプショングループ default:mysql-5-5 og-hoge-db-mysql5-6 og-hoge-db-mysql5-7 ★オプショングループは事前に用意
パラメータグループ pg-hoge-db-mysql5-5 pg-hoge-db-mysql5-6 pg-hoge-db-mysql5-7 ★ パラメータグループは事前に用意
バックアップ保持期間 なし 5.6にUpgrade後「1日間」に変更 1日間 ★子のバックアップ保持期間を1日以上にして有効にすると孫RRが作成可能

備考の★印が今回ハマったところ。参考になれば。。
– 親がMulti-AZの場合は孫のRRをMulti-AZにしておくことで昇格後のMulti-AZ構成変換しないですむようにする
– 参考にした手順では「 ※ リードレプリカインスタンスを作成するためには、自動バックアップを有効化する必要有り」とありましたが、より具体的には子のバックアップ保持期間を1日以上にして有効にすることで孫RRが作成可能でした。

【反映作業】

1)サービスメンテイン
  • ALB等でWebUIの流入停止
  • cronバッチ、サービス等DBのupsertがあるものを停止
2)マスタRDSのリネーム

hoge-db→hoge-db-org
[すぐに適用]
→エンドポイント名が変わるので、サービスはDBに接続できなくなるが、JavaなどDNSキャッシュするものもあるためプロセスの停止とレプリケーション状態を確認する

3)レプリケーション状態確認

※ここで焦らず5分ほどかけてレプリケーション漏れがないことを確認する。
■親

mysql> show processlist;
+----+--------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
| Id | User         | Host                | db   | Command     | Time | State                                                                 | Info             |
+----+--------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
|  x | rdsrepladmin | xx.xx.xx.xx:xxxx    | NULL | Binlog Dump |  396 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL             |
|  x | rdsadmin     | localhost:xxxxx     | NULL | Sleep       |    5 |                                                                       | NULL             |
|  x | root         | xx.xx.xx.xx;xxxx    | NULL | Query       |    0 | NULL                                                                  | show processlist |
+----+--------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
# 「Master has sent all binlog to slave;」が出ていることを確認
# ほかにプロセスが走っていないことを確認

SHOW MASTER STATUS;
+----------------------------+----------+--------------+------------------+
| File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------------+----------+--------------+------------------+
| mysql-bin-changelog.315036 |      107 |              |                  |
+----------------------------+----------+--------------+------------------+

■子

mysql> show processlist;
+------+--------------+---------------------+------+-------------+------+-----------------------------------------------------------------------------+------------------+
| Id   | User         | Host                | db   | Command     | Time | State                                                                       | Info             |
+------+--------------+---------------------+------+-------------+------+-----------------------------------------------------------------------------+------------------+
| xxxx| rdsadmin     | localhost:xxxxx     | NULL | Sleep       |    8 |                                                                             | NULL             |
| xxxx| system user  |                     | NULL | Connect     |  677 | Waiting for master to send event                                            | NULL             |
| xxxx| system user  |                     | NULL | Connect     |  241 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
| xxxx| rdsrepladmin | xx.xx.xx.xx:xxxx    | NULL | Binlog Dump |   18 | Master has sent all binlog to slave; waiting for binlog to be updated       | NULL             |
| xxxx| root         | xx.xx.xx.xx:xxxx    | NULL | Query       |    0 | init                                                                        | show processlist |
+------+--------------+---------------------+------+-------------+------+-----------------------------------------------------------------------------+------------------+
# Slave has read all relay log; 
# Master has sent all binlog to slave;
# が出ていることを確認

SHOW SLAVE STATUS\G
              Master_Log_File: mysql-bin-changelog.315036
          Read_Master_Log_Pos: 107
(略)
        Relay_Master_Log_File: mysql-bin-changelog.315036
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes


SHOW MASTER STATUS;
+----------------------------+----------+--------------+------------------+-------------------+
| File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-changelog.000499 |      120 |              |                  |                   |
+----------------------------+----------+--------------+------------------+-------------------+

■孫

mysql> show processlist;
+------+-------------+---------------------+------+---------+--------+--------------------------------------------------------+------------------+
| Id   | User        | Host                | db   | Command | Time   | State                                                  | Info             |
+------+-------------+---------------------+------+---------+--------+--------------------------------------------------------+------------------+
| xxxx | rdsadmin    | xx.xx.xx.xx:xxxx    | NULL | Sleep   |     13 |                                                        | NULL             |
| xxxx | system user |                     | NULL | Connect | 395926 | Waiting for master to send event                       | NULL             |
| xxxx | system user |                     | NULL | Connect |     29 | Slave has read all relay log; waiting for more updates | NULL             |
| xxxx| root        | xx.xx.xx.xx:xxxx    | NULL | Query   |      0 | starting                                               | show processlist |
+------+-------------+---------------------+------+---------+--------+--------------------------------------------------------+------------------+
# Slave has read all relay log; 
# が出ていることを確認

SHOW SLAVE STATUS\G
              Master_Log_File: mysql-bin-changelog.000499
          Read_Master_Log_Pos: 120
(略)

        Relay_Master_Log_File: mysql-bin-changelog.000499
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
4)孫RR昇格

[アクション]-昇格
設定はデフォルトのままで昇格を実施

5)孫RRリネーム

hoge-db-rr-rr→hoge-db
[すぐに適用]

6)メンテアウト
7)MySQLクライアントのUpgrade

必要に応じてMySQLクライアントをUpgradeしておいてください
(クライアントが5.5のままだとMySQLDumpができなくなる)

【感想】

今後MySQL5.6も強制Upgrade対象となる可能性大なので、RRを使ったUpgradeをやっていきたい。記事を作成してくれたAWSのなかの人ありがとうございました。