2024.11.14
いまさらNode.jsを知ろう~環境構築も~
2021.01.28
DB【AWS】RDSの多段レプリケーションによるUpgrade実施
JTです。
AWSの(RDS)MySQL5.5→5.7への強制Upgrade予告に対応するため、リードレプリカによる多段レプリケーションを組んだところ、シーケンシャルに行うと4時間弱のサービス停止が20分程度に抑えられたので手順を残しておきます。
AWS公式の案内は以下を参照のこと
Amazon RDS for MySQLでMySQLエンジンバージョンを5.5から5.7へアップグレードする方法
2020年の秋、AWSから以下の様なメールが届いた
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時間弱のサービス停止は厳しいな……と思っていたところ、最初に記載した素敵な手順書が。
Amazon RDS for MySQLでMySQLエンジンバージョンを5.5から5.7へアップグレードする方法
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)
【3世代イメージ】
世代 | 親 | 子 | 孫 |
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 |
サイズ | db.t3.medium | db.t3.medium | db.t3.medium |
ストレージ | SSD300GiB | SSD300GiB | SSD300GiB |
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日間 |
※備考の★印が今回ハマったところ。
– 親がMulti-AZの場合は孫のRRをMulti-AZにしておくことで昇格後のMulti-AZ構成変換しないですむようにする
– 参考にした手順では「 ※ リードレプリカインスタンスを作成するためには、自動バックアップを有効化する必要有り」とありましたが、より具体的には子のバックアップ保持期間を1日以上にして有効にすることで孫RRが作成可能でした。
参考になれば。
– ALB等でWebUIの流入停止
– cronバッチ、サービス等DBのupsertがあるものを停止
hoge-db→hoge-db-org
[すぐに適用]
→エンドポイント名が変わるので、サービスはDBに接続できなくなるが、JavaなどDNSキャッシュするものもあるため以下の手順でプロセスの停止とレプリケーション状態を確認する
※ここで焦らずレプリケーション漏れがないことを確認する。
■親
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
[アクション]-昇格
設定はデフォルトのままで昇格を実施
hoge-db-rr-rr→hoge-db
[すぐに適用]
必要に応じてMySQLクライアントをUpgradeしておいてください
(クライアントが5.5のままだとMySQLDumpができなくなる)
今後MySQL5.6も強制Upgrade対象となる可能性大なので、RRを使ったUpgradeをやっていきたいですね!
【記事への感想募集中!】
記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!【テクノデジタルではエンジニア/デザイナーを積極採用中です!】
下記項目に1つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索