リードレプリカ

プライマリ 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 インスタンス費用 キャッシュノード費用
用途 読み取り負荷の分散 低レイテンシの読み取り

リードレプリカの理解を深めるには関連書籍が参考になる。

関連用語