Amazon Aurora MySQL v1(5.6 互換)→ v3(8.0 互換)移行を計画する(8)動作確認
これは
の続きです。
パラメータグループやアプリケーション・コード(SQL 文)を修正後、実際の環境で確認します。
確認内容
主に、
- a. 移行前後で動作が変わらないこと
- b. 移行後に性能が低下しないこと
を確認します。
また、移行作業にレプリケーション(DMS の CDC)を使う場合は、動作確認後に
- c. レプリケーションのテスト
も行います。
確認環境構築のポイント
1. 実際の移行方法や移行パスを意識する
確認環境構築時には、
- スナップショット復元(v1 → v2、v2 → v3)
- インプレースアップグレード(v1 → v2)+スナップショット復元(v2 → v3)
- テーブル設計(インデックス等を含む)のダンプ&リストア+ DMS によるデータ移行+ユーザ権限移行
-
MySQL Shell の
dumpInstance()
&loadDump()
(またはその他のテーブルダンプ・リストアツール)+ユーザ権限移行
など、実際の移行作業で使う方法や移行パスを意識して進めるのが望ましいです。
a.(動作の変化がないか確認)では必ずしも実容量を意識してテストデータを用意する必要はありませんが、移行の方法やパスを合わせておくことで、早い段階で作業上の問題点を顕在化させることができます。
私が関わっているサービスの場合、以下のような問題点とその原因、および対処法を見つけることができました。
なお、b.(性能テスト)ではできるだけ実容量を意識してテストデータを用意します。
2. 実際の構成を意識する
a. では必ずしも実環境と同じサイズと個数のインスタンスを用意する必要はありませんが(アプリケーションコードがインスタンスサイズや個数に依存している場合を除いて)、Reader インスタンスを使用する構成であれば必ず Reader インスタンスを用意します。
これは、以前の記事に示したとおり、 テンポラリテーブルの仕様変更 などの影響が生じないか確認するのが目的です。
またその際、実際の AZ 構成を意識してインスタンスを配置します。
b. では実環境と同じサイズと個数のインスタンスを用意します。
3. 移行前後で比較可能にする
a.・b. いずれも、移行前後の比較が可能なように、同じデータをもとに同じ構成の環境を Aurora MySQL v1 と v3 のそれぞれについて用意し、動作や性能を直接比較できるようにするのが望ましいです。
経験上、システム移行でアプリケーションの既存バグを見つけることが多いのですが、比較対象の環境を用意しているとそれが既存バグか動作の非互換かを判別しやすいです(後者の場合は同様の実装を行っている箇所の動作確認をすべき)。
性能テストの際も同じデータに対して同じ負荷を掛けることで、移行後に性能低下するかどうかを判別しやすいです。
4. 一通り動作確認を完了したら差分レプリケーション(DMS の CDC)をテストする
binlog による v1 → v3 差分レプリケーションは(v1 → v2 → v3 の多段レプリケーションを含め)非推奨です。
そのため、差分レプリケーションを使ってメンテナンス停止時間の短縮をはかる場合は次のような流れで DMS の CDC を使用することになります。
- あるタイミングのクローン&スナップショットから v3 クラスタを作成
- v1 クラスタから v3 クラスタに差分データのレプリケーションを開始
- 移行当日になったらサービスを一時停止し、Web サーバ等からの接続を v3 クラスタに切り替え
- 動作確認を行い、問題がなければサービスを再開
- 図 1 :DMS レプリケーション(CDC)を使う移行の構成例・移行準備段階(1. 〜 2.)
- 図 2 :DMS レプリケーション(CDC)を使う移行の構成例・移行直後(3. 〜 4.)
DMS(CDC)によるレプリケーションにもいくつかの制約事項があるため、アプリケーションの動作確認後、移行パスを正式に決める前にレプリケーションに支障がないかを必ず確認しておきます。
何らかの問題点が見つかった場合はそれを修正するか、別の方法での移行を検討します。
例えば、以下のような問題が見つかる可能性があります。
time
型の列が移行されないfloat
型の列が移行されない
それぞれ、テーブルマッピングの変換ルールで該当列の型変換を指定します。
-
time
型(扱う値の範囲が 24 時間以内の場合)- MySQL の
time
型は DMS ではstring
型として扱われるのでtime
型に変換する
- MySQL の
-
float
型(精度の指定がない場合)- DMS の
real4
型に変換する
- DMS の
また、
blob
型の列の更新が無視される
ケースでは、
- タスク設定で完全 LOB モードを指定しているか?
- アプリケーションで
blob
型単独でUPDATE
処理をしている箇所がないか?
を確認し、問題があれば修正します。
2022/10/28 追記:
実際の移行作業が終了したのでまとめました。
Discussion