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-splitting
Search
Satoshi Kawashima
June 04, 2020
Technology
1
26k
既存サービスに後から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
7.8k
BASE大規模リアーキテクチャリング / base_rearchitecturing
nazonohito51
17
11k
社内勉強会でOOPとCleanArchitectureとDDDを勉強し始めたというお話
nazonohito51
7
4.8k
CakePHP2でもPhpStormがコード補完してくれるようにした話 / cakephp2-ide-helper
nazonohito51
1
2k
PHPStanでCustomRuleを作る / Make PHPStan CustomRule
nazonohito51
5
3.2k
単方向依存を実現する静的解析ライブラリのご紹介 / Analyze PHP Dependencies
nazonohito51
2
5.1k
「SOLIDの原則って何ですか?」って質問に答えたかった / What's SOLID principle
nazonohito51
3
1.6k
ドキュメントルート配下に全てのPHPファイルが置かれていた環境をindex.phpだけにした話 / document root
nazonohito51
1
3.4k
アジャイル開発でのソフトウェア設計
nazonohito51
0
760
Other Decks in Technology
See All in Technology
コンパウンドスタートアップのためのスケーラブルでセキュアなInfrastructure as Codeパイプラインを考える / Scalable and Secure Infrastructure as Code Pipeline for a Compound Startup
yuyatakeyama
4
4.7k
アクセシビリティを考慮したUI/CSSフレームワーク・ライブラリ選定
yajihum
2
1k
「スニダン」開発組織の構造に込めた意図 ~組織作りはパッションや政治ではない!~
rinchsan
3
540
EMとして2023年度に頑張ったこと / What we did well in FY2023 as a EM
pauli
1
160
Terraformあれやこれ/terraform-this-and-that
emiki
8
1.4k
生産性向上チームの紹介
cybozuinsideout
PRO
1
870
GraphQL 成熟度モデルの紹介と、プロダクトに当てはめた事例 / GraphQL maturity model
mh4gf
7
1.3k
コンテナセキュリティの基本と脅威への対策
kyohmizu
3
750
VS CodeでAWSを操作しよう
smt7174
7
1.6k
Janus
bkuhlmann
1
490
Hands-on Gemini, the Google DeepMind LLM
meteatamel
1
110
ワールドカフェI /チューターを改良する / World Café I and Improving the Tutors
ks91
PRO
0
120
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
37
2.5k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
Building Applications with DynamoDB
mza
88
5.6k
The Illustrated Children's Guide to Kubernetes
chrisshort
31
46k
4 Signs Your Business is Dying
shpigford
175
21k
Unsuck your backbone
ammeep
663
57k
Designing the Hi-DPI Web
ddemaree
276
33k
Building a Scalable Design System with Sketch
lauravandoore
456
32k
What's new in Ruby 2.0
geeforr
337
31k
YesSQL, Process and Tooling at Scale
rocio
164
13k
5 minutes of I Can Smell Your CMS
philhawksworth
199
19k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
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. ご清聴 ありがとうございました