分散KVSについての覚書
分散KVSとは?
- KVSとはKeyとValueのペアで構成されるデータストア
- 分散KVSはKVSをマルチノードで実行できるKVS(雑な説明)
- Key-Valueストアと言いつつ実際にはRDBMSのように複数のカラムを持てるシステムの方が多い
何故分散KVSが注目されるのか?
- RDBMSよりもスケールさせやすく、ビッグデータや高負荷システムと相性が良いため(RDBMSはアーキテクチャの特性としてスケールしにくい)
- 分散KVSはACIDを犠牲にすることでWrite性能を確保している
- その代わり厳密なトランザクションに対応できなかったり、書き込みの反映がリアルタイムではなかったりする
- 書き込み負荷がマルチノードに分散するのでノードを増やせば増やすほど性能向上が見込める(理論的には)
- 結論、膨大なデータが発生する高負荷システムと相性がよい
RDBMSがスケールしにくい理由
- データの整合性に責任を持つことを重視しているから
- データの整合性を確保する為、書き込みはマスターに対して行わないといけない
- 当然、マスターに対して書き込みが集中するので、マスターがボトルネックになる
- また、整合性を確保する為にはデータ書き込みに対する排他制御が必要
- 排他制御が働いている間は後続の書き込み処理は待機するしかない
- 同時に大量のデータ書き込みが発生すると処理待ちの書き込み処理の渋滞が発生する
- 処理待ちの渋滞が起きればシステムのレスポンスは遅くなるし、処理待ちのデータをプールするバッファが枯渇すればデータをロストする
- 結論、Writeがボトルネックになってスケールしない
分散KVSが向いているユースケース
- 同時多発的に発生するデータを漏れなく蓄積していくシステム
- SNSや大規模掲示板の投稿やIoT機器のセンサーログなど、大量のデータが発生し続けるシステムが該当する
- RDBMSが大量のデータ書き込みに弱いことは先述した通り
- 一方、分散KVSは分散したノードに対して書き込みを行うので書き込み負荷も分散するので耐えられる負荷の上限がRDBMSより大きい
分散KVSが向いていないユースケース
- 読み込みがメインで書き込みの比率が少ないシステムでは分散KVSよりRDBMSを使った方がよい
- メディアサイトなどが典型的(書き込みは運営側だけ、ユーザーは閲覧のみ、というような)
- Readの性能はキャッシュとリードレプリカである程度担保できる
- SQLによる複雑なデータ抽出処理が必要なシステムにも向かない
- KVSのデータ抽出能力は基本的にそこまで高度ではない
- データの抽出や加工はある程度プログラム側で受け持つ必要がある
分散KVSを採用する際の注意事項
- 「よくわかっていないのに」「いきなり」「クリティカルなシステムに採用する」は炎上確定パターンなので絶対に避けるべき
- 「よくわからん」ぐらいの感じなら限界に達するまでRDBMSで頑張った方がよい
参考資料