リードレプリカが存在する理由と実際に役立つ場面
リードレプリカが存在する理由、解決する問題、実際に役立つ/裏目に出る場面を解説します。一般的なユースケース、制限、実務的な判断ポイントを含みます。

リードレプリカとは(そして何ではないか)
リードレプリカは、メインのデータベース(しばしばプライマリと呼ばれる)のコピーで、プライマリから継続的に変更を受け取り最新状態を保ちます。アプリはレプリカに読み取り専用のクエリ(例:SELECT)を送れる一方、プライマリは引き続きすべての書き込み(INSERT、UPDATE、DELETEなど)を処理します。
基本的な約束事
約束はシンプルです:プライマリに余計な負荷をかけずに読み取りキャパシティを増やすこと。
アプリにホームページ、商品ページ、ユーザープロファイル、ダッシュボードなどの“取得”トラフィックが多い場合、それらの読み取りの一部を一つ以上のレプリカに移すことでプライマリが書き込みと重要な読み取りに集中できるようになります。多くの構成ではアプリ側の変更は最小限で済みます:一つのデータベースをソースオブトゥルースとして残し、レプリカをクエリ先として追加するだけです。
リードレプリカが何でないか
リードレプリカは有用ですが魔法のボタンではありません。次のことはできません:
- 書き込み能力を増やすこと。すべての書き込みは依然としてプライマリに入ります。
- 遅いクエリを根本的に直すこと。クエリが非効率(インデックス不足、巨大なテーブル走査、悪い結合)なら、レプリカでも遅くなる可能性が高いです——ただし別の場所で遅くなるだけです。
- 良いスキーマやデータ設計の代替にはならない。ホットスポット、過大な行、肥大化した“何でもテーブル”はレプリカで解決しません。
- 監視の必要を消すことはない。レプリカは遅延、接続上限、フェイルオーバー挙動などの可動部分を増やします。
以降のガイドの期待設定
レプリカを「トレードオフのある読み取りスケーリング手段」と考えてください。以下では、実際に役立つ場面、よく裏目に出るパターン、そしてレプリケーションラグや最終的整合性がレプリカから読む際にユーザが見る挙動にどう影響するかを説明します。
リードレプリカが存在する理由
単一のプライマリデータベースサーバーは、最初は“十分大きい”ように見えます。書き込み(インサート、更新、削除)を処理し、アプリ、ダッシュボード、内部ツールからのすべての読み取り(SELECT)にも応答します。
利用が増えると、通常読み取りが書き込みよりも早く増えます:ページビューごとに複数のクエリが走ることがあり、検索画面は多くのルックアップを発生させ、分析系クエリは大量の行をスキャンします。書き込み量が中程度でも、プライマリは変更を安全に素早く受け入れることと、増え続ける読み取りトラフィックに低レイテンシで応答するという二つの仕事を同時にこなさねばならず、ボトルネックになり得ます。
読み取りと書き込みを分離する
リードレプリカはその負荷を分割するために存在します。プライマリは書き込みと“真実のソース”の維持に集中し、1つ以上のレプリカが読み取り専用クエリを処理します。アプリがレプリカに一部のクエリをルーティングできれば、プライマリのCPU、メモリ、I/O負荷が減り、全体的な応答性が改善し、書き込みバーストに対する余裕が生まれます。
レプリケーションを一言で
レプリケーションは、プライマリから他のサーバに変更をコピーしてレプリカを最新に保つ仕組みです。プライマリが変更を記録し、レプリカがそれらを適用してほぼ同じデータでクエリに応答できるようにします。
このパターンは多くのデータベースシステムやマネージドサービス(PostgreSQL、MySQL、クラウドのバリアントなど)で共通です。実装の細部は異なりますが、目的は同じ:プライマリを無限に垂直スケールさせることなく読み取りキャパシティを増やすことです。
レプリケーションの仕組み(シンプルなメンタルモデル)
プライマリデータベースを“真実のソース”と考えてください。プライマリはすべての書き込み——注文作成、プロファイル更新、支払記録——を受け入れ、それらに確定的な順序を割り当てます。
1つ以上のリードレプリカはプライマリを追いかけ、変更をコピーして読み取りクエリに応答できるようにします(例:「自分の注文履歴を表示」)。
基本的なフロー
- プライマリが書き込みを受け入れると、それを耐久的なログに記録する(データベースによって呼び名は異なる)。
- レプリカはそのログエントリをストリームまたは取得する。
- レプリカは同じ順序で変更を再生し、徐々に追いつく。
読み取りはレプリカから提供できますが、書き込みは依然としてプライマリへ行きます。
同期レプリケーションと非同期レプリケーション(概要)
レプリケーションには大きく分けて二つのモードがあります:
- 同期:プライマリはレプリカ(またはクォーラム)が変更を受け取った確認を待ってから書き込みを“コミット済み”と見なします。これにより古い読み取りは減りますが、書き込みレイテンシが増え、レプリカやネットワークの問題に敏感になります。
- 非同期:プライマリは即座に書き込みをコミットし、レプリカは後で追いつきます。これにより書き込みは速く堅牢になりますが、レプリカは一時的に遅れる可能性があります。
レプリケーションラグと「最終的整合性」
レプリカがプライマリに遅れるその差をレプリケーションラグと呼びます。ラグは自動的に障害を意味するわけではなく、読み取りスケールを優先する際によく受け入れられるトレードオフです。
エンドユーザにとって、ラグは最終的整合性として現れます:なにかを変更しても、システムはやがてどこでも一貫した状態になりますが、即座ではないことがあります。
例:メールアドレスを更新してプロファイルページをリフレッシュしたとします。ページが数秒遅れたレプリカから返されると、古いメールアドレスが一瞬表示されるかもしれません——レプリカがその更新を適用して“追いつく”までの間は。
リードレプリカが実際に役立つとき
リードレプリカは、プライマリが書き込みには健全だが 読み取りトラフィックの処理に圧倒されている場合に役立ちます。書き込み方法を変えずに意味のある割合のSELECT負荷をオフロードできるときに最も効果的です。
あなたが読み取りボトルネックかどうかのサイン
次のようなパターンを探してください:
- トラフィックピーク時にプライマリのCPUが高負荷になっているが、書き込みスループット自体は異常ではない
SELECTの比率がINSERT/UPDATE/DELETEに比べて非常に高い- ピーク時に読み取りが遅くなるが書き込みは安定している
- プロダクトページやフィードなどの読み取り重視エンドポイントが原因で接続プールが飽和している
読み取りが問題か確認するためのメトリクス
レプリカを追加する前に、いくつかの明確なシグナルで検証してください:
- CPU対I/O:読み取りレイテンシのスパイク時にプライマリのCPUが限界か?それともディスク読み取りI/Oがボトルネックか?
- クエリ構成:遅いクエリログ/APMから見た
SELECTが占める割合 - p95/p99の読み取りレイテンシ:読み取りエンドポイントとDBクエリレイテンシを個別に追う
- バッファ/キャッシュヒット率:低いヒット率は読み取りがディスクアクセスを強いている可能性を示す
- 総時間で見たトップクエリ:一つの高コストクエリが“読み取り負荷”を支配していることがある
安い対策を飛ばさない
多くの場合、最初に行うべきはチューニングです:適切なインデックスを追加する、クエリを書き直す、N+1呼び出しを減らす、ホットな読み取りをキャッシュする。これらの変更は、レプリカを運用するより速く安く済むことが多いです。
簡易チェックリスト:レプリカ vs チューニング
レプリカを選ぶべき場合:
- 大部分の負荷が読み取りトラフィックで、読み取りは既に合理的に最適化されている
- オフロードするクエリに対して時折古い読み取りが許容できる
- スキーマやクエリをリスキーに変更せずに短期間でキャパシティを増やす必要がある
まずはチューニングすべき場合:
- ごく少数のクエリが総読み取り時間を支配している
- 明らかにインデックスが欠けている、非効率な結合がある
- 低トラフィック時でも読み取りが遅い(クエリ設計の問題の兆候)
最適なユースケース
リードレプリカは、プライマリがチェックアウト、サインアップ、更新などの書き込みを忙しく処理している一方で、大きな割合のトラフィックが読み取り中心であるときに最も価値があります。プライマリ–レプリカ構成では、適切なクエリをレプリカに押し出すことでアプリケーションの機能を変えずにデータベース性能を改善できます。
1) トランザクションを遅らせたくないダッシュボードや分析
ダッシュボードはしばしば長いクエリを実行します:グルーピング、広い日付範囲のフィルタ、複数テーブルの結合など。これらはCPUやメモリ、キャッシュをトランザクション処理と争います。
レプリカは次の用途に向きます:
- 内部レポーティングワークロード
- 管理ダッシュボード
- 日次/週次のメトリクスビュー
プライマリは高速で予測可能なトランザクションに集中させ、分析読み取りは独立してスケールさせます。
2) 読み取りが非常に多い検索・閲覧ページ
カタログ閲覧、ユーザープロファイル、コンテンツフィードは類似した多くの読み取りクエリを発生させることがあります。読み取りスケーリングの圧力がボトルネックであれば、レプリカがトラフィックを吸収してレイテンシのスパイクを減らせます。
特に有効なのは、キャッシュミスが多い(多くのユニーククエリ)場合やアプリ側キャッシュだけではまかなえない場合です。
3) 多量のデータをスキャンするバックグラウンドジョブ
エクスポート、バックフィル、要約の再計算、大規模な検索ジョブはプライマリを乱すことがあります。これらのスキャンをレプリカで実行するのが安全なことが多いです。
ただし、ジョブが最終的整合性を許容すること(レプリカラグにより最新の更新が見えない可能性がある)を確認してください。
4) 多地域での読み取り(鮮度のトレードオフあり)
グローバルにユーザを提供する場合、レプリカをユーザに近い場所に置くと RTT が短くなります。トレードオフはレプリカラグやネットワーク障害時に古い読み取りにさらされることであり、閲覧やおすすめ、公開コンテンツなど「ほぼ最新」で問題ないページに適しています。
レプリカが裏目に出る場面
リードレプリカは「十分に近ければ良い」場合に優れています。製品が暗黙にすべての読み取りが最新であると仮定していると、レプリカは裏目に出ます。
典型的な症状:「さっき更新したのに変わってないのはなぜ?」
ユーザがプロファイルを編集してフォームを送信し、次のページ表示が数秒遅れたレプリカから返されると、更新は成功しているのに古いデータが表示されます。ユーザは再試行したり二重送信したり信頼を失ったりします。
これは、メールアドレスの変更、設定切替、ドキュメントアップロード、コメント投稿後のリダイレクトなど、即時の確認を期待するフローで特に問題になります。
最新である必要がある画面(ここでは賭けない)
一部の読み取りは短時間でも古さを許容できません:
- ショッピングカートやチェックアウト合計
- ウォレット残高、ロイヤリティポイント、在庫数
- 「支払いは通ったか?」の確認画面
レプリカが遅れていると誤った合計を表示したり、在庫を過剰販売したり、古い残高を見せる可能性があります。後で正しくなってもユーザ体験とサポート負荷にダメージがあります。
管理・運用ツールは最新の真実を必要とする
内部ダッシュボードは不正検知、カスタマーサポート、注文処理、モデレーション、インシデント対応など実際の判断を駆動します。管理ツールがレプリカから読んでいると不完全なデータで判断してしまうリスクがあります(例:すでに返金済みの注文に返金をかけるなど)。
実用的な対策:"read-your-writes" をプライマリへルーティングする
一般的なパターンは条件付きルーティングです:
- ユーザが書き込んだ直後の確認読み取りは短時間(数秒〜数分)プライマリへ送る。
- 背景や匿名、重要でない読み取りはレプリカに残す。
これによりレプリカの利点を保ちつつ、一貫性に関するUXの問題を避けられます。
レプリケーションラグと古い読み取りの理解
レプリケーションラグは、プライマリでの書き込みがレプリカで見えるようになるまでの遅延です。アプリがこの遅延中にレプリカから読めば、“古い”結果(直前には正しかったが今は違うデータ)を返す可能性があります。
ラグが発生する理由
ラグは正常であり、負荷が増すと通常大きくなります。一般的な原因:
- プライマリの負荷スパイク:書き込みが多いと送るべき変更も増える
- レプリカのリソース不足や高負荷:変更を受け取っても適用が追いつかない(CPU、ディスクI/O)
- ネットワーク遅延やジッター:レプリケーションストリームの移動に遅れが出る
- 大きなトランザクション/バルク更新:単発の大きな変更はシリアライズ・転送・再生に時間がかかる
古い読み取りがプロダクトでどう現れるか
ラグは“鮮度”だけでなく、ユーザから見た正確性にも影響します:
- ユーザがプロファイルを更新してリフレッシュすると古い値が見える
- 未読メッセージ数や通知バッジが遅れる
- 管理/レポート画面が最新の注文や返金を見落とす
実用的な対処法
機能がどれだけ古さを許容できるかをまず決めましょう:
- 許容ウィンドウを設ける:多くのダッシュボードでは「データは最大30秒古い可能性があります」で問題ない
- 書き込み直後はプライマリへ:ユーザが何かを変更した後、そのエンティティの読み取りを短期間プライマリにルーティングする
- UIで期待値を示す:"更新中…"、"反映に数秒かかる場合があります" など
- リトライロジック:重要な読み取りが直前の書き込みを見逃した場合、プライマリへリトライするか短時間待って再試行する
監視とアラート項目
レプリカラグ(時間/バイト差)、レプリカの適用率、レプリケーションエラー、レプリカのCPU/ディスクI/Oを追跡します。ラグが合意した許容値(例:5s、30s、2m)を超えたらアラートを出し、ラグが継続的に増加する場合はレプリカが介入なしには追いつけない兆候です。
読み取りスケーリングと書き込みスケーリング(主要なトレードオフ)
リードレプリカは読み取りスケーリングのツールであり、SELECTクエリを提供する追加の場所を増やします。書き込みスケーリング(INSERT/UPDATE/DELETEの受け入れ能力を上げる)には向きません。
読み取りをスケールする:レプリカが得意なこと
レプリカを追加すると、読み取りキャパシティが増えます。アプリが読み取り中心のエンドポイントでボトルネックになっている場合、複数のマシンにクエリを分散できます。
これによりよく改善される点:
- 負荷時のクエリレイテンシ(プライマリの競合が減る)
- 読み取りのスループット(
SELECT向けにCPU/メモリ/I/Oが増える) - レポーティングなど重い読み取りの分離(トランザクション処理の妨げにならない)
書き込みをスケールする:レプリカができないこと
「レプリカを増やせば書き込みスループットも増える」という誤解があります。典型的なプライマリ–レプリカ構成では、すべての書き込みは依然としてプライマリに行くため、レプリカは書き込みの天井を上げません。むしろ、プライマリは各レプリカへレプリケーションデータを生成・送信するため、作業量がわずかに増えることもあります。
書き込みが問題なら、通常は別のアプローチ(クエリ/インデックスチューニング、バッチ処理、パーティショニング/シャーディング、データモデルの変更)を検討します。
接続上限とプーリング:隠れたボトルネック
レプリカで読み取りCPUが増えても、最初に接続数の上限に引っかかることがあります。各データベースノードには同時接続の最大数があり、レプリカを追加するとアプリが接続しうる場所が増えるだけで、総需要は減りません。
実用的なルール:接続プーリング(あるいはプーラ)を使い、サービスごとの接続数を意図的に管理してください。さもないと、レプリカは「オーバーロードできる別のデータベース」になってしまいます。
コストのトレードオフ:キャパシティは無料ではない
レプリカは実コストを伴います:
- ノード数の増加(コンピュートコスト)
- ストレージの増加(各レプリカがフルコピーを保持することが多い)
- 運用コストの増加(ラグ監視、バックアップ/復元戦略、スキーマ変更、インシデント対応)
トレードオフは明快です:レプリカは読み取り余力と分離を買えますが、複雑さを増やし、書き込みの上限は動かしません。
高可用性とフェイルオーバー:レプリカができること
リードレプリカは読み取りの可用性を高めることができます:プライマリが過負荷または一時的に利用不可でも、レプリカから一部の読み取りを続けられる場合があります。これにより、若干古くても許容できるコンテンツの顧客向けページが応答を続けられ、プライマリ障害の影響を減らせます。
ただし、レプリカだけでは完全な高可用性計画にはなりません。レプリカは通常自動的に書き込みを受け付ける状態ではなく、「読み取り可能なコピーがある」ことは「システムが安全かつ迅速に書き込みを再開できる」こととは異なります。
昇格とフェイルオーバー(概念的)
フェイルオーバーは概念的には:プライマリ障害を検知 → レプリカを選ぶ → それを新しいプライマリに昇格する → 書き込み先をリダイレクトする、という流れです。
一部のマネージドデータベースはこれを自動化しますが、コアの考え方は変わりません:どのノードが書き込みを受け付けるかを切り替えます。
計画しておくべきリスク
- レプリカのデータが古い:昇格したレプリカが遅れていると、最後にレプリケーションされていない書き込みを失う可能性がある。
- スプリットブレイン回避:二つのノードが同時に書き込みを受け付けないようにする必要がある。これが理由で昇格は通常、管理プレーン、クォーラムシステム、あるいは厳格な運用手順でゲートされる。
- ルーティングとキャッシュ:アプリがターゲットを切り替える確実な方法(接続文字列、DNS、プロキシ、DBルータ)を持っていること。書き込みが古いプライマリに誤って行かないようにする。
機能としてテストする
フェイルオーバーは練習すべきです。ステージングでゲームデイテストを行い(本番では低リスクウィンドウで慎重に)、プライマリ喪失をシミュレートして復旧時間を測り、ルーティングを検証し、アプリが読み取り専用期間や再接続を適切に処理することを確認してください。
実用的なルーティングパターン(読み書き分離)
リードレプリカはトラフィックが実際にそれらに届いて初めて役立ちます。「読み書き分離」は書き込みをプライマリへ、適切な読み取りをレプリカへ送るためのルール群です——正確性を壊さないように。
パターン1:アプリ内で分離
最も単純なのはデータアクセス層で明示的にルーティングする方法です:
- 書き込み(
INSERT/UPDATE/DELETE、スキーマ変更)はすべてプライマリへ - 選択された読み取りだけをレプリカへ許可する
理由付けが分かりやすく、ロールバックもしやすい。例えば「チェックアウト後はしばらく注文状態をプライマリから読む」といったビジネスルールを埋め込めます。
パターン2:プロキシやドライバ経由で分離
データベースプロキシや賢いドライバが“プライマリ vs レプリカ”エンドポイントを把握し、クエリタイプや接続設定に基づいてルーティングする方法もあります。アプリコードの変更を減らせますが、プロキシはプロダクト的にどの読み取りが“安全”かを確実に判断できない点に注意してください。
どのクエリをレプリカへ回すかの選び方
良い候補:
- 分析、レポーティング、ダッシュボードのワークロード
- 少し古くても問題ない検索/閲覧ページ
- リトライ可能で最新値を必要としないバックグラウンドジョブ
ユーザの書き込み直後に続く読み取り(例:「プロフィール更新 → プロフィール再読込」)は、一貫性戦略がない限りレプリカへ回すべきではありません。
トランザクションとセッション一貫性
トランザクション内ではすべての読み取りをプライマリに保持してください。
トランザクション外では“read-your-writes”セッションを考慮:書き込み後にユーザ/セッションを短期間プライマリにピン留めするか、特定のフォローアップクエリをプライマリへルーティングします。
小さく始めて測る
まずは1台のレプリカを追加し、限定的なエンドポイント/クエリをルーティングして比較しましょう:
- プライマリのCPUと読み取りIOPS
- レプリカの利用率
- エラー率とレイテンシのパーセンタイル
- 古い読み取りに起因するインシデント
効果が明確で安全なら段階的にルーティングを拡大します。
監視と運用の基本
リードレプリカは“設定して放置”するものではありません。追加のデータベースサーバとしてそれぞれに性能限界や障害モード、運用作業があります。いくつかの監視習慣が「レプリカが助けになった」か「混乱を招いただけか」の分かれ目です。
監視すべきもの(重要な指標)
ユーザに見える症状を説明する指標に集中してください:
- レプリカラグ:レプリカがプライマリにどれだけ遅れているか(秒、バイト、WAL/LSN位置など)
- レプリケーションエラー:切断、認証失敗、ディスクフル、レプリケーションスロット問題など。ノイズではなくインシデントとして扱う
- クエリレイテンシ(p50/p95):レプリカとプライマリの差を追う
- キャッシュヒット率:レプリカが再起動やトラフィックシフトの後で常にキャッシュミスしているとレイテンシが高くなる
キャパシティ計画:レプリカは何台必要か?
読み取りオフロードが目的なら1台から始めます。次を追加するのは明確な制約があるときだけ:
- 読み取りスループット:1台のレプリカではピークQPSや重い分析クエリに追いつかない
- 分離:レポーティング専用レプリカを用意してユーザトラフィックと競合しないようにする
- 地理:リージョン毎のレプリカは読み取りレイテンシを下げるが運用負荷を増やす
実用的なルール:読み取りがボトルネックであることを確認した後でレプリカを増やす。
共通の運用タスク
- バックアップ:どのノードでバックアップを取るか決める。レプリカからバックアップを取るとプライマリの負荷を下げられるが、一貫性要件とレプリカの健全性を確認すること。
- スキーマ変更:レプリケーションを意識してマイグレーションをテストする(長時間のDDLはラグを増やす)。アプリとスキーマ変更が伝播中でも互換性があるよう調整する。
- メンテナンスウィンドウ:レプリカのパッチ適用や再起動は一時的に読み取り容量を削る。ローテーション計画を立て、必要な読み取りヘッドルームを下回らないようにする。
トラブルシュートチェックリスト:「レプリカが遅い」
- レプリカラグを確認:高ければユーザがリトライしているか古いデータを見ている可能性がある
- レプリカとプライマリのスロークエリログを比較:レポーティングクエリが表面化することが多い
- レプリカホストのCPU、メモリ、ディスクI/O、ネットワークを確認
- レプリケーションを遅らせるロック待ちや長時間トランザクションがプライマリにないか確認
- 読み取りルーティングが単一のレプリカに過負荷をかけていないか(負荷分散)
- レプリカにインデックスが存在するか(プライマリと同じであるはず)と統計情報が最新かを確認
代替案とシンプルな意思決定フレームワーク
リードレプリカは読み取りスケーリングの一手段ですが、通常最初に試すべきレバーではありません。運用の複雑さを増やす前に、よりシンプルな修正で同じ効果が得られないか検討してください。
まず試すべき代替案
キャッシュはデータベースから読み取りを丸ごと取り除けます。読み取り中心のページ(商品詳細、公開プロフィール、設定)ではアプリキャッシュやCDNで負荷を大幅に削減でき、レプリケーションラグを導入せずに済みます。
インデックスとクエリ最適化は、一般的なケースでレプリカより高い効果を発揮します:適切なインデックス追加、返すカラムの削減、N+1の回避、悪い結合の修正で「レプリカが必要」だった状況が「単に設計がまずかった」に変わることがよくあります。
マテリアライズドビュー/事前集計はワークロードが本質的に重い(分析、ダッシュボード)場合に有効です。複雑なクエリを繰り返す代わりに計算済み結果を保持してスケジュールで更新します。
書き込みがボトルネックならシャーディング/パーティショニングを検討
書き込みが問題(ホット行、ロック競合、書き込みI/O制限)であれば、レプリカではあまり助けになりません。その場合、テーブルを時間やテナントで分割したり、顧客IDでシャードするなどして書き込み負荷を分散する必要があります。大きな構造変更ですが、根本的な制約に対処します。
シンプルな意思決定フレームワーク
次の4つの質問を自問してください:
- 目的は何か? 読み取りレイテンシを下げることか、レポーティングワークロードをオフロードすることか、可用性を改善することか?
- 読み取りはどれだけ新鮮でなければならないか? 古い読み取りが許容できないなら、レプリカはユーザに可視な問題を起こすかもしれない。
- 予算は? レプリカはインフラコストと運用コストを増やす。
- どれだけの複雑さを吸収できるか? 読み書き分離、最終的整合性の扱い、フェイルオーバーテストは簡単ではない。
プロトタイプや素早くサービスを立ち上げる場合、これらの制約を早期にアーキテクチャに織り込むと助けになります。例えば、Koder.ai(チャットからReactフロントとGo+PostgreSQLバックエンドを生成するvibe-codingプラットフォーム)上で開発するチームは、単純さのために最初は単一のプライマリで始め、ダッシュボードやフィード、内部レポーティングがトランザクションと競合し始めたらレプリカへ移行することが多いです。計画重視のワークフローにしておくと、どのエンドポイントが最終的整合性を許容でき、どれがプライマリからの"read-your-writes"であるべきかを前もって決めやすくなります。
必要なら /pricing を見てオプションを確認するか、/blog の関連ガイドを参照してください。
よくある質問
リードレプリカとは何ですか?
リードレプリカは、プライマリデータベースのコピーで、継続的に変更を受け取り、読み取り専用のクエリ(例:SELECT)に応答できるようにしたものです。プライマリへのその種の読み取り負荷を増やさずに、読み取りキャパシティを追加するのに役立ちます。
リードレプリカは書き込みスループットを増やしますか?
いいえ。典型的なプライマリ–レプリカ構成では、すべての書き込みは依然としてプライマリに入ることになります。むしろ、プライマリは各レプリカへ変更を送る必要があるため、若干のオーバーヘッドが増えることすらあります。
リードレプリカはいつパフォーマンスに役立ちますか?
主に「読み取りがボトルネックになっている」状況で有効です:SELECTトラフィックが多く、プライマリのCPU/I/Oや接続数に負荷をかけている場合です。また、レポーティングやエクスポートなど重い読み取りをトランザクション処理から分離するのにも役立ちます。
レプリカを追加すれば遅いクエリが直りますか?
必ずしもそうではありません。クエリがインデックス不足や悪い結合、巨大なテーブル走査などで遅い場合、レプリカでも同様に遅くなります——ただし別の場所で遅くなるだけです。まずはクエリとインデックスのチューニングを行ってください。
レプリケーションラグとは何で、なぜ重要ですか?
レプリケーションラグは、プライマリで書き込みがコミットされてから、その変更がレプリカで見えるようになるまでの遅延です。その間、レプリカからの読み取りは古い(stale)データを返す可能性があり、このためレプリカを使うシステムでは一部の読み取りが**最終的整合性(eventual consistency)**になることが多いです。
レプリケーションラグが悪化する原因は何ですか?
ラグが悪化する主な原因:
- 書き込みのスパイク(送るべき変更が増える)
- レプリカのリソース不足や高負荷(変更を適用できない)
- ネットワークの遅延やジッター
- 大きなトランザクションやバルク更新(シリアライズ・転送・再生に時間がかかる)
アプリのどの部分がレプリカから読み取るべきでないですか?
次のような『書いた直後に最新でなければならない』領域は、レプリカからの読み取りに頼るべきではありません:
- チェックアウト合計やカート、在庫数
- ウォレット残高や支払い状況
- 管理者/オペレーションの判断に使うツール(最新の真実が必要)
これらは少なくとも重要なパスではプライマリから読むようにしてください。
「書き換えたのに反映されない」問題をどう防ぎますか?
「自分が書き込んだ結果が見えない」問題を防ぐ方法として、read-your-writes戦略があります:
- ユーザが書き込みを行った後、短時間(数秒〜数分)そのユーザ/セッションの確認読み取りをプライマリにルーティングする。
- 非重要/匿名/バックグラウンドの読み取りはレプリカに任せる。
- 必要なら、直近の書き込みが見つからない場合はプライマリへリトライする。
リードレプリカで何を監視すべきですか?
監視すべき小さな信号群:
- レプリカラグ(時間/バイト/LSN差など)
- レプリケーションのエラー(切断、認証、ディスクフルなど)
- レプリカとプライマリのクエリレイテンシ(p50/p95)
- レプリカのCPUやディスクI/O利用率
ラグがプロダクトの許容値(例:5秒/30秒/2分)を超えたらアラートを出しましょう。
リードレプリカを追加する代替案には何がありますか?
よく使われる代替手段:
- キャッシュ(アプリ側キャッシュやCDN)で読み取りをそもそも減らす
- インデックスやクエリ最適化(多くの場合、最も効果が高い)
- マテリアライズドビュー/事前集計(ダッシュボード向け)
- 書き込みやコンテンションが問題ならパーティショニング/シャーディング
レプリカは、読み取りが既にある程度最適化されていて、ある程度の古さが許容できる場合に最も有効です。