Chapter 09

動作検証・性能検証

hmatsu47
hmatsu47
2022.08.15に更新

この章について

パラメータグループやアプリケーション・コード修正後の検証について記します。

検証内容

  • a. 動作に不具合がないか(移行前後で動作が変わらないか)
  • b. 性能が低下しないか

を検証します。

また、移行作業にレプリケーション(DMS の CDC)を使う場合は、検証後に

  • c. レプリケーションのテスト

も行います。

検証環境構築のポイント

実際の移行方法を意識する

検証環境構築は、

  • スナップショット復元(v1 → v2、v2 → v3)
  • インプレースアップグレード(v1 → v2)+スナップショット復元(v2 → v3)

のように、実際の移行作業で使う方法を意識して進めるのが望ましいです。

a.(不具合の有無の検証)では必ずしも実容量を意識してテストデータを用意する必要はありませんが、移行の方法やパスを合わせておくことで、早い段階で作業上の問題点を顕在化させることができます。

私が関わっているサービスの場合、以下のような問題点とその原因、および対処法を見つけることができました。

なお、b.(性能検証)ではできるだけ実容量を意識してテストデータを用意します。

実際の構成を意識する

a. では必ずしも実環境と同じサイズと個数のインスタンスを用意する必要はありませんが(アプリケーションコードがインスタンスサイズや個数に依存している場合を除いて)、Reader インスタンスを使用する構成であれば必ず Reader インスタンスを用意します。

これは、Chapter 05・08 に示したとおり、 内部テンポラリテーブルの仕様変更テンポラリテーブルの仕様変更 などの影響が生じないか確認するのが目的です。

またその際、実際の AZ 構成を意識してインスタンスを配置します。

b. では実環境と同じサイズと個数のインスタンスを用意します。

移行前後で比較可能にする

a.・b. いずれも、移行前後の比較が可能なように、同じデータをもとに同じ構成の環境を v1 と v3 のそれぞれについて用意し、動作や性能を直接比較できるようにするのが望ましいです。

経験上、システム移行でアプリケーションの既存バグを見つけることが多いのですが、比較対象の環境を用意しているとそれが既存バグか動作の非互換かを判別しやすいです(後者の場合は同様の実装を行っている箇所の動作確認をすべき)。

性能検証の際も同じデータに対して同じ負荷を掛けることで、移行後に性能低下するかどうかを判別しやすいです。

性能低下の例:

動作検証を完了したら DMS レプリケーション(CDC)をテストする

Chapter 07 で紹介しましたが、移行時のサービス停止時間を短縮するために以下のような手順で移行する方法があります(Blue/Green デプロイ)。

  1. あるタイミングのクローン&スナップショットから v3 クラスタを作成
  2. v1 クラスタから v3 クラスタに差分データのレプリケーションを開始
  3. 移行当日になったらサービスを一時停止し、Web サーバ等からの接続を v3 クラスタに切り替え
  4. 動作確認を行い、問題がなければサービスを再開

DMS レプリケーション(CDC)を使う場合、次の図のようなイメージになります。

  • 図 1 :DMS レプリケーション(CDC)を使う移行の構成例・移行準備段階(1. 〜 2.)

  • 図 2 :DMS レプリケーション(CDC)を使う移行の構成例・移行直後(3. 〜 4.)

このように、DMS レプリケーション(CDC)を使ってメンテナンス停止時間の短縮をはかる場合は、アプリケーションの動作検証後、移行ステップを進める前にレプリケーションに支障がないかを必ず確認しておきます。

何らかの問題点が見つかった場合はそれを修正するか、別の方法での移行を検討します。

例えば、以下のような問題が見つかる可能性があります。

  • time型の列が移行されない
  • float型の列が移行されない

それぞれ、テーブルマッピングの変換ルールで該当列の型変換を指定します。

  • time型(扱う値の範囲が 24 時間以内の場合)
    • MySQL のtime型は DMS ではstring型として扱われるのでtime型に変換する
  • float型(精度の指定がない場合)
    • DMS のreal4型に変換する

また、

  • blob型の列の更新が無視される

ケースでは、

  • タスク設定で完全 LOB モードを指定しているか?
  • アプリケーションでblob型単独でUPDATE処理をしている箇所がないか?

を確認し、問題があれば修正します。