いかにして不足・不整合なくデータ移行したか
by
momochi29
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
いかにして不足・不整合 なくデータ移行したか 発表者: momochi29 1
Slide 2
Slide 2 text
自己紹介 id:momochi29 ● データ移行の検証など ● マンガメディア開発の チーム歴は5年程度 ● 「ワールドトリガー」 が好き 2
Slide 3
Slide 3 text
ゴール ユーザから見て移管前後でデータが変わって いない 3
Slide 4
Slide 4 text
そのためには? 本番移行までに 移行時の直すべきエラー・原因不明のエラー をすべて洗い出し、解消する 4
Slide 5
Slide 5 text
全体像 5
Slide 6
Slide 6 text
サイクルの全体像 移行 検証 エラー 修正 完了! エラーがない エラーがある 6
Slide 7
Slide 7 text
サイクルの全体像 移行 検証 エラー 修正 完了! エラーがない エラーがある 7
Slide 8
Slide 8 text
サイクルの全体像 移行 検証 エラー 修正 完了! エラーがない エラーがある ここを話します 8
Slide 9
Slide 9 text
検証 9
Slide 10
Slide 10 text
検証が必要な背景 期間1 エラーなし 期間2 エラーなし ・・・ データ移行(分割移行) 10
Slide 11
Slide 11 text
検証が必要な背景 期間1 エラーなし 期間2 エラーなし ・・・ 期間ごとにエラーがないので おそらく不整合はないだろう データ移行(分割移行) 11
Slide 12
Slide 12 text
検証が必要な背景 期間1 エラーなし 期間2 エラーなし ・・・ 期間ごとにエラーがないので おそらく不整合はないだろう データ移行(分割移行) ユーザ単位ですべてのデータに不整合 がないことは保証できていない 12
Slide 13
Slide 13 text
検証が必要な背景 期間1 エラーなし 期間2 エラーなし ・・・ 期間ごとにエラーがないので おそらく不整合はないだろう データ移行(分割移行) そもそも… 移行処理にバグがあってデグレしてい るかもしれない 13
Slide 14
Slide 14 text
検証が必要な背景 1. ユーザ単位ですべてのデータに不整合がない ことを保証できていない 2. 移行処理にバグがあってデグレしているかも しれない 14
Slide 15
Slide 15 text
何を検証するのか 1. ユーザに対する検証 2. 移行自体に対する検証 15
Slide 16
Slide 16 text
ユーザに対する検証 ● ユーザが持っているデータが移行前後で変化 していないことをユーザごとに検証する 16
Slide 17
Slide 17 text
ユーザに対する検証 ● ズレるとユーザに不利益がある箇所を重点的 に検証する ○ 例) レンタル期限が一致するか ■ ズレるとレンタルしていたはずの話が読めなくなったり… 17
Slide 18
Slide 18 text
移行自体に対する検証 ● 移行が仕様通りに実装されているかを検証す る 18
Slide 19
Slide 19 text
仕様通りに実装されているかの検証 移行元テーブル 移行先テーブル 移行先テーブル ︙ 変換ルールに則って移行 19
Slide 20
Slide 20 text
移行元テーブル 移行先テーブル 移行先テーブル ︙ 変換ルールに則って移行 単体テストによって ルールに従っている か検証している 仕様通りに実装されているかの検証 20
Slide 21
Slide 21 text
移行元テーブル 移行先テーブル 移行先テーブル ︙ 変換ルールに則って移行 単体テストによって ルールに従っている か検証している 仕様通りに実装されているかの検証 これで充分? 21
Slide 22
Slide 22 text
仕様通りに実装されているかの検証 ● No ● 移行処理に実装漏れがあると、テストが存在 しないので仕様に従っているか確認されない ○ 移行先観点でのテストになるので漏れやすい 22
Slide 23
Slide 23 text
仕様通りに実装されているかの検証 移行元テーブル 移行先テーブル 変換ルールに則って移行 移行先テーブルから 移行元テーブルを再現できる か検証する 23
Slide 24
Slide 24 text
テーブルの再現による検証 ● 移行先のテーブルからデータを集めて変換 ルールを適用して移行元のテーブルを作る ● これによって移行元との差分がわかり、移行 漏れを無くせる 24
Slide 25
Slide 25 text
検証失敗時には? ● エラーを記録する ● 分類しやすいようにフォーマットを統一 25
Slide 26
Slide 26 text
直す価値のあるエラーを得る ● 直す価値のあるエラーとは、直さないと本番 環境でも発生するエラー ● 移行元の本番環境のスナップショットを使っ て、移行→検証することで価値のあるエラー を得る 26
Slide 27
Slide 27 text
検証を動かす ● データ移行を動かしているStep Functions + AWS Batchに検証ジョブを追加した ○ 数百の検証ジョブを並行で動かすことで十分高速に検 証できた ● ただ、リソース上の問題があったのでチュー ニングした 27
Slide 28
Slide 28 text
検証のチューニング ● 移行に利用しているDBのCPU使用率が張り付 いている ○ → 検証は読み込み専用DBを使う ● 検証のタスクがOOM ○ → メモリ使用量の上限を引き上げ ○ → あえてN+1にする 28
Slide 29
Slide 29 text
エラー修正 29
Slide 30
Slide 30 text
エラー修正 ● エラー数を0にするのがゴール ● 多種多様なエラーをうまくハンドリングする には? 30
Slide 31
Slide 31 text
エラーフォーマットの統一 ● ジョブの種類 ● エラーメッセージ ● エラーコード ○ レコードが存在しない、一致しないの2種類 ● デバッグのために必要な情報 ○ エラーになった場所、レコードのID 31
Slide 32
Slide 32 text
CloudWatch Logs Insights ● ジョブの種類、エラーごとに first_seen, last_seen, エラー総数を出す 32
Slide 33
Slide 33 text
CloudWatch ダッシュボード ● Logs Insightsで作ったクエリの実行結果を集 約できる ● ここだけ見ればオッケーにできる ○ 移行・検証のエラーに対するクエリ結果と、その他に 必要な情報をウィジェットとして追加した 33
Slide 34
Slide 34 text
CloudWatch ダッシュボード 34
Slide 35
Slide 35 text
ゴールが数値で見える嬉しさ ● 移行作業は長いトンネルを歩く感覚がある ● エラー数が減るとゴールに近付いていること を実感できてよかった 35
Slide 36
Slide 36 text
修正サイクルを回す エラー 修正 移行 ダッシュ ボード 確認 エラーがある 完了! エラーがない 36
Slide 37
Slide 37 text
修正サイクルを回す エラー 修正 移行 ダッシュ ボード 確認 新規のエラー: first_seenから判断 既存のエラーが直っていない: last_seenから判断 完了! エラーがない 37
Slide 38
Slide 38 text
あとはエラーがなくなる までひたすらやる 38
Slide 39
Slide 39 text
結果 ● 本番環境での移行で未知のエラーに遭遇せず に移行を完了することができた ○ 本番同等のデータを使ってエラーが無くなるまでサイ クルを回した賜物 ● データ移行に起因する大きな問題はなかった 39
Slide 40
Slide 40 text
まとめ ● ユーザに対する検証と移行自体に対する検証 の2面からの検証によって、不足・不整合なく 移行できた ● 移行元の本番環境のデータを使って修正サイ クルを回すことで未知のエラーに遭遇するこ となく移行できた 40