リードレプリカ

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

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

リードレプリカとは

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

仕組み

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

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

Aurora のリードレプリカ

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

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

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

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

関連用語

関連する記事