本トピックでは、グローバル整合性機能の前提条件、背景、仕組み、手順、およびよくある質問 (FAQ) について説明します。
概要
PolarDB for PostgreSQL と は、データベースカーネルレベルでグローバル整合性機能を提供し、クラスター内の任意のノードに送信された読み取りリクエストが強力な整合性を持つ結果を返すことを保証します。
適用性
この機能は、次のバージョンの PolarDB for PostgreSQL でサポートされています。
-
PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.11.22.0 以降)。
コンソールで、または SHOW polardb_version; ステートメントを実行することで、マイナーエンジンバージョンを表示できます。お使いのクラスターのマイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。
背景情報
オリジナルの PolarDB の 1 ライター、複数リーダーアーキテクチャでは、読み取り専用ノードはデフォルトでセッション整合性を提供します。物理レプリケーションと共有ストレージは、読み取り専用ノードのレプリケーションラグを効果的に削減できますが、読み取りリクエストが読み書き可能ノードに書き込まれた最新のデータを取得できるとは限りません。金融やゲームなどのレイテンシーに敏感な業界では、この読み取り遅延がビジネスロジックの不整合を引き起こす可能性があります。
図に示すように、ビジネスアプリケーションは多くの場合、マイクロサービスフレームワークを使用して分離されています。サービス A がデータを書き込んだ後、メッセージキューを介して書き込み成功メッセージをサービス B に送信します。セッション整合性のシナリオでは、サービス A が col を 20 に更新した後、同じセッション内ですぐにデータを読み取ると、リクエストが読み取り専用ノードにルーティングされた場合でも、20 という最新の結果を受け取ります。しかし、更新の通知を受けた後、サービス B が読み取り専用ノードから直接読み取ると、10 という古い値を取得する可能性があります。このシナリオは、アプリケーションにデータ整合性の問題を引き起こす可能性があります。書き込み後の読み取り整合性を確保するためには、アプリケーションは読み取りリクエストを読み書き可能ノードに転送する必要があり、これにより読み取り専用ノードのリソースがアイドル状態になります。
仕組み
PolarDB for PostgreSQL と は、データベースカーネルレベルで読み取り専用ノードに強力な整合性を持つ読み取り機能を提供します。これにより、読み取り専用ノードは常に読み書き可能ノードに書き込まれた最新のデータを参照できるようになります。この機能は、読み取り操作に対してクラスター全体の強力な整合性を提供します。グローバル整合性が有効になっている場合、読み書き可能ノードでコミットされたすべての読み書きトランザクションにコミットシーケンス番号 (CSN) が割り当てられます。CSN はトランザクションのコミット順序を表し、ネイティブの PostgreSQL のアクティブなトランザクションリストを置き換えて、より効率的なトランザクションスナップショットを構築するために使用されます。読み書き可能ノードは CSN を先行書き込みログ (WAL) に記録し、読み取り専用ノードは WAL をリプレイして完全なトランザクションの状態を構築します。
次の手順は、RO ノードでの強力な整合性読み取りの SQL 実行プロセスを説明したものです:
-
クライアントが読み取り専用ノードにクエリリクエストを送信します。
-
読み取り専用ノードがネットワーク経由で読み書き可能ノードから最新の CSN を取得します。
-
読み取り専用ノードは、読み書き可能ノードからの最新の CSN を使用して強力な整合性の読み取りビューを構築し、そのトランザクションの状態がそのポイントまでリプレイされるのを待ちます。
-
読み取り専用ノードはこのビューに基づいてデータの可視性を判断し、クライアントに結果を返します。
操作手順
-
PolarDB コンソールにログインします。左側メニューで、クラスター をクリックします。クラスターが配置されている [リージョン] を選択し、クラスター ID をクリックします。
-
左側メニューで、 を選択します。
polar_csn_enableパラメーターとpolar_global_csn_enableパラメーターをonに設定して、トランザクション CSN 機能を有効にします。説明これらのパラメーターの変更を有効にするには、クラスターの再起動が必要です。適宜計画を立ててください。コンソールでクラスターパラメーターを設定する方法の詳細については、「クラスターパラメーターの設定」をご参照ください。
-
基本情報 ページで、データベースへの接続 セクションの クラスターアドレス (推奨) の横にある 設定 をクリックするか、表示されるダイアログボックスで 変更 をクリックします。
-
[エンドポイントの編集] ページで、整合性レベルを グローバル整合性 (強) に設定し、関連する 2 つのパラメーターを設定します:
パラメーター
説明
グローバル整合性の読み取りタイムアウト
読み取り専用ノードが読み書き可能ノードと同期するのを待つ最大時間 (ミリ秒)。有効値:1~1,000,000。デフォルト:100。
グローバル整合性の読み取りタイムアウトポリシー
読み取り専用ノードがタイムアウトした場合に実行するアクション。有効値:
-
0:プライマリノードにこのリクエストを送信する (デフォルト)
-
1:タイムアウトエラー。クライアントはエラーメッセージを返す
-
2:ダウングレードがタイムアウトしたため、自動的に整合性のない読み書きにダウングレードする
-