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

Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜

Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜

Kaigi on Rails 2026 登壇資料(日本語版)

Avatar for Shoichi Ochi

Shoichi Ochi

October 17, 2026

More Decks by Shoichi Ochi

Other Decks in Technology

Transcript

  1. 自己紹介 おち しょういち 越智 翔一 SmartBank, Inc. Software Engineer 経歴:

    イタンジ株式会社 → GMOビューティー株式会社 → 株式会社スマートバンク 趣味: 筋トレ @ochi11181101 @sho-work 7
  2. 88

  3. 思考実験の手順 Back-of-the-envelope estimation 1. 秒間書き込み行数の試算 2. 社内運用DBでの参考値の計測 3. [1.] [2.]

    の結果からどのようなシステ ム構成が必要かを考える https://highscalability.com/google-pro-tip-use-back-of-the-envelope-calculations-to-choo/ 23
  4. 2. 社内で運用している既存DBでは、どの程度の書き込み性能なのかを実測する • • • DB: Amazon Aurora MySQL 並列Bulk

    Upsert で計測 持続スループット(並列度を上げて飽和した際):約 10,000 ~ 50,000行/秒 25
  5. しかし、その構成は本当に現実的か? • • 追加インフラ予算が膨大になる ◦ Aurora換算で十数〜数十 Writer 相当の構成と、6〜12TB の容量 実装工数・運用面で辛い

    ◦ A. データストアを変える:DBの移行と、新しい運用ノウハウ ◦ B. Auroraを分割する:シャードルーティング・リラン・障害復旧・運用 29
  6. 約2,900件/秒なら、思考実験の計測からも現実的に見える • 必要:2.5億件 ÷ 86,400秒 ≒ 約2,900件/秒 • 思考実験の計測:1 Writer

    で 約1万〜5万件/秒 • ※ 1件あたりのバイト数は思考実験の約4倍。書き込み性能はもう 少し落ちると見ておく → 1 Writer の範囲で、取り込めそうな見込みが立った 47
  7. 制約(コスト):どの候補も予算内に収まる 課金の対象 月 約$1,000 に 収まるか Aurora MySQL DynamoDB Elasticsearch

    ストレージ・I/O Import か書き込み + ストレージ VCU + ストレージ ◦ ◦ ◦ → コストの制約は、どの候補でも満たせる 61
  8. 並列Bulk Upsertで大量のDeadlock • • • 起こったこと: ◦ 大量のDeadlockが発生した 分析: ◦

    performance_schema.data_locksでロックの取得状況を調査した 原因: ◦ PRIMARYのsupremumに対するXロックと、後続INSERTのInsert Intention Lockが競合し、トランザクション間で循環待ちが発生した 再現用のスクリプトをpushしたgithubリポジトリはQRコードから! 99
  9. Deadlockをどう解消したか • • • 当該Txの分離レベルを REPEATABLE READ → READ COMMITTED

    へ変更 これによって、supremum pseudo-record へのXロックを取らなくなる デメリットとして読み取りスキューが起こり得る ◦ 今回の要件から、この問題が起きえないので、許容できた https://speakerdeck.com/occhi/prevent-concurrency-problems-a-practical-introduction-to-transactions?slide=101 101
  10. RDBMSのCPU使用率上昇 • • 起こったこと: ◦ ユーザーからの書き込みトラフィックの増加に伴い、Writer DBのCPU使用率 への影響が深刻化 調査結果: ◦

    2.5億件全件を毎月 Bulk Upsert していた。 ◦ 毎月の取り込みで、実際に更新したいのは500万件に達しない程度 106
  11. CPU使用率の上昇をどう解消したか • • 対応方針: ◦ Bulk Upsertする対象を絞る ◦ DBへの書き込みを4並列 →

    直列に変更した 詳細 ◦ 解凍・分割バッチの中で更新対象を絞り込み、書き込む量を大幅に減らした ▪ 更新対象の変化: 2.5億件全件 → 500万件未満 ◦ これによって、直列でも1日以内で取り込み完了できるようになった 何を基準に更新対象を絞り込んだのか?は懇親会等で話せると幸いです! 107
  12. Appendix:Elasticsearch:公式ドキュメント・ベンチマーク上、要件を満たせる見込み 要件 読み取り 書き込み 結論 根拠 ID で1件取得。 複雑な検索でも P50

    36ms・P99 316ms Get API/ストレステスト 参考値: 約51,700 docs/秒 Elastic Search Labs:Serverless のストレ ステスト → 公式の情報上、要件を満たせる見込み(条件は今回と異なる) 113
  13. Appendix:選定時のコスト概算(前提条件つき) • • • • • いずれも選定時の概算。前提がそろっていないので、総額の横並び比較はしない Aurora MySQL:既存クラスタのストレージ・I/O の増分

    ◦ 月 $1,000 の予算内に収まる見込み。実測に基づく算出は未実施 DynamoDB(既存テーブルを更新):書き込み 約$186/月 + ストレージ ◦ 1件1KB以下・1 WRU/件・約2.6億件を仮定 DynamoDB(S3 Import):料金は非圧縮サイズが基準。約$1.37 は圧縮サイズ からの試算で未確定 Elasticsearch(Elastic Cloud Serverless):約$105/月 ◦ Search VCU 約$78・取り込み 約$10・ストレージ 約$17(VCU 使用量を仮定) 114
  14. Appendix:並列度は、取り込み時間とDB負荷を計測して決めた 3並列 4並列 取り込み時間 約22時間 約14時間 DB の CPU 使用

    率 約10% 上昇 約15% 上昇 → 取り込み時間と DB 負荷のバランスから、 4並列にした 124