レプリケーションとシャーディング
同じデータを複数台にコピーして守る・読みを分散するのがレプリケーション、データそのものを分割して書き込みを分散するのがシャーディング。DBを大きくする2つの方向。
- 1.レプリケーション=“コピー”:同じデータを複数台に複製し、可用性と読み取りスケールを稼ぐ(書き込み量は増えない)。
- 2.シャーディング=“分割”:データ自体を複数台に分けて、書き込み・容量をスケールさせる(その代わり横断クエリが難しくなる)。
- 3.非同期レプリケーションには遅延(レプリカラグ)があり、コピーは一瞬古い。フェイルオーバー時のデータ欠落とも背中合わせ。
なぜ DB を増やすのか
最初は1台の DB で十分でも、アクセスとデータが増えると壁にぶつかります。台数を増やして性能を上げる(スケールアウト)には、大きく2つの方向があります。
- 読み取りが多すぎる/止まると困る → コピーを増やす=レプリケーション
- 書き込みが多すぎる/データが1台に乗り切らない → 分けて配る=シャーディング
この2つは目的が違うので、しばしば併用します(各シャードをさらにレプリケーションして冗長化する、など)。まずは別物として押さえましょう。
レプリケーション:同じデータを複製する
典型構成は プライマリ(書き込み担当) と レプリカ(読み取り担当、別名リードレプリカ) の組み合わせです。
- 書き込みはプライマリ1台が受ける。
- プライマリは変更ログ(更新の履歴)をレプリカへ送り、レプリカが同じ更新を再生して追従する。
- アプリは読み取りを複数のレプリカに分散できる。
これで「読み取りが多い」アプリは台数ぶん読みをさばけ、プライマリが壊れてもレプリカを昇格させて復旧できます(後述のフェイルオーバー)。
レプリカを何台増やしても、書き込みは結局プライマリ1台が受けます。むしろレプリカへ複製を配る負荷が増えるぶん、書き込み性能は上がりません。「書き込みが詰まっている」問題の答えはレプリケーションではなく、シャーディング(や設計見直し)です。ここを取り違えると、台数を足しても改善しません。
同期レプリケーション vs 非同期レプリケーション
複製を「いつ確定とみなすか」で2種類に分かれます。これが遅延とデータ欠落のトレードオフの核心です。
| 観点 | 同期(synchronous) | 非同期(asynchronous) |
|---|---|---|
| 書き込み完了の条件 | レプリカへの反映を待ってから完了 | プライマリに書けた時点で完了 |
| 書き込みの速さ | 遅い(レプリカ待ちぶん) | 速い |
| 障害時のデータ欠落 | 起きにくい | 未反映ぶんが消えうる |
| レプリカの新しさ | ほぼ最新 | わずかに古い(ラグあり) |
| 向く場面 | 1件も失えない決済など | 多くの一般的なWebサービス |
多くの実システムは非同期(または準同期)をデフォルトにし、速さを取りつつ「ほんの少し古い・最悪わずかに欠落しうる」を受け入れます。逆に金額や在庫など1件も失えない箇所だけ同期にする、といった使い分けが現実的です。
シャーディング:データを分割する
シャーディングは、1つの大きなテーブル(やDB)を、ある基準で行を複数のサーバー(シャード)に振り分けること。テーブルを縦ではなく横(行単位)で割るので「水平分割」とも呼びます。
どの行をどのシャードに置くかを決める鍵が シャードキー(パーティションキー) です。代表的な分け方は次の通り。
| 方式 | 分け方 | 長所 | 短所 |
|---|---|---|---|
| レンジ | 値の範囲で区切る(例: 日付・IDの帯) | 範囲検索が速い | 特定範囲に集中(ホットスポット)しやすい |
| ハッシュ | キーのハッシュ値で振り分け | 負荷が均等になりやすい | 範囲検索が全シャードに散る |
| ディレクトリ | 対応表で明示的に割り当て | 柔軟に再配置できる | 対応表が単一障害点になりがち |
-- イメージ:user_id を 4 シャードに振り分ける(ハッシュ方式)
-- shard_no = user_id % 4
SELECT * FROM users WHERE user_id = 1234; -- → shard (1234 % 4 = 2) だけに問い合わせ
シャードキーで1件を引くクエリは速い一方、全ユーザーを横断するような集計は全シャードに投げて結果をマージする必要があり、重くなります。
シャーディング最大の落とし穴はシャードキーの選定ミスです。偏ったキー(例:国コードで割って特定国にアクセスが集中)を選ぶと、1つのシャードだけが過負荷になるホットスポットが生まれ、分散した意味がなくなります。さらに、後からキーを変えるには**全データの再配置(リシャーディング)**が必要で、運用中のDBでは極めて高コスト。シャーディングは「最後の手段」とされ、まずインデックスやレプリケーション、キャッシュで足りないか検討するのが定石です。
2つの違いを整理
| 観点 | レプリケーション(複製) | シャーディング(分割) |
|---|---|---|
| 各サーバーが持つデータ | 全データの“同じコピー” | 全データの“一部ずつ” |
| 主な目的 | 可用性・読み取りスケール | 書き込み・容量スケール |
| スケールする方向 | 読み取り | 書き込み+容量 |
| 1台失った時 | 他のコピーで継続できる | その範囲のデータが欠ける(要冗長化) |
| 導入の難しさ | 比較的やさしい | 難しい(キー設計・再配置) |
ポイントは「レプリケーションは台数を増やしても“同じ中身”、シャーディングは台数を増やすと“違う中身”」。だからレプリカは1台失っても代わりがいますが、シャードは1つ失うとその範囲のデータが欠ける——だからシャードもさらにレプリケーションして守る、という併用に行き着きます。
つまずきポイント
レプリカラグ(複製遅延):コピーは一瞬“古い”
非同期レプリケーションでは、プライマリへの書き込みがレプリカへ届くまでにわずかな時間差があります。これがレプリカラグ。通常は数ミリ〜数十ミリ秒ですが、負荷が高いと数秒に伸びることもあります。
「投稿した直後、リロードしたら自分の投稿が消えている」——これはレプリカラグの典型症状です。書き込みはプライマリ、直後の読み取りはまだ未反映のレプリカへ行くと起こります。対策は、書き込み直後の読み取りだけプライマリに向ける(read-your-writes 一貫性)、重要な画面はプライマリから読む、などです。「結果整合性(eventual consistency)」=“いずれ揃うが今は揃っていないかも”を前提に設計する必要があります。
フェイルオーバー:プライマリが落ちたら誰が引き継ぐ
プライマリが故障したとき、レプリカの1台を新しいプライマリに昇格させて運転を続けることをフェイルオーバーと呼びます(自動/手動があります)。可用性の要ですが、注意点が2つ。
- 非同期構成では、未反映ぶんのデータが失われることがある(昇格したレプリカが最新まで追いつけていない)。
- 古いプライマリが復活して2台が同時にプライマリだと思い込むと、書き込みが衝突する。これをスプリットブレインと呼び、避けるための仕組み(過半数決定など)が必要です。
レプリカを置くだけでは半分。フェイルオーバーが実際に・正しく動くかを平時に試しておくことが大切です。昇格の自動化、ラグの監視、アプリ側の接続先切り替えまで含めて初めて「高可用性」になります。
まとめ
レプリケーションは“同じデータを複製”して可用性と読み取りを稼ぐ、シャーディングは“データを分割”して書き込みと容量を稼ぐ——目的が違うので、大規模システムでは併用します。非同期レプリケーションにはレプリカラグがあり、コピーは一瞬古い。フェイルオーバーは可用性の要ですが、データ欠落やスプリットブレインと隣り合わせ。まずはレプリケーションとキャッシュで読みを、それでも書き込みが詰まるならシャーディングを——という順番で考えるのが安全です。手元のデータベースが RDB か NoSQL かでも勘所は変わるので、RDBとNoSQLも合わせてどうぞ。
データベース Article
レプリケーションとシャーディングを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
DB
比較で見る軸
難易度: intermediate / カテゴリ: データベース / タグ数: 3
導入後に効く点
シャーディング=“分割”:データ自体を複数台に分けて、書き込み・容量をスケールさせる(その代わり横断クエリが難しくなる)。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- データベース
- タグ数
- 3
判断チェックリスト
- 自社の用途が「DB / スケーラビリティ」に近いか確認する。
- 強みである「レプリケーション=“コピー”:同じデータを複数台に複製し、可用性と読み取りスケールを稼ぐ(書き込み量は増えない)。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。