システムデザイン レッスン4
データベースのスケーリング
レプリケーション・シャーディングなどデータベースを水平・垂直にスケールさせる手法を学ぶ
垂直スケーリングの限界
データベースもアプリケーションサーバーと同様、まずは1台のマシンの性能(CPU/メモリ/ディスク)を 増強する垂直スケーリングで対応することが多いですが、データ量やアクセス数が一定を超えると 物理的な上限やコストの急増によって限界を迎えます。そこで登場するのがレプリケーションとシャーディングという 水平方向の対処法です。
レプリケーション(読み取りレプリカ)
レプリケーションは、同じデータの複製を複数のノードに持たせる手法です。典型的な構成では、 書き込みを1台のプライマリ(Primary)に集約し、 複数のレプリカ(Replica)が読み取り専用として複製を保持します。
Write requests --> Primary DB
|
replicate (非同期 or 同期)
|
+--------------+--------------+
v v
Replica DB 1 Replica DB 2
^ ^
+------ Read requests ---------+読み取りリクエストをレプリカに分散させることで、プライマリの負荷を下げつつ読み取り性能をスケールできます。 非同期レプリケーションの場合、プライマリへの書き込み直後はレプリカにまだ反映されていない 「レプリケーション遅延」が生じうる点に注意が必要です。
シャーディング(水平分割)
シャーディングは、データそのものを複数のノード(シャード)に分割して配置する手法です。 レプリケーションが「同じデータの複製」なのに対し、シャーディングは「異なるデータを別々の場所に置く」点が異なります。
Partition Key: user_id % 3
user_id = 1, 4, 7, ... --> Shard 0
user_id = 2, 5, 8, ... --> Shard 1
user_id = 0, 3, 6, ... --> Shard 2
Application --> Router --+--> Shard 0 (users 1,4,7,...)
+--> Shard 1 (users 2,5,8,...)
+--> Shard 2 (users 0,3,6,...)パーティションキーの選び方によって、特定のシャードにデータやアクセスが偏る「ホットスポット」が 発生することがあるため、キー設計は慎重に行う必要があります。
トレードオフ
レプリケーション
- • 読み取りをスケールでき、障害時の冗長性も得られる
- • 書き込みは基本的にプライマリ1台のままでボトルネックになりやすい
- • 非同期レプリケーションではレプリケーション遅延が発生しうる
シャーディング
- • 書き込みも含めてスケールでき、データ量の増加にも対応できる
- • 複数シャードをまたぐ結合・集計クエリが難しくなる
- • パーティションキー次第でデータ・アクセスの偏りが生じる
ポイント
- 垂直スケーリングには限界があり、水平方向のレプリケーション・シャーディングが必要になる
- レプリケーションは同じデータの複製で読み取りスケールと冗長性、シャーディングはデータ分割で書き込みも含めたスケールを実現する
- どちらもクロスノードの整合性・クエリの複雑さという代償を伴うため、必要性を見極めて導入する
確認クイズ
1 / 3データベースのレプリケーションの主な目的として適切なものはどれか?