Slide 1

Slide 1 text

Aurora MySQL の お手製 メジャーバージョンアップ 2020/03/28 @ottan

Slide 2

Slide 2 text

自己紹介 ● しがないインフラ|SREエンジニア
 ● 福岡出身
 ● 職歴好きなサービスは Fargate 
 
 
 @ottan

Slide 3

Slide 3 text

今回お話すること 1. なんでそんなことやっちゃったのか?
 2. Aurora MySQL のメジャーバージョンアップ
 3. バージョンアップ方法
 4. オンライン切替方法
 5. 実際の手順
 6. はまりどころ
 7. まとめ
 
 
 


Slide 4

Slide 4 text

なんでそんなことやっちゃったのか?(1 ● int 型で近い将来あふれそうなカラムが…
 ○ online alter するは厳しい…
 (数十億行、数百GB)
 ○ 長時間のメンテは不可なのでDB切替かな?
 ○ どうせならメジャーver.上げるか!
 
 


Slide 5

Slide 5 text

なんでそんなことやっちゃったのか?(2 MySQL 5.7 ベースになってうれしいこと!
 ● サブクエリーの高速化
 ○ Writerを再起動に追い込むクソ味深クエリー対策!
 ● JSON型で幸せに?
 ○ index まわりなどで制約が…
 ○ 切替時の導入は見送り
 ● パフォーマンスインサイト使いたい!
 ○ 5.6 系でも使えるけどバージョン古すぎて…
 
 


Slide 6

Slide 6 text

Aurora MySQL のメジャーバージョンアップ ● 公式からver.1系からver.2系への
 インプレイス・アップグレードは提供されてない…
 (着手した 2019/11 の時点では)
 ● もちろんオンライン・アップグレードも…
 ないなら自前でやるしか!

Slide 7

Slide 7 text

メジャーバージョンアップ方法(1 ● AWS DMS でアップグレード
 ○ 空の ver. 2系を用意すると
 DMS がよろしくデータを移してくれる!
 ○ データ単体の移行はちょっ速!
 ○ 中継させて柔軟なデータの変換ができる!
 ○ index や auto_incriment は持っていってくれない…
 Aurora MySQL 1.x Aurora MySQL 2.x AWS Database Migration Service Replication Replication

Slide 8

Slide 8 text

メジャーバージョンアップ方法(2 ● バージョンまたぎのレストアでアップグレード
 ○ 特定のver.1系のスナップショットから
 ver.2系をレストアできる!
 (リリースノートにひっそり書いてある)
 ○ Aurora では slave_type_conversions による
 型変換は非サポート…
 
 
 Aurora MySQL 1.x Aurora MySQL 2.x Replication

Slide 9

Slide 9 text

オンライン切替方法(1 ● 参照先 endpoint の変更方法
 ○ コード上で変更
 デプロイやタイマーによる切替
 
 ○ CNAMEで変更
 コード上では endpoint の CNAME を参照させ、
 CNAMEのレコード変更することで切替
 


Slide 10

Slide 10 text

オンライン切替方法(2 ● 切替の瞬間の新旧重複アクセスから整合性を担保
 ○ 新クラスターの auto_incriment を上げて切替
 
 Old Cluster New Cluster Replication AUTO_INCREMENT=1000 id=1000 id=1001 … AUTO_INCREMENT=1100 id=1100 id=1101 … Application Write

Slide 11

Slide 11 text

オンライン切替方法(3 ● 切替の瞬間の新旧重複アクセスから整合性を担保
 ○ 旧クラスターへの書き込みを禁止して切替
 
 Old Cluster New Cluster Replication Application Write REVOKE GRANT

Slide 12

Slide 12 text

今回のバージョンアップ・切替方法 ● バージョンまたぎのレストアでアップグレード
 ⇒DMSだと index, auto_increment の再生成が大変…
 
 ● CNAME で参照先 endpoint の変更
 ⇒タイマー切替や短時間でのデプロイの仕組みない…
 
 ● 旧クラスターへの書き込みを禁止して整合性を担保
 ⇒primary key に auto_increment を使ってないテーブルが…


Slide 13

Slide 13 text

はまりどころ(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 
 
 


Slide 14

Slide 14 text

はまりどころ 2 ● レプリケーションのためには binlog を有効化が必要
 ○ Aurora では binlog の副作用あるので期間を最小化
 ■ 障害復旧時のリカバリに時間かかる
 ■ パフォーマンスへの影響
 
 ● ALTER かける前に対象テーブルの INDEX は DROP しといたほうが 速い
 (終わったら INDEX 再生成)


Slide 15

Slide 15 text

今回やったバージョンアップ・切替手順 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間のレプリケーションを停止
 


Slide 16

Slide 16 text

今回やったバージョンアップ・切替手順(1 1. 旧DBで statement 形式で binlog 有効化
 
 Old Cluster (5.6.10a)

Slide 17

Slide 17 text

今回やったバージョンアップ・切替手順(2 2. 旧DBでクラスタースナップショットとる (5.6.10a)
 Old Cluster (5.6.10a) Cluster Snapshot

Slide 18

Slide 18 text

今回やったバージョンアップ・切替手順(3 3. 中間DBをスナップショットから作成 (1.19.5)
 
 Old Cluster (5.6.10a) Cluster Snapshot Mid Cluster (1.19.5)

Slide 19

Slide 19 text

今回やったバージョンアップ・切替手順(4 4. 中間DBをマイナーバージョンアップ (1.20.0)
 
 Old Cluster (5.6.10a) Mid Cluster (1.20.0)

Slide 20

Slide 20 text

今回やったバージョンアップ・切替手順(5 5. 中間DBでクラスタースナップショットとる (1.20.0)
 
 Old Cluster (5.6.10a) Cluster Snapshot Mid Cluster (1.20.0)

Slide 21

Slide 21 text

今回やったバージョンアップ・切替手順(6 6. 新DBをスナップショットから作成 (2.04.6)
 
 Old Cluster (5.6.10a) Cluster Snapshot New Cluster (2.04.6)

Slide 22

Slide 22 text

今回やったバージョンアップ・切替手順(7 7. 新DBでALTERかける
 
 Old Cluster (5.6.10a) New Cluster (2.04.6)

Slide 23

Slide 23 text

今回やったバージョンアップ・切替手順(8 8. 新旧DB間でレプリケーションはる
 
 Replication Old Cluster (5.6.10a) New Cluster (2.04.6)

Slide 24

Slide 24 text

今回やったバージョンアップ・切替手順(9 9. 旧DBへのアクセスを REVOKE で遮断
 
 Replication Old Cluster (5.6.10a) New Cluster (2.04.6) Application Write REVOKE

Slide 25

Slide 25 text

今回やったバージョンアップ・切替手順(10 10. CNAME 変更して参照先 endpoint 切替
 
 Replication Old Cluster (5.6.10a) New Cluster (2.04.6) Application Write

Slide 26

Slide 26 text

今回やったバージョンアップ・切替手順(11 11. 新DBでのみ GRANT してアクセス再開
 
 Replication Old Cluster (5.6.10a) New Cluster (2.04.6) Application Write GRANT

Slide 27

Slide 27 text

今回やったバージョンアップ・切替手順(12 12. 新旧DB間のレプリケーションを停止して旧DBを停止
 
 New Cluster (2.04.6)

Slide 28

Slide 28 text

まとめ ● SaaS サービスは想定された使い方をしましょう!
 ● ドキュメントをよく読み仕様の制限を理解して設計!
 ● でも理想どおりにいかないのが現実の運用…
 ● 獣道をいく勇気も必要かもしれません!
 ● ご協力いただいたSAやCSの方ありがとうございました!