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
既存サービスに後からR/W Splittingライブラリを入れる時に考えたこと / r-w-s...
Search
Satoshi Kawashima
June 04, 2020
Technology
1
28k
既存サービスに後からR/W Splittingライブラリを入れる時に考えたこと / r-w-splitting
R/W Splittingライブラリを自作する際に考えたことと、
実際に使い始めてどうだったかについて振り返ってみました
Satoshi Kawashima
June 04, 2020
Tweet
Share
More Decks by Satoshi Kawashima
See All by Satoshi Kawashima
モジュラモノリスにおけるトランザクション設計の考え方 / transaction design on modular monolith
nazonohito51
17
8.6k
BASE大規模リアーキテクチャリング / base_rearchitecturing
nazonohito51
17
11k
社内勉強会でOOPとCleanArchitectureとDDDを勉強し始めたというお話
nazonohito51
7
5.1k
CakePHP2でもPhpStormがコード補完してくれるようにした話 / cakephp2-ide-helper
nazonohito51
1
2.2k
PHPStanでCustomRuleを作る / Make PHPStan CustomRule
nazonohito51
5
3.8k
単方向依存を実現する静的解析ライブラリのご紹介 / Analyze PHP Dependencies
nazonohito51
2
5.5k
「SOLIDの原則って何ですか?」って質問に答えたかった / What's SOLID principle
nazonohito51
4
1.8k
ドキュメントルート配下に全てのPHPファイルが置かれていた環境をindex.phpだけにした話 / document root
nazonohito51
1
3.7k
アジャイル開発でのソフトウェア設計
nazonohito51
0
810
Other Decks in Technology
See All in Technology
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
200
DUSt3R, MASt3R, MASt3R-SfM にみる3D基盤モデル
spatial_ai_network
2
160
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
200
podman_update_2024-12
orimanabu
1
280
GitHub Copilot のテクニック集/GitHub Copilot Techniques
rayuron
37
14k
How to be an AWS Community Builder | 君もAWS Community Builderになろう!〜2024 冬 CB募集直前対策編?!〜
coosuke
PRO
2
2.8k
.NET 9 のパフォーマンス改善
nenonaninu
0
990
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
260
ずっと昔に Star をつけたはずの思い出せない GitHub リポジトリを見つけたい!
rokuosan
0
150
[Ruby] Develop a Morse Code Learning Gem & Beep from Strings
oguressive
1
170
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
550
KubeCon NA 2024 Recap: How to Move from Ingress to Gateway API with Minimal Hassle
ysakotch
0
200
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Statistics for Hackers
jakevdp
796
220k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Navigating Team Friction
lara
183
15k
Scaling GitHub
holman
458
140k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
Making Projects Easy
brettharned
116
5.9k
Building Adaptive Systems
keathley
38
2.3k
Building an army of robots
kneath
302
44k
GitHub's CSS Performance
jonrohan
1030
460k
Transcript
© - BASE, Inc. 2020/06/04 コネヒトマルシェ オンライン 川島 慧/@nazonohito 既存サービスに後から
R/W Splittingライブラリを⼊れる時に考えたこと
© - BASE, Inc. Product Division 川島 慧 @nazonohito
© - BASE, Inc. BASEがR/W Splittingを開始してから ちょうど1年経ったので、 ライブラリ製作者の視点から振り返ってみます
© - BASE, Inc. そもそもR/W Splittingとは?
© - BASE, Inc. R/W Splittingとは • Read/Write Splitting •
マスター/リードレプリカ構成のRDBMSに対して負 荷分散の⽬的でアプリケーションのアクセス先を制 御する • 参照系クエリをリードレプリカに寄せることでマス ターのマシンリソースを有効活⽤できるようになる
© - BASE, Inc. 背景について
© - BASE, Inc. BASEの背景 • サービスの成⻑によってトラフィックの量が増⼤していた • ⼈気ショップのセールによる瞬間的な⾼負荷が発⽣すること もあった
BASEが今後も安定して成⻑していくために データベースのスケーラビリティが ⼤きな課題になってきた
© - BASE, Inc. それまでのR/W Splitting事情 • CakePHP 公式で⽤意されている仕組みはない •
リード専⽤ModelやBehaviorによって部分的に実現 していたが、もっと汎⽤的なR/W Splittingライブラ リが必要になってきたので作ることになった • ※コネヒトさんがCakePHP のR/W Splittingライブラリを公開する以前なの で⾃作するしかなかった
© - BASE, Inc. 実装⽅針を考える
© - BASE, Inc. 主な関⼼事 • アクセス先の明⽰的に切り替えを可能にする仕組み が欲しい • 既存の巨⼤なコードベースにどうシームレスに導⼊
していくか • ⼤規模な切り替えをどう安全に実現していくか
© - BASE, Inc. ユースケースを想定して設計する • 既存コードに対するR/W Splittingの適⽤⽅法をある 程度類型化して考えを整理する
© - BASE, Inc. ユースケースの想定
© - BASE, Inc. ユースケース1:スロークエリを狙い撃ちした部分適⽤ • NewRelicなどのアプリケーション監視からボトル ネックとなっているクエリを発⾒して、それだけを リードレプリカに向ける •
クエリの実⾏負荷は特定のクエリに偏在しているの で、最も費⽤対効果の⾼い適⽤⽅法
© - BASE, Inc. ユースケース2:コントローラアクション単位で適⽤ • コントローラアクション単位でリードレプリカに向 ける • 参照系コントローラアクションなど、参照クエリし
か無いと分かっている箇所にまとめてリードレプリ カに向ける
© - BASE, Inc. ユースケース3:アプリケーション単位で適⽤ • アプリケーション単位で全てのDBアクセスをデフォ ルトではリードレプリカへ向けてしまうドラス ティックな適⽤ •
更新系クエリ全てに対して明⽰的にマスターへ向け てやる必要がある • 最も負荷分散の効果が⾼いが、更新系クエリの⾒逃 しやレプリケーション遅延による影響が危惧される
© - BASE, Inc. 3つの想定ユースケース • 後者のユースケースほど適⽤範囲が広くて適⽤が⼤変 • 初期導⼊時に広範囲のコードを読む必要がある •
後の改修の影響を受けやすいリスクが有る 最初は参照クエリだけだったが、 後の改修で更新クエリが 発⾏されるようになる可能性がある
© - BASE, Inc. 考えたこと • 基本的にはスロークエリを狙い撃ちするアプローチ になると思う • ただDBコネクション数を減らす効果は薄いので、広
い範囲への適⽤はいずれ避けられないと考えていた
© - BASE, Inc. 部分適⽤ではコネクション数は減らない 参照クエリ 参照クエリ 参照クエリ 参照クエリ 参照クエリ
参照クエリ 参照クエリ ͱ͋ΔࢀরΫΤϦ͔͠ൃߦ͠ͳ͍ ίϯτϩʔϥΞΫγϣϯ͕ݺΕͨ࣌ マスター
© - BASE, Inc. 部分適⽤ではコネクション数は減らない 参照クエリ 参照クエリ 参照クエリ 参照クエリ 参照クエリ
参照クエリ 参照クエリ ͱ͋ΔࢀরΫΤϦ͔͠ൃߦ͠ͳ͍ ίϯτϩʔϥΞΫγϣϯ͕ݺΕͨ࣌ マスター マスター リードレプリカ スロークエリなので リードレプリカへ ※DBコネクションは計2つ⽣成される
© - BASE, Inc. 部分適⽤ではコネクション数は減らない 参照クエリ 参照クエリ 参照クエリ 参照クエリ 参照クエリ
参照クエリ 参照クエリ ͱ͋ΔࢀরΫΤϦ͔͠ൃߦ͠ͳ͍ ίϯτϩʔϥΞΫγϣϯ͕ݺΕͨ࣌ リードレプリカ ※理想的な状態はこっち、DBコネクションは1つ
© - BASE, Inc. 安全装置の実装 • リードレプリカに発⾏してほしくないクエリが実⾏ されかけた場合に、ライブラリ側で検知して⾃動で マスターへ切り替える仕組み •
リードレプリカに発⾏されてほしくないもの • 更新系クエリ • トランザクション • etc
© - BASE, Inc. 安全装置の実装 Model Switchable Datasource Behavior Switchable
Mysql (DataSource) SwitchablePDO PDO PDO Master ReadReplica ReadReplica ModelίʔϧόοΫʹΑͬͯ ॻ͖ࠐΈɾআΛݕ (beforeSave/beforeDelete) τϥϯβΫγϣϯ։࢝Λݕ ߋ৽ܥΫΤϦΛ ਖ਼نදݱͰݕ
© - BASE, Inc. R/W Splittingの適⽤
© - BASE, Inc. 適⽤してからしばらくは • 基本的にはスロークエリを狙い撃ちした部分適⽤だ けが使われた • コントローラアクション単位の適⽤はごく⼀部で⾏
われてきたがほとんど⾏われることはなかった
© - BASE, Inc. ⼀度だけコネクション数が減らしたいタイミングがあった • マスターのコネクションキャパシティの上限が近づ いてコネクション数を減らす必要が出てきた • アプリケーション単位での切り替え(デフォルトで
リードレプリカに向けて、更新系クエリが投げられ る箇所を明⽰的にマスターへ向ける)を実⾏した • ほとんど参照しか無いと分かっているアプリケー ションだったので⼤丈夫だと判断された
© - BASE, Inc. ドラスティックな切り替えの⽅法 • コードを全部調べ上げてやるのは量的に厳しい • ⾃動テストや⼿動テストで動作確認しつつ、漏れた 部分は安全装置による⾃動切り替えに頼って切り替
えを実⾏した
© - BASE, Inc. ⼤規模切り替えの結果
© - BASE, Inc. ⼤規模切り替えの結果 • うまくいった ϦϦʔεલ Ϛελʔ:ϦʔυϨϓϦΧͷ ίωΫγϣϯ
͓͓Αͦ3:1 ϦϦʔεޙ΄΅1:1 ϚελʔͷίωΫγϣϯ 1/2ۙ͘·ͰԼ͕Γɺ ٯʹϦʔυϨϓϦΧ2ഒʹͳͬͨ
© - BASE, Inc. ⼤規模切り替えの結果 • サービス影響は出さずにコネクションを⼤幅に減ら せた • 参照クエリの殆どがリードレプリカに向いたのでマ
スターの負荷も下がった • ただし、その裏側では安全装置が凄まじい回数起動 していた • 安全装置によってサービス影響が抑えられていた
© - BASE, Inc. 考察 • ドラスティックな切り替えでも安全装置があれば案 外なんとかなってしまった • ⼈間が頑張らない機械的なアプローチでもいくつか
条件が重なればこういうアプローチもありうること が分かった ※レプリケーション遅延による更新の反映されていない参照が発⽣するリスクは潜在的にあるが、 Auroraはレプリケーション遅延が発⽣しづらいらしいのでそこで抑えられているのかもしれない
© - BASE, Inc. まとめ • 既存のコードベースに後からR/W Splittingを導⼊し ていく際に考えたことを共有 •
基本的にはスロークエリを狙い撃ちした部分適⽤で 良さそうだが、コネクション数の削減を⽬指すと⼤ 規模な導⼊は避けられない • ⼤規模な導⼊をする際は切り替えを⾃動化する仕組 みがあれば⼈間が頑張らずうまくいくケースがある
© - BASE, Inc. ご清聴 ありがとうございました