【まとめ】
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昇格
[アクション]-昇格
設定はデフォルトのままで昇格を実施
6)メンテアウト
【感想】
今後MySQL5.6も強制Upgrade対象となる可能性大なので、RRを使ったUpgradeをやっていきたい。記事を作成してくれたAWSのなかの人ありがとうございました。