読み取りレプリカと接続ルーティング
PgBouncerまたは対応するドライバーで読み取り専用トラフィックをレプリカへ振り分け、データの古さとのトレードオフを受け入れます。
「読み取りレプリカと接続ルーティング」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
なぜ読み取りレプリカを使うのか
読み取りが多いワークロードでは、SELECT をレプリカにオフロードできます。
- プライマリが書き込みを処理する
- レプリカが大部分の読み取りを処理する
- シャーディングなしで読み取りを水平スケーリングする
結果整合性に関する注意点
レプリカはプライマリに遅れて追従します。注文した直後のユーザーは、まだレプリカ上でその注文を確認できない可能性があります。次のいずれかを行ってください。
- 書き込み直後の読み取りをプライマリにルーティングする
- レプリカが追いつくまで待つ
- 書き込み後の状態をアプリにキャッシュする
ルーティング戦略
- アプリケーションレベルのルーティング — アプリコードがプライマリとレプリカのどちらを使うか選択する
- ドライバーレベルのルーティング — JDBC、pgjdbc、pgxpool がプライマリとレプリカを認識してプールする
- プロキシレベルのルーティング — pgpool、pgbouncer、HAProxy が読み取りと書き込みを検出する
アプリケーションルーティング
ロールごとに1つずつ、2つの接続プールを用意します:
const primary = new Pool({ host: 'primary', ... });
const replica = new Pool({ host: 'replica', ... });
// reads go to replica:
await replica.query('SELECT ...');
// writes (and read-your-writes) go to primary:
await primary.query('INSERT ...');PgPool-II
SQLを解析し、SELECTをレプリカへ、書き込みをプライマリへルーティングするプロキシです。ロードバランシングと接続プーリングに対応しています:
# pgpool.conf
backend_hostname0 = 'primary'
backend_hostname1 = 'replica1'
load_balance_mode = onpg_isreadyチェックを使用したHAProxy
HAProxyはSQLを理解しませんが、ポートによるルーティングは可能です。書き込み用(プライマリへ)と読み取り用(ヘルスチェック付きでレプリカへ)のフロントエンドをそれぞれ用意します:
frontend writes
bind *:5432
default_backend primary_pool
frontend reads
bind *:5433
default_backend replicas_pool
balance roundrobinAWS RDSエンドポイント
RDSは単一のwriterエンドポイントと、すべてのレプリカ間でロードバランシングするreaderエンドポイントを提供します。クラウドでは最も簡単な方法です。
レプリケーション遅延に関する考慮事項
遅延を監視し、遅れが大きすぎるレプリカへのルーティングを避けます:
-- On primary:
SELECT client_addr, replay_lag FROM pg_stat_replication;
-- HAProxy / pgpool can use a custom health check that fails if replay_lag > threshold.スティッキーセッションパターン
「自分の書き込みを読み取る」ために、書き込み後N秒間、ユーザーのセッションをプライマリに固定します。または、書き込みのLSNを記録し、読み取りを提供する前にレプリカでの再生が完了するまで待機します。
LSNベースの待機
書き込み後にLSNを取得し、レプリカから読み取る前に、そのLSNまでレプリカで再生されるのを待ちます:
-- After write on primary:
SELECT pg_current_wal_lsn(); -- save this
-- Before read on replica:
SELECT pg_last_wal_replay_lsn() >= $saved_lsn;
-- spin or wait until trueレプリカとしてのキャッシュ
場合によっては、Redis / Memcacheを読み取りスケーリング用の「レプリカ」として使用します。頻繁にアクセスされるキーについては、別のPostgresインスタンスよりもはるかに高速です。
レプリカを使用しない場合
ワークロードが書き込み中心であれば、レプリカは速度向上につながらず、コストだけが増えることがあります。プライマリですでに読み取りが高速であれば、レプリカは必要ないかもしれません。
ディザスタリカバリと読み取りスケーリングの違い
HAフェイルオーバー用のレプリカと、読み取りスケーリング用のレプリカは別の目的です。多くの場合、両方を用意します。
まとめ
リードレプリカによって読み取りをスケールできますが、遅延が発生します。
- アプリケーション、ドライバー、プロキシによるルーティング
- レプリケーション遅延 = 結果整合性
- 読み取り後の書き込み整合性には、プライマリへの固定またはLSN待機
- 遅延を監視し、大きすぎる場合はプライマリにフォールバック
確認問題
ユーザーがコメントを投稿し、すぐにページを更新しました。ページはレプリカから読み取るため、コメントが表示されません。問題は何で、解決策を1つ挙げてください。
よくある質問
「読み取りレプリカと接続ルーティング」レッスンは無料ですか?
はい。「読み取りレプリカと接続ルーティング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「読み取りレプリカと接続ルーティング」で何を学びますか?
PgBouncerまたは対応するドライバーで読み取り専用トラフィックをレプリカへ振り分け、データの古さとのトレードオフを受け入れます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「読み取りレプリカと接続ルーティング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。