判断: シャーディングかレプリケーションか (スケーリング)?
データベースのスケーリングの判断は、ボトルネックが読み取りか書き込みか、そしてデータが単一ノードに収まるかどうかによって決まる。誤った戦略は、不要な複雑さか、未解決のボトルネックを意味する。このツリーは、まず最も安価でシンプルな選択肢 (垂直スケーリング、キャッシュ) を想起させ、その上でリードレプリカとシャーディングの正しい選択を支援する。
最もシンプルな方法 (垂直スケーリングとクエリチューニング) を先に試したか?
分散アーキテクチャに移行する前に、最も安価な改善を取る: ハードウェアの増強 (CPU/RAM/IOPS)、不足しているインデックスの追加、高コストなクエリの修正で、ほとんどのボトルネックは解消する。複雑さを加えるのは、これらを尽くした後に限る。
- いいえ / まだ限界に達していない
- はい、垂直スケーリングとチューニングでは不十分
ボトルネックは読み取りか、それとも書き込み/データ量か?
スケーリング問題の発生源を切り分ける: 大量の読み取りクエリが単一ノードを圧迫している (読み取り中心) のか、それとも書き込みレートや総データサイズが単一ノードの容量を超えている (書き込み/データ量中心) のか? この区別がレプリカとシャーディングの根本的な違い。
- 読み取りトラフィックが支配的で、書き込みは単一ノードに収まる
- 書き込みレートまたはデータ量が単一ノードを超える
読み取りは反復的/キャッシュ可能か、それとも最新で多様か?
読み取りのボトルネックをさらに一段階切り分ける: 同じ結果が何度も読み取られている (キャッシュが非常に有効) のか、それとも読み取りが多様で広範かつ最新のデータを要求している (追加の読み取り容量が必要) のか? これによりキャッシュ層とリードレプリカのどちらにするかが決まる。
- 同じデータが繰り返し読み取られ、多少の古さは許容できる
- 多様/最新の読み取りで、純粋な読み取り容量が必要
推奨: まず垂直スケーリング + クエリチューニング
分散アーキテクチャに移行する前の、最初かつ最も安価な方法。ハードウェアの増強とクエリ/インデックスの修正で、運用の複雑さを加えることなく、ほとんどのスケーリング問題を解決できる。
推奨: リードレプリカ (読み取りのスケーリング)
書き込みは単一ノード (プライマリ) にとどめ、読み取りトラフィックを 1 つ以上のレプリカに分散する。読み取り中心のワークロードで、純粋な読み取り容量と耐障害性を高める標準的な方法。
推奨: キャッシュ層
頻繁に再読み取りされる結果を高速なインメモリ層に保持することで、データベースの負荷を大幅に削減する。適切なパターンを使えばデータベースにアクセスせずに応答でき、レイテンシと負荷の両方を低減する。
推奨: シャーディング (書き込み/データのスケーリング)
データはシャードキーで分割され、複数の独立したノードに分散される。各ノードがデータの一部とその書き込みを担当する。書き込みレートと総データ量をスケールする方法だが、大きな複雑さが加わる。