MySQLの小規模なRDSインスタンスを本番システムの一部として使用しており、IOPSが提供された中規模のインスタンスにアップグレードしたいと考えています。
昔ながらのDBAとして、「スレーブの追加、マスターへの昇格、クライアントの切り替え」方法について知っていますが、AWSは、ワンクリックで魔法のアップグレードパスを提供することを約束します。
テストRDSインスタンスでこれを試したところ、ダウンタイムが長すぎる、IMHO:小規模から中規模のアップグレードでは約5分、提供されたIOPSへの切り替えでは30分(!!!)。
RDSでインスタンスをアップグレードするということは、RDSがデータベースを新しいインスタンスに物理的に移行することを意味します。おそらく別の物理ホスト上にあるため、ダウンタイムは避けられません。プロビジョニングされたIOPSへの移行は、データが新しいEBSボリュームに移行されることを意味します(この変更により、プロビジョニングされたIOPSでEBSボリュームにアクセスできるマシンが内部にあるかどうかに応じて、サーバーも新しいインスタンスに移行される可能性があります物理的に隔離されていないマシンから分離されているため、別のクラスのネットワークハードウェア上に存在する可能性があるため、ダウンタイムは避けられません。
この混乱を回避する方法があるようです。マルチAZ配置では、リージョン内の別のアベイラビリティーゾーンに非表示でアクセスできない(ユーザーには)レプリカが作成されます。
OSパッチやDBインスタンスのスケーリングなどのシステムアップグレードの場合、これらの操作は、自動フェイルオーバーの前に、スタンバイで最初に適用されます。その結果、可用性への影響は、自動フェイルオーバーが完了するのに必要な時間のみに制限されます。
これはすべきです迅速かつシームレスな移行パスを提供しますが、私はこの機能をテストする機会がありませんでした。コンソールの「変更」は、インスタンスをマルチAZに変換できるように見えます。おそらく、これによりインスタンスのクローンが作成されるときにI/Oが短時間フリーズするため、この機能を試す前にすべての機能をテストすることをお勧めします。
または、RDSは、「スレーブの追加、マスターへの昇格、クライアントの切り替え」操作をエミュレートできる内部メカニズムをサポートしています。これにより、ダウンタイムに近い変換を実現できます。
http://aws.Amazon.com/about-aws/whats-new/2012/10/11/Amazon-rds-mysql-rr-promotion/
マルチAZ環境でも、 60-120秒の停止が発生します。 これは、アップグレードの実行中にRDSインスタンスに繰り返しアクセスした場合です。 PostgreSQL db.m3.mediumからdb.m3.largeへ。
アップグレード中のダウンタイムを回避することも可能です。これを行う方法は、リードレプリカスナップショットから新しいRDSを短時間起動し、アクティブ/アクティブマスターからマスターへのレプリケーションとして構成することです。構成が完了すると、ダウンタイムなしで、アプリケーショントラフィックを一度に1つのAPPサーバーに切り替えることができます。 AWSはRDSメンテナンスを発表するたびにこのアプローチを使用して、予定されたメンテナンス中だけでなく、ダウンタイムを回避します。
https://workmarket.tech/zero-downtime-maintenances-on-mysql-rds-ba13b51103c2
M1-オリジナルマスター
R1-M1のリードレプリカ
SNAP1-R1のスナップショット
M2-新しいマスター
M2作成シーケンス:M1 → R1 → SNAP1 → M2
RDSではSUPER権限を使用できないため、M1で— master_data2
オプションを指定したmysqldumpを使用しません。代わりに、R1を起動してM1のバイナリログ位置を取得します。次に、R1からスナップショット(SNAP1)を作成し、SNAP1からM2を起動します。
PK競合を回避するには、次のオフセットで2つの個別のRDSパラメータグループを作成します。
M1: auto_increment_ increment = 4 and auto_increment_offset = 1
M2: auto_increment_ increment = 4 and auto_increment_offset = 2
M1にレプリケーションユーザーを作成する
GRANT EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘repl’@’%’ IDENTIFIED BY PASSWORD <secret>;
1。 M1からR1を作成
-- Connect to the R1 and stop replication
CALL mysql.rds_stop_replication;
-- Obtain M1’s (!!) current binlog file and position
`mysql> show slave status\G
Master_Log_File: mysql-bin.000622
Exec_Master_Log_Pos: 9135555
2。 R1からSNAP1を作成する
M1から取得した属性を使用して、SNAP1からM2を作成します。
M1からのauto_increment_オフセットが異なるM2にパラメーターグループを割り当てて、M/Mレプリケーションキーの競合を回避します。
4。 M/Mレプリケーションのセットアップ
-- Configure M2 as a slave of M1
CALL mysql.rds_set_external_master ('m1.xyxy24.us-east-1.rds.amazonaws.com', 3306, 'repl', 'mypassword', 'mysql-bin.000622', 9135555, 0);
CALL mysql.rds_start_replication;
-- Connect to M2 and obtain its current binlog file and position
mysql> show master status\G
File: mysql-bin.004444
Position: 6666622
-- Connect to M1 and configure it to be a slave of the M2
CALL mysql.rds_set_external_master ('m2.xyxy24.us-east-1.rds.amazonaws.com', 3306 , 'repl', 'mypassword', 'mysql-bin.004444', 6666622, 0);
CALL mysql.rds_start_replication;
5。 R1とSNAP1は不要になったため削除します
6。 AWSコンソール経由でM2をアップグレード
標準の手順を使用して、必要に応じてインスタンスを変更します。
- 7。 M2への正常なスイッチオーバーを実行する
M/Mレプリケーションが正常にセットアップされたので、アプリサーバーを1つずつ正常に切り替えることで、ダウンタイムなしでDBメンテナンスを続行する準備ができました。
これがどのように機能するかについての詳細は次のとおりです。
https://workmarket.tech/zero-downtime-maintenances-on-mysql-rds-ba13b51103c2
これは機能しますが、RDSインスタンスのエンドポイントがアプリケーションで静的エントリとして構成されていないことを確認する必要があります。 RDSを交換すると、エンドポイントが変更されます。