Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
稼働中サービスの大規模データをどう移すか。仕訳帳検索のOpenSearch移行
Search
freee
PRO
October 20, 2026
Technology
15
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
稼働中サービスの大規模データをどう移すか。仕訳帳検索のOpenSearch移行
freee 技術の日 2026のセッション資料です。
freee
PRO
October 20, 2026
More Decks by freee
See All by freee
freeeに点在する案件・プロジェクトを統合するための案件マスタ開発
freee
PRO
0
23
freeeにおけるSoftware Factory
freee
PRO
0
69
freeeにおける AI を用いた ブラウザ動作確認の自動化の取り組み
freee
PRO
0
35
AIから最も使われやすいfreeeへ
freee
PRO
0
14
認知負荷との戦い〜 freee AIアシスタントの誕生からハーネス改善まで 〜
freee
PRO
0
21
脱SaaS脳 キャリア25年目の挑戦
freee
PRO
0
19
攻めと守りを両立するデータ基盤 〜中央集権型からデータメッシュへの道のり〜
freee
PRO
0
12
セキュリティチームのAIエージェントを チーム内の誰でも改善できるようにするまで
freee
PRO
0
14
AI Readyな安定性の高いデータ基盤を目指し、120個のデータコントラクトを結んだ話
freee
PRO
0
25
Other Decks in Technology
See All in Technology
パッチ更新でterraform initが落ちた日
grimoh
1
140
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
5
1.2k
パスキーの自動テストはどこまでいけるのか
teamlab
PRO
0
280
Browser Spec: Testing Hotwire with Ruby
takahashim
1
130
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
190
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
3
650
TinyGoでオブザーバビリティ?OpenTelemetryはTinyGoで使えるのか / Is OpenTelemetry available in TinyGo environment?
ymotongpoo
2
140
Webの常識が通じないHTMLメールのダークモード
teamlab
PRO
0
130
夫婦で子育てするための育児標準化
codmoninc
PRO
0
460
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.7k
How to Design Configuration for Rails Applications
willnet
1
830
AI時代のPRレビューにどう向き合うか?
kairim0
1
240
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
870
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
Test your architecture with Archunit
thirion
2
2.4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.3k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
580
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
530
Between Models and Reality
mayunak
4
500
Into the Great Unknown - MozCon
thekraken
41
2.8k
The Cost Of JavaScript in 2023
addyosmani
55
10k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Transcript
None
稼働中サービスの⼤規模データをどう移すか。 仕訳帳検索のOpenSearch移⾏ 萩本 康⼼(hagi) 2026年10⽉3⽇
会計申告開発本部 業種特化部 エンジニア 萩本 康心(hagi) 2025年4月に新卒でfreeeに入社。 freeeホームページ の立ち上げ後、 現在までfreee会計の開発に従事。
仕訳帳の検索が 速くなりました
仕訳帳の検索が速くなりました 仕訳帳検索のレイテンシ(p99) 20s 約12秒 15s 10s 約4秒 5s RDB での検索を
OpenSearch に移して、p99 が約12秒 → 約4秒
ただ、今⽇の主役は 検索ではありません 主役は、動いているサービスの数⼗億件をどう移したか
今⽇のゴール ⽌められないサービスで、数⼗億件をどう移すかを理解する
01 仕訳帳とは?
すべての仕訳が記録される、最も件数の多い帳簿 仕訳帳の画⾯(スクリーンショット) 会計データは消えない。過去の仕訳は残り続ける
数⼗億件、100万を超える事業所 数⼗億件 100万超 1⽇20万超 仕訳 事業所 仕訳帳の検索 件数は増え続ける
02 なぜ移⾏したのか?
テキスト検索が重く、 データの多い事業所ほど刺さる 部分⼀致検索はインデックスが効かない。 データの多い事業所ほど線形に悪化する 検索結果が返るまで、p99 で 12秒
そして、条件を⾜せなかった 承認ステータスは別のマイクロサービスが持つ。JOIN で絞り込めない 詳細な「承認状態で検索したい」に、実装で応えられない
03 どうやって同期しているか?
仕訳は、会計DBに書かれる 会計API / Web 登録 会計DB
Outbox パターン ― 同じトランザクションでイベント⾏も書く 会計API / Web 登録 会計DB +
outbox テーブル 業務処理と同じコミットに乗せる 業務データとイベントが同⼀トランザクション。at-least-once を保証できる
別プロセスが拾って、OpenSearch に⼊れる 会計API / Web 登録 会計DB + outbox テーブル
読む 登録 Indexer 業務処理と同じコミットに乗せる outbox テーブルをポーリングし、Bulk API で投⼊する Open Search
ドキュメント1件に、3つの社内サービスを叩いている 会計API / Web 登録 会計DB + outbox テーブル 読む
登録 Indexer Open Search ファイル基盤 証憑情報 コメント基盤 コメント情報 業務処理と同じコミットに乗せる 承認基盤 申請状態 1ドキュメント = 3リモートコール
04 何が難しかったのか?
過去の分が、空のまま 同期は動き出した。しかし OpenSearch には過去の仕訳が⼊っていない 数⼗億件のバックフィル(初回同期)が要る
⻑くても2週間だと思っていました 根拠は、数年前に社内でやった取引データの移⾏ 仕訳は freee の中でもトップクラスのデータ量。 この規模を移した経験は、社内にもなかった
1 Pod で数時間流して、計算し直した goroutine の並列数を上げながら実測 このペースなら、1年
05 どうやって流し切ったか?
goroutine を増やせば済むと思っていた Pod 1つの Pod の中で、ドキュメント⽣成を goroutine の worker pool
で並列化
ある並列数から、速くならなくなった 並列数を上げても、スループットが伸びない
待っていたのは、CPU ではなくネットワークだった 承認基盤 ドキュメント ⽣成 ファイル基盤 応答を待っている コメント基盤 1件ごとに、依存サービスからの応答を待つ。 待っている間、プロセスは何もしていない
Pod を増やすしかなかった Pod Pod Pod 送信元を増やせば、並⾏して待てる ただし増やしすぎると、今度は相⼿がリクエスト過多で倒れる Pod
そして、Pod を 1 → 2 → 4 と上げていった Pod 1台
2台 負荷を⾒ながら、段階的に 4台
⾒ていたのは、4つのDBと OpenSearch Pod 1台 2台 4台 負荷を⾒ながら、段階的に ⾒ていたもの 会計DB コメント基盤
承認基盤 認証基盤 CPU‧DBロード‧接続数∕JVMメモリ圧‧エラー率‧IOPS OpenSearch
落ちる前提で作り、 ⽌める⼿段を先に⽤意する 未処理の事業所だけを取り出すカーソル⽅式。処理は冪等 キルスイッチを⽤意し外から⽌められるようにした ループが定期的にフラグを⾒て、安全な位置で⽌まる
1年規模の⾒積もりが、 1ヶ⽉半で終わった
06 結果
仕訳帳の検索が速くなりました 仕訳帳検索のレイテンシ(p99) 20s 15s 10s 約12秒 約4秒 5s RDB での検索を
OpenSearch に移して、p99 が約12秒 → 約4秒
そして、できなかった検索ができるようになった 仕訳帳の検索フォーム(スクリーンショット) コメント検索‧詳細な承認状態での検索が実装できるようになった
07 まとめ
この事例から学べること 1 移⾏のボトルネックは、⾃分のDBではなく他⼈のサービスにある 計画を⽴てる前に、1件あたり誰に何回問い合わせるかを数える 2 並列度は、叩く先の実測で決める ⾃分のDBだけでなく、叩きに⾏く先の負荷を並べて⾒る 3 移⾏バッチは、必ず途中で死ぬ前提で作る ⼀度で流し切る設計にしない。⽌めるスイッチを先に作る
None