😀

AWS RDS for MySQL5.5 => 5.6 アップグレード手順 (CLI) (2017年検証)

2022/11/28に公開

AWSから5.5の古いバージョンアップデートするよー。って通知がきたので
手動アップグレードをすることに。

ググッてみたけども、RDSって枯れてるからか、古い情報しかないんですよね。
そこでメモがてらに手順を記載します。

やること

  • 本番稼働しているRDS MySQL 5.5.40b を MySQL 5.6.29にアップグレードする
    • (注意!!)ダウンタイムが数分発生します
  • エンドポイントはそのままでアプリケーション側等の変更は行わない

環境

  • MacOSX ElCapitan (HostOS)
    • 10.11.6

事前準備に必要なもの

  • AWS CLI
    • 入っていない人は何も考えずに pip install awscli と打とう。

参考にしたサイト

全体の流れ

全ての手順を AWS CLI で実行しています。

  • アップグレードしたいRDSインスタンス(Masterインスタンス)にリードレプリカを作成する
  • リードレプリカを作成したら、リードレプリカ側のMySQLをバージョンアップする
  • リードレプリカのインスタンスをマスター昇格させる
    • 厳密にはリード専用ではなく、独立したインスタンスにさせる
    • この時点でマスターインスタンス側がデータが更新されるとデータ不整合が発生します。
  • マスターインスタンスとマスター昇格させたリードレプリカインスタンスのエンドポイントを切り替える。
    • この切り替えの期間がダウンタイム発生時間です。

手順

以下ここから全体の流れの詳細。
作業はHostOS(Mac)から作業しています。

バージョンアップしたいRDSインスタンスの確認

マスターインスタンス名を変数にエクスポート

MASTER_INSTANCE='{DBインスタンス名}'

変数の確認

cat << ETX

        MASTER_INSTANCE ${MASTER_INSTANCE}
        
ETX

マスターインスタンスの確認

aws rds describe-db-instances --db-instance-identifier ${MASTER_INSTANCE}

マスターインスタンスのMySQLバージョンの確認

aws rds describe-db-instances --db-instance-identifier ${MASTER_INSTANCE} --query 'DBInstances[].EngineVersion' --output text

レスポンス

5.5.40b

マスターインスタンスのリードレプリカを作成

  • 今回は同一AvailabilityZoneに作成しています。
  • AvailabilityZoneの指定をしない場合違うAvailabilityZoneに作成されてしまう可能性がありますので、用途に応じて実行してください。

アップグレードインスタンス名を変数にエクスポート

UPGRADE_INSTANCE='{DBインスタンス名}'

変数の確認

cat << ETX

        UPGRADE_INSTANCE ${UPGRADE_INSTANCE}
        
ETX

マスターインスタンス側のAvailabilityZoneを確認

AZ=$(aws rds describe-db-instances --db-instance-identifier ${MASTER_INSTANCE} --query 'DBInstances[].AvailabilityZone' --output text)

変数の確認

cat << ETX

        AZ ${AZ}
        
ETX

リードレプリカを作成する。

実行後、マスターインスタンス側にリードレプリカの設定が走るので多少の負荷がかかります。

リードレプリカの作成に数分かかります。

aws rds create-db-instance-read-replica \
    --db-instance-identifier ${UPGRADE_INSTANCE} \
    --source-db-instance-identifier ${MASTER_INSTANCE} \
    --availability-zone ${AZ}

マスターインスタンス側にリードレプリカが設定されていることの確認

aws rds describe-db-instances --db-instance-identifier ${MASTER_INSTANCE} --query 'DBInstances[].ReadReplicaDBInstanceIdentifiers' --output text

レスポンスが作成したリードレプリカと一致していることを確認

cat << ETX

        `aws rds describe-db-instances --db-instance-identifier ${MASTER_INSTANCE} --query 'DBInstances[].ReadReplicaDBInstanceIdentifiers' --output text` == ${UPGRADE_INSTANCE}
        
ETX

レスポンス

        {マスター側リードレプリカ設定DBインスタンス名} == {アップグレードDBインスタンス名}

スレーブの同期状態の確認

  • マスターインスタンスに接続できるEC2インスタンスから一旦mysqlコマンドで接続します。
  • Seconds_Behind_Master はスレーブ遅延の秒数です。 0であればスレーブ遅延していません。
mysql -h {アップグレードインスタンスのエンドポイント} -u {ユーザー名} -p --auto-rehash

スレーブのステータスを確認

> SHOW SLAVE STATUS\G

Seconds_Behind_Master: 0 となっていることを確認してください。なっていない場合スレーブ遅延が発生しています。

リードレプリカインスタンス用のパラメーターグループの作成

