リードレプリカ

プライマリ DB の読み取り専用コピーで、読み取り負荷を分散しスケーラビリティを向上させる

データベーススケーリング

リードレプリカとは

リードレプリカは、プライマリ DB の読み取り専用コピーで、読み取り負荷を分散しスケーラビリティを向上させる。書き込みはプライマリのみ、読み取りはレプリカに分散する。

仕組み

プライマリ DB への書き込みが非同期でリードレプリカにレプリケーションされる。読み取りリクエストをリードレプリカに分散することで、プライマリの負荷を軽減し、読み取りスループットを向上させる。ただし非同期レプリケーションのため、書き込み直後にリードレプリカを読むと古いデータが返る可能性がある (レプリケーション遅延)。

書き込み → プライマリ DB
              ↓ 非同期レプリケーション
読み取り → リードレプリカ 1
読み取り → リードレプリカ 2
読み取り → リードレプリカ 3

Aurora のリードレプリカ

Aurora のリードレプリカを以下にまとめる。

観点RDS リードレプリカAurora リードレプリカ
最大数515
レプリケーション遅延数秒数十ミリ秒
フェイルオーバー手動昇格自動フェイルオーバー
ストレージ独立共有 (クラスタボリューム)

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

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

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

この記事は役に立ちましたか?

関連用語

関連する記事