Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Aurora MySQL の お手製 メジャーバージョンアップ

ottan
May 25, 2020

Aurora MySQL の お手製 メジャーバージョンアップ

Aurora MySQL は現時点でインプレイスでのメジャーバージョンアップ機能は提供されていません。
また、どうしてもダウンタイムを最小化しオンラインで切替を行いたいケースがあります。
これはAWSの提供する機能の隙間をぬってオンラインでメジャーバージョンアップを行ったときの軌跡…

ottan

May 25, 2020
Tweet

More Decks by ottan

Other Decks in Technology

Transcript

  1. なんでそんなことやっちゃったのか?(2 MySQL 5.7 ベースになってうれしいこと!
 • サブクエリーの高速化
 ◦ Writerを再起動に追い込むクソ味深クエリー対策!
 • JSON型で幸せに?


    ◦ index まわりなどで制約が…
 ◦ 切替時の導入は見送り
 • パフォーマンスインサイト使いたい!
 ◦ 5.6 系でも使えるけどバージョン古すぎて…
 
 

  2. メジャーバージョンアップ方法(1 • AWS DMS でアップグレード
 ◦ 空の ver. 2系を用意すると
 DMS

    がよろしくデータを移してくれる!
 ◦ データ単体の移行はちょっ速!
 ◦ 中継させて柔軟なデータの変換ができる!
 ◦ index や auto_incriment は持っていってくれない…
 Aurora MySQL 1.x Aurora MySQL 2.x AWS Database Migration Service Replication Replication
  3. オンライン切替方法(1 • 参照先 endpoint の変更方法
 ◦ コード上で変更
 デプロイやタイマーによる切替
 
 ◦

    CNAMEで変更
 コード上では endpoint の CNAME を参照させ、
 CNAMEのレコード変更することで切替
 

  4. オンライン切替方法(2 • 切替の瞬間の新旧重複アクセスから整合性を担保
 ◦ 新クラスターの auto_incriment を上げて切替
 
 Old Cluster

    New Cluster Replication AUTO_INCREMENT=1000 id=1000 id=1001 … AUTO_INCREMENT=1100 id=1100 id=1101 … Application Write
  5. 今回のバージョンアップ・切替方法 • バージョンまたぎのレストアでアップグレード
 ⇒DMSだと index, auto_increment の再生成が大変…
 
 • CNAME

    で参照先 endpoint の変更
 ⇒タイマー切替や短時間でのデプロイの仕組みない…
 
 • 旧クラスターへの書き込みを禁止して整合性を担保
 ⇒primary key に auto_increment を使ってないテーブルが…

  6. はまりどころ(1 • Aurora では slave_type_conversions は非サポート
 ◦ binlog_format を statement

    形式にしてなんとか…
 
 • レストアやバージョンアップには細かいバージョンの指定あり!
 ◦ aws rds describe-db-engine-versions の ValidUpgradeTarget
 ◦ 対象バージョンのリリースノート
 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Updates.2046.html 
 
 • LTS はドキュメントで確認可能。
 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Updates.html#AuroraMySQL.U pdates.LTS 
 
 

  7. はまりどころ 2 • レプリケーションのためには binlog を有効化が必要
 ◦ Aurora では binlog

    の副作用あるので期間を最小化
 ▪ 障害復旧時のリカバリに時間かかる
 ▪ パフォーマンスへの影響
 
 • ALTER かける前に対象テーブルの INDEX は DROP しといたほうが 速い
 (終わったら INDEX 再生成)

  8. 今回やったバージョンアップ・切替手順 1. 旧DBで statement 形式で binlog 有効化
 2. 旧DBでクラスタースナップショットとる (5.6.10a)


    3. 中間DBをスナップショットから作成 (1.19.5)
 4. 中間DBをマイナーバージョンアップ (1.20.0)
 5. 中間DBでクラスタースナップショットとる (1.20.0)
 6. 新DBをスナップショットから作成 (2.04.6)
 7. 新DBでALTERかける
 8. 新旧DB間でレプリケーションはる
 9. 旧DBへのアクセスを REVOKE で遮断
 10. CNAME 変更して参照先 endpoint 切替
 11. 新DBでのみ GRANT してアクセス再開
 12. 新旧DB間のレプリケーションを停止