スケールするウェブアプリケーションを20分で作る方法
Q4M の開発者でもある kazuho さんのセッション。
RDB の Sharding について。
Sharding するときに問題になるのは非正規化。
Twitter とかで発言があった場合に、全員のとこに発言があったことを書き込む必要がある。
既存手法
- eventual consistency
- 複数の DB へ非同期に書き込む
- いいとこ: レスポンスが早い / スケールしやすい
- 悪いとこ: メンテナンスが困難
- 複数の DB へ非同期に書き込む
- 2 phase commit
- 複数のDB書き込みが同期的
- いいとこ: 同期的
- 悪いとこ: レスポンス悪い / スケールしにくい
- 複数のDB書き込みが同期的
問題
- 書き込みクエリが複雑
- 一貫性を保証するのが難しい
- サービス停止なしでスケールできない
- 可能な限りダウンタイムなしでスケールしたい
作っているツール 「Incline」
2 つの問題を解決する
- 書き込みクエリが難しいという問題
- メンテナンスが大変という問題
基本的なアイデア
プログラマが非正規化を意識しなくていい。
それぞれのテーブルに Queue を持ち、それを使って全部自動でやってくれる。
トリガは定義ファイルから生成。
ノード内は同期的。
ノード間の通信は非同期。
C++ で実装している。
おまけ
Hash Base の Sharing と Range Base の Shaing
個人的には Range Base の Sharing がいいと思っている
- あるレンジを指定して DB 引く機会がしばしばある
- 手動でのメンテナンスがカンタン
- 運用もらくらく