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

大規模テーブルと高トラフィック環境で 終わらないオンラインDDLと戦った1年間

Avatar for HonMarkHunt HonMarkHunt
April 23, 2026
520

大規模テーブルと高トラフィック環境で 終わらないオンラインDDLと戦った1年間

2026/04/23(木) に開催された [コドモン x MIXI] 積み重なった課題とどう向き合うか — 長期運用のSREの実践 の資料です
https://mixi.connpass.com/event/389250/

Avatar for HonMarkHunt

HonMarkHunt

April 23, 2026

More Decks by HonMarkHunt

Transcript

  1. 8 ©MIXI みてねのシステム構成 • Amazon EKSを⽤いたマルチクラスタ構成 • Amazon Aurora MySQL、Amazon

    Aurora Global Database 世界中の家族のこころのインフラ』を⽬指して”次の10年”へ (https://speakerdeck.com/kohbis/towards-the-next-decade-enhancing-global-service-reliability-through-sre?slide=24)
  2. 9 ©MIXI これまでの取り組み 課題を残さないために多くの取り組みを実施しました 小さな最適化の積み重ねと、 将来のボトルネックを潰す大きな意思決定 の両方歴史があります • OpsWorksからEKSへの移行 ◦

    https://gihyo.jp/article/2022/11/mitene-02eks • EKSのマルチクラスタ化 ◦ https://team-blog.mitene.us/mitene-infra-multi-region-614717f0162d 直近でも ingress-nginx から Envoy Gateway への移行を行いました *1 定常業務でも +α の改善を行って次のプロセスを改善し続けるカルチャー 例) EKSアップグレード作業の簡略化 *2 課題が深刻に滞留する状況は回避できている *1 Ingress NGINXのretirementに伴うGateway API + Envoy Gatewayへの移⾏(https://zenn.dev/mitene/articles/202604-ingress-nginx-to-envoy-gateway) *2 EKSアップグレードRTA in みてね 2025(https://zenn.dev/mitene/articles/eks-upgrade-rta-in-mitene-2025) zennの公式に ピックアップして いただきました
  3. 10 ©MIXI SREは一般的な機能開発など「 0を1にする作業」に加えて アップグレード・アラート・インシデント・脆弱性・ EOLなど、 安定運用や保守改善にあたる「 -1を0にする作業 」も多い 成果としては同じ

    +1 ではあるが、 期待値調整・目標設定・上位レイヤーへの説明のしづらさから優先度を上げづらい傾向にある • MVVなどによるカルチャー • 経営・事業側の理解・評価制度への反映 ◦ 参考: みてね Engineering Ladder • 個々人の等級に見合った期待値調整 補⾜ : 課題を積み重ねないためにMGRができること 消化できないマイナスが貯まると「負債解消そのもの」をゴールに設定した 「負債解消プロジェクト 」が始まってしまう。できればそうなる前に対処しておきたい 「0を1にする作業」を増やしたいが「 -1を0にする作業 」も適切に給与に反映 させる そればかりだと何も生み出せないので期待値の調整は必要
  4. 14 ©MIXI • Aurora MySQL • Global Database • Aurora

    I/O-Optimized • Gravitonインスタンスの活用 みてねにおけるAmazon Auroraの課題 Amazon Auroraの活⽤ • 物理的なサイズ上限 • サービスピーク時のパフォーマンス限界 • テーブル設計の陳腐化 ◦ 一部巨大テーブルの発生 Amazon Auroraの課題 https://aws.amazon.com/jp/rds/aurora/instance-types/ 今日はここ
  5. 15 ©MIXI • ⼀部テーブルが 数億 ~ 数百億レコード • 通常のサービスピーク時で 数千

    〜 1万数千 rows/sec のinsert ◦ 休⽇夜間がサービスピーク • 1⽇あたり 数億⾏ ~ ⼗数億 規模のinsert • 単⼀Writer 巨⼤テーブルとオンラインDDLの課題 日本時間の日曜夜
  6. 16 ©MIXI ビジネス要件‧機能開発‧技術的負債解消のためにDB migrationを実施する必要がある みてねではRails標準のschema_migrationsを⽤いてversion管理を⾏っている ⼀部の⼤規模テーブルで素のALTER TABLEでは完遂できない 1. 巨⼤テーブルのコピーが現実的な時間で終わらない 2.

    途中失敗で最初からやり直し(再開不可) 3. IO逼迫でサービス全体のレイテンシが悪化 4. メタデータロック しかし、migrationのたびにメンテナンスに投⼊していては可⽤性が悪化してしまう サービスも稼働させながら(オンライン)でDDLの変更を実施する必要がある DB migration実⾏し隊 オンラインDDLツールを利⽤してサービスを安定稼働させながらmigrationを完遂させる必要あり
  7. 18 ©MIXI レコード数と書き込みがそこまで多くないテーブルでは問題なく実⾏可能 みてねでも標準ツールとして採⽤していた pt-online-schema-change(pt-osc) • DML追従のためのTRIGGERの負荷が発⽣ ◦ 元テーブルへの書き込みワークロードがそのままDB負荷 ◦

    書き込みが多いほど追従コストが膨らみ、全体のレイテンシにも影響 • 負荷が本番トラフィックに⽐例して拡⼤ ◦ ピーク時間帯はスロットリング/中断を余儀なくされる • みてねでの実績 ◦ レコード数が億を超える、もしくは書き込みの多いテーブルの場合 ◦ 負荷に耐えきれずプロセスが停⽌してしまい完遂できず TRIGGERを使わない⽅法で同期する必要がある
  8. 19 ©MIXI GitHub https://github.com/github/gh-ost トリガーレス。binlogをストリーミングして変更を追従 gh-ost ⼤まかな流れ: 1. 新スキーマ適応された「新テーブル」を作成 2.

    元テーブル → 新テーブルへ ⾏をコピー 3. binlogを読んで、変更イベントを新テーブルに適⽤(シングルスレッド) 4. リネームでカットオーバー
  9. 20 ©MIXI binlog経由での同期となるためTRIGGERの課題は解消 gh-ost • pt-oscでは変更できなかったテーブルも変更完了 • みてねでも pt-osc から

    gh-ost を標準ツールへと移⾏ • 数⼗億程度のレコードであれば1⽇~数⽇程度でmigration完了 • しかし、gh-ostでも完遂できないケースが... binlogを出すことで性能⾯に影響が出るのでは? Auroraの拡張binlogを⽤いることで解消 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Enhanced.binlog.html
  10. 22 ©MIXI spirit https://github.com/block/spirit spirit spiritとは • MySQL 8.0+ 専⽤の次世代オンラインスキーマ変更ツール

    • gh-ost の思想を継承しつつ、現代的な要件に再設計 ◦ > Spirit is a reimplementation of the schema change tool gh-ost. • gh-ostとの主な違い ◦ 変更適⽤もマルチスレッド化 → ⾼書き込みワークロードに追従 ◦ チェックポイントからの再開 → 途中で落ちても続きから再開可能 ◦ MySQL 8.0 の INSTANT DDL を⾃動活⽤
  11. 23 ©MIXI spirit https://github.com/block/spirit spirit ⼤まかな流れ: 1. 新スキーマ適応された「新テーブル」を作成 2. 元テーブル

    → 新テーブルへ ⾏をコピー 3. binlogを読んで、変更イベントを新テーブルに適⽤(マルチスレッド) 4. リネームでカットオーバー spirit \ --username=$MYSQL_USER \ --password=$MYSQL_PASSWORD \ --host=$MYSQL_HOST \ --database=$MYSQL_DATABASE \ --table="table_name" \ --alter="CHANGE hoge int NOT NULL” \ --defer-cutover \ --threads=2
  12. 24 ©MIXI binlog同期がマルチスレッド化することで速度向上 spirit • マルチスレッドで並列数を増やすことでgh-ostでは⾒えなかった完了予定が⾒えるように ◦ しかし、スレッド数を増やすと当然WriteIOが悪化する • ⼀時的にAuroraをサイズアップし上げられる並列度を増やして実⾏

    • サイズアップ / cutover 時には計画メンテナンスを実施 そもそも本番環境のDBであまり実績のないツール採⽤するの怖くない? 各環境での検証に加えmigration完了後の新旧テーブルの差(check-sum)がないことを事前確認の上採⽤ 結果として...
  13. 26 ©MIXI まとめ • 現状の運⽤ ◦ 軽量な変更 → MySQL Online

    DDL (INSTANT/INPLACE) ◦ 中〜⼤規模 → gh-ost(標準の⼿順に組み込み済み) ◦ 超巨⼤‧⾼書き込み → spirit • 課題 ◦ まだmigrationが実⾏中... ◦ 数百億超えのテーブルのmigrationを定期的に実⾏できる環境は作れていない • ご質問は懇親会‧パネルでぜひ!