PolarDB for PostgreSQL はカーネルレベルで強力な整合性を適用し、クラスター内の任意のノードに送信された読み取りリクエストが常に最新のコミット済みデータを返すことを保証します。
適用範囲
グローバル整合性は、以下のバージョンの PolarDB for PostgreSQL でサポートされています:
PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.9.9.0 以降)
PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.11.22.0 以降)
マイナーエンジンバージョンを確認するには、コンソールにログインするか、SHOW polardb_version; を実行します。バージョンが要件を満たさない場合は、マイナーエンジンバージョンをアップグレードする を実行してください。手順については、「マイナーエンジンバージョンの表示」をご参照ください。背景情報
デフォルトでは、PolarDB の読み取り専用ノードはセッションの一貫性を提供します。データを書き込んだクライアントが同じセッション内で直ちにそれを読み戻すと、リクエストが読み取り専用ノードにルーティングされた場合でも、最新の値が表示されます。しかし、異なるセッションやサービスからの読み取りでは、最新の書き込みが反映されることは保証されません。
このギャップは、マイクロサービスアーキテクチャにおいて実際の問題を引き起こします。サービス A が値を書き込み、メッセージキューを介してイベントを公開した後、サービス B が読み取り専用ノードから読み取りを行うと、古いデータがまだ表示される可能性があります。グローバル整合性がなければ、唯一の安全な選択肢は、すべての読み取りを読み書きノードにルーティングすることです。これにより、読み取り専用ノードのキャパシティがアイドル状態になり、アプリケーションは 2 つの異なるデータベース接続セットを維持する必要があります。
グローバル整合性はこの制約を解消し、どのセッションやサービスがリクエストを発行したかに関わらず、すべての読み取り専用ノードが常に最新のコミット済みデータを返すことを保証します。
仕組み
読み書きノードでコミットされたすべての読み書きトランザクションには、コミットシーケンス番号 (CSN) が割り当てられます。CSN はグローバルなトランザクションコミット順序を定義し、ネイティブの PostgreSQL で使用されるアクティブなトランザクションリストを置き換えることで、より効率的なスナップショットメカニズムを可能にします。読み書きノードは各 CSN を先行書き込みログ (WAL) に記録し、読み取り専用ノードは WAL を再生して完全なトランザクション状態を再構築します。
クライアントがグローバル整合性の下で読み取り専用ノードにクエリを実行すると、次のようになります:
読み取り専用ノードは、ネットワークを介して読み書きノードから最新の CSN をフェッチします。
その CSN に基づいて強力な整合性の読み取りビューを構築し、WAL の再生が対応するオフセットに達するのを待ちます。
強力な整合性の読み取りビューを使用してデータの可視性を評価し、結果をクライアントに返します。
よくある質問
特定のセッションでグローバル整合性を無効にする方法
クラスターエンドポイントでグローバル整合性が有効になると、すべての新しい接続に適用されます。単一のセッションでオプトアウトするには、次を実行します:
SET polar_scc_enable = off;グローバル整合性のタイムアウトを調整する方法
PolarDB コンソールで、対象のクラスターエンドポイントの横にある [設定] (またはダイアログボックスの [設定]) をクリックし、[グローバル整合性タイムアウト] の値を更新します。
タイムアウトが発生すると、クライアントは次のメッセージを受け取ります:
SCC timeout waiting for WAL replay書き込みワークロードが重い、または不安定なクラスターの場合は、[グローバル整合性タイムアウト] を増やしてタイムアウトの頻度を減らしてください。
書き込み負荷が低いシナリオで読み取り遅延を回避する方法
書き込み負荷が低いシナリオでは、読み取り専用ノードが新しいデータがない場合でも WAL 再実行を待機することがあります。この遅延を軽減するには、PolarDB コンソールで synchronous_commit パラメーターを on に設定します。手順については、「クラスター パラメーターの設定」をご参照ください。
タイムアウト後に整合性を自動的にダウングレードする方法
PolarDB コンソールで、対象のクラスターエンドポイントの横にある [設定] (またはダイアログボックスの [設定]) をクリックし、[グローバル整合性タイムアウトポリシー] を [2, タイムアウトにより非整合読み取りに自動的にダウングレード] に設定します。タイムアウトが発生すると、クエリは非整合読み取りで続行され、クライアントにエラーは返されません。