マスターインスタンスのパラメーターグループファミリーがmysql5.5の為別途パラメーターグループを設定する必要があります。

パラメーターグループを作成しなくてもよい場合は default.mysql5.6 を使用してください。
ただしデフォルトパラメーターグループだとMySQL側の細かな設定を変更できないのでおすすめはしません。

パラメーターグループ名を変数にエクスポート

PARAMETER_GROUP='{任意の名前}'

変数の確認

cat << ETX

        PARAMETER_GROUP ${PARAMETER_GROUP}

ETX

パラメーターグループの作成

aws rds create-db-parameter-group \
    --db-parameter-group-name ${PARAMETER_GROUP} \
    --db-parameter-group-family 'mysql5.6' \
    --description 'mysql5.6 parameter group'

パラメーターグループの確認

aws rds describe-db-parameter-groups \
    --db-parameter-group-name ${PARAMETER_GROUP}

リードレプリカインスタンス側のMySQLバージョンアップ

  • リードレプリカインスタンスのStatusが available になってから作業してください

リードレプリカインスタンスの状態確認

aws rds describe-db-instances --db-instance-identifier ${UPGRADE_INSTANCE}

MySQLのバージョン確認

cat << ETX

        `aws rds describe-db-instances --db-instance-identifier ${MASTER_INSTANCE} --query 'DBInstances[].EngineVersion' --output text` == `aws rds describe-db-instances --db-instance-identifier ${UPGRADE_INSTANCE} --query 'DBInstances[].EngineVersion' --output text`
        
ETX

レスポンス

        5.5.40b == 5.5.40b

リードレプリカのバージョンアップ

  • --apply-immediately を指定しないと即時反映されません。
  • アップグレードに数分かかります
aws rds modify-db-instance \
  --db-instance-identifier ${UPGRADE_INSTANCE}  \
  --apply-immediately \
  --allow-major-version-upgrade \
  --db-parameter-group-name ${PARAMETER_GROUP} \
  --option-group-name 'default:mysql-5-6' \
  --engine-version 5.6.29

リードレプリカのマスター昇格

コレを実行した時点でマスターインスタンスからのデータ同期は解除されますのでこれ以降の作業は
速やかにやりましょう

 aws rds promote-read-replica \
  --db-instance-identifier ${UPGRADE_INSTANCE} \

リードレプリカインスタンスからリードオンリーのフラグが外れていることの確認

aws rds describe-db-instances \
    --db-instance-identifier ${UPGRADE_INSTANCE} \
    --query 'DBInstances[].StatusInfos' \
    --output text

上記パラメーターで replicating read replication の設定がなくなっていたらOK

マスターインスタンスのエンドポイントの変更

マスターインスタンス側のエンドポイントを先に剥がさないとリードレプリカインスタンスにエンドポイントを付け替えできません。

確認

cat << ETX

       MASTER_INSTANCE ${MASTER_INSTANCE}

ETX

エンドポイントの切り替え

  • 実行後rebootが走ります。
aws rds modify-db-instance \
    --db-instance-identifier ${MASTER_INSTANCE} \
    --new-db-instance-identifier "${MASTER_INSTANCE}-cold-standby" \
    --apply-immediately

リードレプリカインスタンスのエンドポイントの変更

確認

cat << ETX

       UPGRADE_INSTANCE ${UPGRADE_INSTANCE}

ETX
  • 実行後rebootが走ります。
aws rds modify-db-instance \
    --db-instance-identifier ${UPGRADE_INSTANCE} \
    --new-db-instance-identifier "${MASTER_INSTANCE}" \
    --apply-immediately

補足 バージョンアップ失敗時のロールバック手順

何かしらの原因でバージョンアップで動作不調の場合は下記の方法にてロールバックを行います。

  • 切り替え後すぐの動作不調の場合の方法になります
  • 時間がしばらく経過の場合はsnapshotからの復元のほうがいいかと思います

アップグレードしたインスタンスをコールドスタンバイに変更

aws rds modify-db-instance \
    --db-instance-identifier ${UPGRADE_INSTANCE} \
    --new-db-instance-identifier "${UPGRADE_INSTANCE}-cold-stanby" \
    --apply-immediately

元のインスタンスのエンドポイントを変更

aws rds modify-db-instance \
    --db-instance-identifier "${MASTER_INSTANCE}-cold-stanby" \
    --new-db-instance-identifier "${MASTER_INSTANCE}" \
    --apply-immediately

最後に

以上でMySQL 5.5 => 5.6のアップグレード手順になります。
公式のドキュメントで記載していますが、5.6 => 5.7 も同様の手順でできるとは書いてあります。

Discussion