Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

巨大なテーブルのテーブル定義を無停止で安全に誰でも変更できるようにする / Table-def...

freee
April 11, 2024

巨大なテーブルのテーブル定義を無停止で安全に誰でも変更できるようにする / Table-definitions-for-huge-tables-can-be-modified-by-anyone-safely-and-non-disruptively

freee

April 11, 2024
Tweet

More Decks by freee

Other Decks in Technology

Transcript

  1.   2 • freeeのエンジニア • 2023/3までfreeeでDBREのチー ムリーダーをやっていました。 • その後転職の後2024/1からfreee に出戻り

    • 最近はプロダクト横断で利⽤す る基盤システムを作っています • 最近はDB系の論⽂を読む会を主 催しています shallow1729
  2. 3 テーブル定義の変更の重要性と課題 • WEB開発においてはサービスの開発後に新しい要件に合うようにカラムやインデッ クスの追加、変更が必要になるケースがある
 • 頻繁にDDLを行いたいが以下のように無停止でのDDLには危険性がある
 ◦ DDLの実行はテーブルのサイズや行いたい変更の種類によっては実施が困難 


    ▪ 数十億レコードのテーブルのインデックスの追加 
 ▪ カラムのデータ型の変更などのOnline DDLできないもの 
 • ドキュメントのPermits Concurrent DMLを確認 
 ◦ DDLの負荷が問題になるケースがあるがコントロールしづらい 
 ◦ アクセスの多いサービスでのDDLではメタデータロックのケアが必要(後述) 
 DDLを無停止で頻繁に行いたいユースケースがあるがMySQLの標準の仕組みは 要件に合わない

  3. 4 メタデータロックの動作 • MySQLはInnoDBなどのストレージエンジンで取る行ロックなどとは別にエンジンの レイヤーで取るメタデータロックというやつがいる
 • クエリやDML時はshared、DDLの実行時はexclusiveにロックを取る
 • メタデータロックはトランザクションの終了時に手放される
 •

    exclusive lockはshared lockを待つ必要があり、exclusive lockが待っていると後続 の処理はshared lockを取れない
 DDLの対象テーブルに対してロングトランザクションがあるとDDLが実行できず、 後続のクエリも待たされる

  4. 7 MySQLのOnline DDLの課題のまとめ
 • MySQLの通常のOnline DDLでは以下のケースで課題がある
 ◦ データ量の多いテーブルのインデックス追加やデータ型の変更などOnline DDLを利用できないケー スがある


    ◦ DDLの負荷自体がワークロードに影響を与えるリスクがあるがコントロールが難しい 
 ◦ メタデータロックの問題があり、ロングトランザクションがあるワークロードでのOnline DDLはリスク がある
 ▪ lock_wait_timeoutを小さくすることで影響は減らせるがDDLが失敗するリスクが上がる 

  5. 11 freeeでの解決策 • ptoscをRDS/Auroraに対して実行するECS taskを呼び出すAWS Step Functionsを 用意
 • AWS

    Step Functionsの定義はTerraformで管理し、ptoscに関するTerraformの変更 やStep Functionsの実行権限、実行ログの閲覧権限などを各プロダクトチームに付 与
 ◦ TerraformはGitHubで管理されており、prに実行したいDDLを書いてマージするとStep Functionsに その情報が反映される 
 • ptoscをそのまま使うのではなく、設定や手順などについてDBREのベストプラクティ スが反映している

  6. 13 ptoscの実行に関する工夫
 • メタデータロックのケア
 ◦ lock_wait_timeoutを短くする 
 ◦ ptoscの最後のスワップは行わずに実行し、別タスクでswapを行う(--no-swap-tables) 


    ▪ スワップの失敗時にリトライできるようにするため+後述の事前チェックのため 
 • ptoscの実施によるワークロードへの影響のケア
 ◦ chunk sizeなどのパラメーターの調整 
 ◦ max loadなどのptoscに備え付けの高負荷を検知して処理を止める仕組みの利用 
 ▪ 使っていないがRDSのcpu使用率を見て止めるパッチを作ったりもした 
 • ptoscが正しく実施できたかの事前チェック
 ◦ テーブルのレコードをちょっとずつ比較して差分が無いかを確認 
 • その他失敗時の掃除なども含めてジョブを用意してプロダクトチームに提供

  7. 14 ptoscの導入の効果
 • int32のauto incrementのカラムが一杯になりかけていたテーブルについてデータ型 をbigint化する事を無停止で実現
 • 負荷の調整によりアクセスの多い時期でも安全にDDLを実現。DDLのためにメンテ を行わなくてもよくなる。
 •

    大半のオペレーションが自動化され、権限がプロダクトチームにあるので各チーム で実行が可能になり作業のスケーリングを実現
 • ptosc実行中のレプリケーション遅延などの問題もAurora MySQLの場合独自のレ プリケーションの仕組みでほとんど起きなかった

  8. 15 まとめ
 • freeeではサービスの継続的な成長を支えるための独自のDDLの仕組みを用意し、 プロダクトチームに提供している
 • 無停止で: ptoscにより数十億レコードのテーブルのデータ型の変更のようなOnline DDLが使えないケースも対応する
 •

    安全に: DBREのベストプラクティスを自動化処理の実装に落とし込む
 • 誰でも: プロダクトチームにタスクの実行権限を渡す事でツールの学習コストを抑 え、プロダクトチーム主体で難易度の高いDDLも必要なタイミングで各自で実現で きるようにする