リードレプリカ
プライマリ DB の読み取り専用コピーで、読み取り負荷を分散しスケーラビリティを向上させる
データベーススケーリング
リードレプリカとは
リードレプリカは、プライマリ DB の読み取り専用コピーで、読み取り負荷を分散しスケーラビリティを向上させる。書き込みはプライマリのみ、読み取りはレプリカに分散する。
仕組み
書き込み → プライマリ DB
↓ 非同期レプリケーション
読み取り → リードレプリカ 1
読み取り → リードレプリカ 2
読み取り → リードレプリカ 3
Aurora のリードレプリカ
| 観点 | RDS リードレプリカ | Aurora リードレプリカ |
|---|---|---|
| 最大数 | 5 | 15 |
| レプリケーション遅延 | 数秒 | 数十ミリ秒 |
| フェイルオーバー | 手動昇格 | 自動フェイルオーバー |
| ストレージ | 独立 | 共有 (クラスタボリューム) |
DynamoDB のリードレプリカ
DynamoDB は内部的に 3 つの AZ にレプリカを持つ。明示的なリードレプリカの設定は不要。
// 結果整合性 (デフォルト): 任意のレプリカから読み取り (高速)
await db.get({ TableName: 'users', Key: { id: '123' } });
// 強い整合性: プライマリレプリカから読み取り (やや遅い)
await db.get({ TableName: 'users', Key: { id: '123' }, ConsistentRead: true });
リードレプリカの注意点
| 注意点 | 対策 |
|---|---|
| レプリケーション遅延 | 書き込み直後の読み取りはプライマリから |
| 結果整合性 | Read Your Own Writes パターン |
| 書き込みはプライマリのみ | アプリケーションで接続先を分離 |
Read Your Own Writes
// 書き込み直後はプライマリから読み取り
await db.put({ TableName: 'users', Item: updatedUser });
// 直後の読み取り: 強い整合性
const user = await db.get({
TableName: 'users',
Key: { id: updatedUser.id },
ConsistentRead: true,
});
// それ以外の読み取り: 結果整合性 (デフォルト)
リードレプリカ vs キャッシュ
| 観点 | リードレプリカ | キャッシュ (DAX, ElastiCache) |
|---|---|---|
| データの鮮度 | 数ミリ秒〜数秒遅れ | TTL に依存 |
| 一貫性 | 結果整合性 | キャッシュミス時に DB から取得 |
| コスト | DB インスタンス費用 | キャッシュノード費用 |
| 用途 | 読み取り負荷の分散 | 低レイテンシの読み取り |
リードレプリカの理解を深めるには関連書籍が参考になる。