システムデザイン レッスン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

データベースのレプリケーションの主な目的として適切なものはどれか?