Slide 1

Slide 1 text

  Trace Queriesの活⽤で freee会計のDB負荷削減のきっかけとした話 2024.08.07

Slide 2

Slide 2 text

  2 ⼤⽊⻯勝 経歴 ● 2019~2021 SIerに⼊社 ○ バックエンドエンジニアをやりながらCI/CD ‧ GCPなども触る ● 2022~2023 みんなの銀⾏⼊社 ○ DevOpsエンジニアとして安全なDeployフロー の構築を⾏う ● 2023.6 Enabling SREとしてfreee⼊社 ○ Enabling SREとしてプロダクトチームへのSRE プラクティス導⼊や可観測性の向上の取り組み を⾏う 最近のマイブーム ● ⽔耕栽培 ○ レタス、ミニ⻘梗菜、バジルを育てています Enabling SREチーム マネージャー Ohiki Ryuma

Slide 3

Slide 3 text

  freeeで何が起きていた?

Slide 4

Slide 4 text

4 ● 各種マイクロサービスからや直接ユーザからfreee会計に対してアクセスが来る freee会計ってどんなアーキテクチャ? 検索しているSpanはここ 各クラスタの前段にはenvoyが存在

Slide 5

Slide 5 text

5 freee会計DBの負荷がやばい ● freee会計は10年以上の開発をされていく中で巨⼤なN+1が様々なところで発⽣ ○ 様々な機能でN+1が起きているがどのAPIで特に頻発しているかは分からない ● ユーザ数の増加も相まって負荷が⾼まっている

Slide 6

Slide 6 text

6 会計DBの負荷がやばい ● 他クラスタから会計クラスタにN+1のリクエストが⾶んでくることもある ○ どのAPIで特に頻発しているかは分からない そもそもここまでくると Traceの画⾯すらまともに開けない…

Slide 7

Slide 7 text

7 ここまでのまとめ ● freee会計はユーザ数の増加やシステムの複雑化に伴ってDBへの負荷がやばいこと になっていた ○ 負荷の⾼い処理のTrace単体を⾒つけることは出来てもどのAPIでよく負荷が⾼くなっているかを 集計する⽅法は無かった ● 他にも以下のようなことも体系的に集計する⽅法はなかった ○ slowクエリを投げているAPI ○ ライターインスタンスにSELECTクエリをたくさん投げているAPI

Slide 8

Slide 8 text

8 ここまでのまとめ ● freee会計はユーザ数の増加やシステムの複雑化に伴ってDBへの負荷がやばいこと になっていた ○ 負荷の⾼い処理のTrace単体を⾒つけることは出来てもどのAPIでよく負荷が⾼くなっているかを 集計する⽅法は無かった ● 他にも以下のようなことも体系的に集計する⽅法はなかった ○ slowクエリを投げているAPI ○ ライターインスタンスにSELECTクエリをたくさん投げているAPI DatadogのTrace Queriesが 解決のきっかけの⼀つに!

Slide 9

Slide 9 text

  Trace Queriesとは?

Slide 10

Slide 10 text

10 ● これまでA->Bという親⼦関係のあるSpanに対して以下のような検索は出来なかった ○ AでエラーになっているかつBでエラーになっているトレース Trace Queries とは? 1つのSpanに対してしか検索できない 両⽅でエラーが起きているTraceを検索できない

Slide 11

Slide 11 text

11 ● 他にもA->Bという親⼦関係のあるSpanに対して以下のような検索は出来なかった ○ Bが10s以上かかっているAのSpanをパスの種類毎に集計し多い順に並べる Trace Queries とは? パスの情報はこっちにあるので パスの種類毎に集計出来ない 検索しているSpanはここ 遅いクエリを検索することは出来る

Slide 12

Slide 12 text

12 ● DatadogのTraceをサービス間の依存関係も含めて検索できる機能 ○ これまで出来なかった柔軟な検索が可能に! Trace Queriesとは? Span毎に検索 検索したいSpan間の依存関係を設定 Trace全体の期間やSpan数を⼀緒に検索できる

Slide 13

Slide 13 text

  freeeでの実際の活⽤例

Slide 14

Slide 14 text

14 ● N+1を起こしているパスグループをN+1が起きている回数順にリスト化 N+1の依存関係があるリクエストを発⾒したい

Slide 15

Slide 15 text

15 N+1の依存関係があるリクエストを発⾒したい A B B B B …

Slide 16

Slide 16 text

16 N+1の依存関係があるリクエストを発⾒したい 検索したいSpan間の依存関係を設定 aのspan = envoyのspanの span tagであるパスグループで集計 Root Spanに絞ることでマイクロサービス間の envoyがカウントされないようにする ● Root Spanであるenvoyのspanに⼊っているパスグループの情報で集計する

Slide 17

Slide 17 text

17 ● slowクエリを起こしているパスグループをリクエスト数順にリスト化 slowクエリを起こしているリクエストパスを発⾒したい

Slide 18

Slide 18 text

18 ● slowクエリのうちライターインスタンスに向いているSELECT⽂をリスト化 ○ transactionを広く張っている関係上ライターに⾼負荷なSELECT⽂が流れていたことが可視化 ライターインスタンスへの遅いSELECT⽂を⾒つけたい SQLのspanに情報として⼊っている インスタンスの向き先で検索

Slide 19

Slide 19 text

19 ● Trace Queriesの使い⽅を実際のユースケース含めてDoc化 ○ これまでSREや⼀部のエンジニアしか使いこなせていなかった所からセルフサービスに! 誰でもDB負荷の原因を⾒つけるのに活⽤出来るように

Slide 20

Slide 20 text

20 ● エンジニア⾃⾝がTrace Queriesを⽤いて影響の⼤きそうな機能を修正することで負荷が軽減! ○ Writer インスタンスの負荷: DBLoad 25 %減 ○ SELECT クエリの Reader 使⽤率: 20%上昇 結果

Slide 21

Slide 21 text

21 ● Trace Queriesを使えば柔軟なTraceの検索が⾏なえより可観測性が向上する! ○ 今回⾒せたのは1例でSpan tagに埋めている情報次第で⾊々な活⽤法が考えられます ● Traceをエンジニア⾃⾝が⾒れるようにノウハウ化することで改善がより進むように! ○ Datadogをエンジニア⾃⾝が使えるようにする、つまりセルフサービス化することによりス トリームアラインドなチームへ ● Trace Queriesで負荷の⾼いリクエストを可視化することで⼤幅なDB負荷の削減の⼀助に! ○ 実際の修正は会計チームのメンバーやDBREの活動によるものです。ありがとうございまし た! まとめ

Slide 22

Slide 22 text

ご清聴ありがとうございました!