Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
巨大なテーブルのテーブル定義を無停止で安全に誰でも変更できるようにする / Table-def...
Search
freee
April 11, 2024
Technology
2
1.6k
巨大なテーブルのテーブル定義を無停止で安全に誰でも変更できるようにする / Table-definitions-for-huge-tables-can-be-modified-by-anyone-safely-and-non-disruptively
freee
April 11, 2024
Tweet
Share
More Decks by freee
See All by freee
[2025/09/12更新] freeeのAIに関する取り組み
freee
1
76
開発組織発 AI駆動経営
freee
0
40
「SaaS × AI Agentの未来」freee が AWS で築く AI Agent 基盤
freee
0
22
freee が目指す生成 AI 時代に向けた次世代データ プラットフォームとガバナンスとは / freee's Next-Generation Data Platform and Governance for the Coming Age of Generative AI
freee
1
360
freee請求書のSLO違反改善活動について / SLO violation remediation activities for freee invoices
freee
1
450
freee + Product Design FY25Q4
freee
4
16k
10分でわかるfreeeのQA
freee
1
15k
freee Movement Deck
freee
1
310k
freeeのモバイルエンジニアについて
freee
1
610
Other Decks in Technology
See All in Technology
Function Body Macros で、SwiftUI の View に Accessibility Identifier を自動付与する/Function Body Macros: Autogenerate accessibility identifiers for SwiftUI Views
miichan
2
180
実践!カスタムインストラクション&スラッシュコマンド
puku0x
0
420
[ JAWS-UG 東京 CommunityBuilders Night #2 ]SlackとAmazon Q Developerで 運用効率化を模索する
sh_fk2
3
430
Django's GeneratedField by example - DjangoCon US 2025
pauloxnet
0
150
Codeful Serverless / 一人運用でもやり抜く力
_kensh
7
430
自作JSエンジンに推しプロポーザルを実装したい!
sajikix
1
180
roppongirb_20250911
igaiga
1
240
Evolución del razonamiento matemático de GPT-4.1 a GPT-5 - Data Aventura Summit 2025 & VSCode DevDays
lauchacarro
0
210
【NoMapsTECH 2025】AI Edge Computing Workshop
akit37
0
200
機械学習を扱うプラットフォーム開発と運用事例
lycorptech_jp
PRO
0
250
slog.Handlerのよくある実装ミス
sakiengineer
4
180
「Linux」という言葉が指すもの
sat
PRO
4
140
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Fireside Chat
paigeccino
39
3.6k
Bash Introduction
62gerente
615
210k
Git: the NoSQL Database
bkeepers
PRO
431
66k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
It's Worth the Effort
3n
187
28k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Designing for humans not robots
tammielis
253
25k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
A better future with KSS
kneath
239
17k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Transcript
巨大なテーブルのテーブル定義を無停止で安全に 誰でも変更できるようにする 2024.04.08
2 • freeeのエンジニア • 2023/3までfreeeでDBREのチー ムリーダーをやっていました。 • その後転職の後2024/1からfreee に出戻り
• 最近はプロダクト横断で利⽤す る基盤システムを作っています • 最近はDB系の論⽂を読む会を主 催しています shallow1729
3 テーブル定義の変更の重要性と課題 • WEB開発においてはサービスの開発後に新しい要件に合うようにカラムやインデッ クスの追加、変更が必要になるケースがある • 頻繁にDDLを行いたいが以下のように無停止でのDDLには危険性がある ◦ DDLの実行はテーブルのサイズや行いたい変更の種類によっては実施が困難
▪ 数十億レコードのテーブルのインデックスの追加 ▪ カラムのデータ型の変更などのOnline DDLできないもの • ドキュメントのPermits Concurrent DMLを確認 ◦ DDLの負荷が問題になるケースがあるがコントロールしづらい ◦ アクセスの多いサービスでのDDLではメタデータロックのケアが必要(後述) DDLを無停止で頻繁に行いたいユースケースがあるがMySQLの標準の仕組みは 要件に合わない
4 メタデータロックの動作 • MySQLはInnoDBなどのストレージエンジンで取る行ロックなどとは別にエンジンの レイヤーで取るメタデータロックというやつがいる • クエリやDML時はshared、DDLの実行時はexclusiveにロックを取る • メタデータロックはトランザクションの終了時に手放される •
exclusive lockはshared lockを待つ必要があり、exclusive lockが待っていると後続 の処理はshared lockを取れない DDLの対象テーブルに対してロングトランザクションがあるとDDLが実行できず、 後続のクエリも待たされる
5 メタデータロックの競合のイメージ ロングトランザクションのある状況でDDLを実行するのは危険
6 メタデータロックの問題の回避策 • lock_wait_timeoutというMySQLのパラメーターでメタデータロックの取得待ちのタイ ムアウトを決められるので、これが小さいとロック待ちで詰まることを回避できる • freeeではDDLを実行するセッションのみlock_wait_timeoutを小さくすることで既存の ワークロードへの影響を最小限にOnline DDLの安全性を高めている •
しかし、メタデータロックは一般にDDLの開始時と終了時の二度取るタイミングがあ り、終了時にタイムアウトが発生すると最初からやり直しになる...
7 MySQLのOnline DDLの課題のまとめ • MySQLの通常のOnline DDLでは以下のケースで課題がある ◦ データ量の多いテーブルのインデックス追加やデータ型の変更などOnline DDLを利用できないケー スがある
◦ DDLの負荷自体がワークロードに影響を与えるリスクがあるがコントロールが難しい ◦ メタデータロックの問題があり、ロングトランザクションがあるワークロードでのOnline DDLはリスク がある ▪ lock_wait_timeoutを小さくすることで影響は減らせるがDDLが失敗するリスクが上がる
8 一般的な代替案 • メンテナンスを実施してDDLを実行 • レプリカでDDLを実行した後にレプリカをプライマリーに昇格する • pt-online-schema-change(ptosc)などのDDLを実行するためのツールの利用
9 レプリカでDDLを実行して切り替える • インフラ作業やMySQLの標準の機能(レプリケーションやDDL)で済むので実装は不要 • インフラの理解や権限が必要でプロダクトチームに任せづらく、スケールしない • プライマリーへの昇格時に接続先を変更するために許容できない停止時間が発生する
10 ptoscの動作 • ソフトウェアの処理で完結するのでインフラよりはプロダクトチームに権限を渡しやすい • パラメーターで負荷の調整が可能で切り替え時の停止時間も小さい • 利用経験のある人が少なく、学習コストがかかりそうなのでスケーラビリティの問題がある
• 通常のDDLより時間がかかる上、メタデータロックを取るステップが最後にあり、メタデータロックの取得に 失敗する可能性のケアが必要
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のベストプラクティ スが反映している
12 freeeでの解決策の図
13 ptoscの実行に関する工夫 • メタデータロックのケア ◦ lock_wait_timeoutを短くする ◦ ptoscの最後のスワップは行わずに実行し、別タスクでswapを行う(--no-swap-tables)
▪ スワップの失敗時にリトライできるようにするため+後述の事前チェックのため • ptoscの実施によるワークロードへの影響のケア ◦ chunk sizeなどのパラメーターの調整 ◦ max loadなどのptoscに備え付けの高負荷を検知して処理を止める仕組みの利用 ▪ 使っていないがRDSのcpu使用率を見て止めるパッチを作ったりもした • ptoscが正しく実施できたかの事前チェック ◦ テーブルのレコードをちょっとずつ比較して差分が無いかを確認 • その他失敗時の掃除なども含めてジョブを用意してプロダクトチームに提供
14 ptoscの導入の効果 • int32のauto incrementのカラムが一杯になりかけていたテーブルについてデータ型 をbigint化する事を無停止で実現 • 負荷の調整によりアクセスの多い時期でも安全にDDLを実現。DDLのためにメンテ を行わなくてもよくなる。 •
大半のオペレーションが自動化され、権限がプロダクトチームにあるので各チーム で実行が可能になり作業のスケーリングを実現 • ptosc実行中のレプリケーション遅延などの問題もAurora MySQLの場合独自のレ プリケーションの仕組みでほとんど起きなかった
15 まとめ • freeeではサービスの継続的な成長を支えるための独自のDDLの仕組みを用意し、 プロダクトチームに提供している • 無停止で: ptoscにより数十億レコードのテーブルのデータ型の変更のようなOnline DDLが使えないケースも対応する •
安全に: DBREのベストプラクティスを自動化処理の実装に落とし込む • 誰でも: プロダクトチームにタスクの実行権限を渡す事でツールの学習コストを抑 え、プロダクトチーム主体で難易度の高いDDLも必要なタイミングで各自で実現で きるようにする
16 技術的な詳細を知りたい方は • pt-online-schema-changeの導入時に検討したこと、およびRailsアプリとの併用に ついて • AWSマネージドサービス+Terraformを活用してDBオペレーションをより安全&簡単 に(pt-oscの例)
スモールビジネスを、世界の主役に。