CloudSQLのMySQLインスタンスをレガシー高可用性構成から新しい高可用性構成にアップグレードする

はじめに

私のサービスではデータベースにMySQLを使用しており、CloudSQLで運用しています。CloudSQLには障害時に素早く復旧するために高可用性構成という機能を提供しています。現在はレガシー高可用性構成という古い構成で運用していますが、2021第1四半期からレガシー構成が使用できなくなるようなので、新しい高可用性構成に移行してみようと思います。また、私のサービスではインフラのリソース管理にTerraformを利用しています。そのため、一連の作業はTerraformで行います。

レガシー構成から新しい高可用性構成へ移行する

移行手順はドキュメントに記載してあります。今回はそれに則って移行作業を行います。

  1. フェイルオーバー レプリカの削除
  2. 新しい高可用性を使用するように変更
  3. フェイルオーバー機能のテスト

フェイルオーバーレプリカの削除

レガシー構成ではフェイルオーバーレプリカインスタンスを使用して高可用性を実現していました。新しい構成ではスタンバイインスタンスと呼ばれる、フェイルオーバーレプリカインスタンスとは別のインスタンスを利用します(下図参照)。そのため、新しい構成に移行する前に、レガシー構成で使用されていたフェイルオーバーレプリカインスタンスをTerraformで削除します。

image.png (42.9 kB)

Terraformでインスタンスを削除するときは、リソース定義を消す前に deletion_protection という削除防止フラグを無効にしておく必要があります。これをしないと、リソース定義を削除しても terraform apply で実行が失敗します。deletion_protection 無効後、リソース定義を削除すると正常にフェイルオーバーインスタンスが削除されます。

resource "google_sql_database_instance" "failover_instance" {
  name                = "failover_instance"
  region              = "asia-northeast1"
  project             = "test-project"
  database_version    = "MYSQL_5_7"
  deletion_protection = false
  ...
}

新しい高可用性の有効化

Terraformで新しい高可用性を有効化する場合、プライマリインスタンスavailability_typeREGIONALに変更します。これで、 terraform apply を実行すると新しい高可用性への移行が完了します。しかし、高可用性の移行中にダウンタイム(インスタンスの停止時間)が発生してしまいます。そのため、移行の前に影響範囲の調査と被害最小化の対策を考えておく必要があります。私のサービスではデータベースメンテナンス時間を設定し、その時間内に移行作業を行いました。

settings {
  availability_type = "REGIONAL"
}

フェイルオーバー機能のテスト

高可用性が有効にしたので、実際にフェイルオーバーされるかどうかをテストしておきましょう。フェイルオーバーのテスト方法もドキュメントに記載されています。今回は gcloud で行います。準備としてアカウントとプロジェクトを今回使用する値に変更しておきます。

$ gcloud config set project test-project
Updated property [core/project].

$ gcloud config set account test@gmail.com
Updated property [core/account].

$ gcloud config configurations list
NAME     IS_ACTIVE  ACCOUNT         PROJECT
default  True       test@gmail.com  sample-project

次に、以下のコマンドでプライマリインスタンスをフェイルオーバーさせます。

$ gcloud sql instances failover test-instance
Failover will be initiated. Existing connections to the master
instance will break and no new connection can be established during
the failover.

Do you want to continue (Y/n)?

Failing over Cloud SQL instance...done.

フェイルオーバーが完了するとGCPインスタンスページに以下のようなログが表示されているはずです。 image.png (67.0 kB)

まとめ

今回はCloudSQLの高可用性構成移行について紹介しました。GCPはドキュメントが豊富でわかりやすく、移行作業でハマることはありませんでした(Terraformの削除防止フラグで少し調査したくらい 😅)。利用しているCloudSQLインスタンスでレガシー構成を使用している方がいればぜひ新しい高可用性構成にアップグレードしてみてください 😄