このトピックでは、グローバル整合性機能について説明します。
概要
PolarDB for PostgreSQL (Oracle 互換) クラスタは、データベースカーネルレベルでグローバル整合性機能を提供します。 この機能により、クラスタ内の読み取り専用ノードに送信された読み取りリクエストに対して、強力な整合性を持つ結果が保証されます。
前提条件
PolarDB for PostgreSQL (Oracle 互換) クラスタで、以下のデータベースエンジンバージョンが実行されている必要があります。
PolarDB for PostgreSQL (Oracle 互換) 2.0 (リビジョンバージョン 2.0.14.22.0 以降)
PolarDB for PostgreSQL (Oracle 互換) クラスタのデータベースエンジンのリビジョンバージョンを表示するには、次の文を実行します。
SHOW polar_version;クラスタのデータベースエンジンのリビジョンバージョンをアップグレードする方法については、「バージョンのアップグレード」をご参照ください。
背景情報
PolarDB の元の 1 つのライター、複数のリーダーアーキテクチャでは、読み取り専用ノードはセッションの一貫性を提供します。 物理レプリケーションと共有ストレージのテクノロジーは読み取り専用ノードのレプリケーション遅延を効果的に削減しますが、読み取り専用ノードに送信されたリクエストが常にプライマリノードに書き込まれた最新のデータを読み取ることを保証することはできません。 この遅延は、金融やゲームなどの遅延の影響を受けやすい業界でビジネスロジックの不整合を引き起こす可能性があります。
ほとんどの場合、前の図に示すように、ビジネスアプリケーションはマイクロサービスフレームワークを使用して、より小さく独立したサービスに分割されます。 サービス A はデータを書き込んだ後、書き込み成功メッセージを生成し、メッセージキューを使用してサービス B にメッセージを送信します。 サービス A が col 列の値を 20 に更新した後、セッションの一貫性により、読み取りリクエストが読み取り専用ノードにルーティングされた場合でも、サービス A は同じセッションを使用して更新された値をすぐに読み取ることができます。 ただし、サービス B がサービス A から更新メッセージを受信し、読み取り専用ノードから col 列の値を読み取ると、サービス B は以前の値 10 を取得する場合があります。 この不一致は、アップストリームサービスのデータ整合性の問題につながる可能性があります。 書き込み後読み取り整合性を確保するために、サービスからの読み取りリクエストはプライマリノードのみにルーティングできます。 その結果、読み取り専用ノードは十分に活用されていません。
技術的なソリューション
PolarDB for PostgreSQL (Oracle 互換) は、読み取り専用ノードに対してデータベースカーネルレベルで強力な整合性読み取り機能を提供します。 これにより、読み取り専用ノードへのすべての読み取りリクエストは、常にプライマリノードに書き込まれた最新のデータを読み取ることが保証されます。 これにより、読み取り操作のクラスタ全体の強力な整合性が保証されます。 グローバル整合性機能を有効にすると、プライマリノードでコミットされた各読み取り/書き込みトランザクションにコミットシーケンス番号 (CSN) が割り当てられます。 CSN はトランザクションがコミットされる順序を示し、ネイティブ PostgreSQL のアクティブトランザクションリストを置き換えます。 プライマリノードは CSN を書き込み先行ログ (WAL) に記録します。 これにより、読み取り専用ノードは WAL レコードを再生することにより、トランザクションステータスの完全なビューを構築できます。
次のセクションでは、読み取り専用ノードの強力な整合性読み取り機能を保証する SQL 実行プロセスについて説明します。
クライアントはクエリリクエストを読み取り専用ノードに送信します。
読み取り専用ノードは、ネットワークを介してプライマリノードから現在の最大の CSN を取得します。
読み取り専用ノードは、プライマリノードから取得した最大の CSN を使用して整合性のある読み取りビューを構築し、トランザクションの状態が最大の CSN に対応するポイントまで同期されるまで待機します。
読み取り専用ノードは、整合性のある読み取りビューに基づいてクエリに関連するデータの可視性を判断し、クエリ結果をクライアントに返します。
手順
PolarDB コンソール にログインします。
左側のナビゲーションウィンドウで、クラスタ をクリックします。
左上隅で、クラスタがデプロイされているリージョンを選択します。
クラスタを見つけて、その ID をクリックします。
左側のナビゲーションウィンドウで、 を選択します。
polar_csn_enableパラメータとpolar_global_csn_enableパラメータをONに設定して、トランザクションの CSN 機能を有効にします。説明変更したパラメータ設定を有効にするには、クラスタを再起動する必要があります。 パラメータを変更する前に、ビジネス上の調整を行い、慎重に行ってください。 PolarDB コンソールでクラスタパラメータを設定する方法については、「クラスタパラメータの設定」をご参照ください。
クラスタの [基本情報] ページの [データベース接続] セクションで、[クラスタエンドポイント] の横にある [構成] をクリックします。また、クラスタエンドポイントカードにポインターを移動し、表示されるメッセージ内の [変更] をクリックすることもできます。

[エンドポイント設定の変更] ダイアログボックスで、[整合性レベル] パラメータを [グローバル整合性 (強)] に設定し、パラメータを設定します。 次の表にパラメータを示します。
パラメータ
説明
グローバル整合性タイムアウト
システムが読み取り専用ノードがプライマリノードからの最新のデータと同期するのを待機する最大時間。 有効値: 1 ~ 1000000。 単位: ミリ秒。 デフォルト値: 100。
グローバル整合性タイムアウトポリシー
読み取り専用ノードが指定されたタイムアウト期間内にプライマリノードからの最新のデータと同期できなかった場合に適用されるポリシー。 有効値:
プライマリノードにリクエストを送信 (デフォルト)
タイムアウトによるエラーメッセージを返す
タイムアウトによる不整合読み取りに自動的にダウングレード