すべてのプロダクト
Search
ドキュメントセンター

PolarDB:グローバル整合性

最終更新日:Mar 11, 2025

このトピックでは、グローバル整合性機能について説明します。

概要

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 実行プロセスについて説明します。

  1. クライアントはクエリリクエストを読み取り専用ノードに送信します。

  2. 読み取り専用ノードは、ネットワークを介してプライマリノードから現在の最大の CSN を取得します。

  3. 読み取り専用ノードは、プライマリノードから取得した最大の CSN を使用して整合性のある読み取りビューを構築し、トランザクションの状態が最大の CSN に対応するポイントまで同期されるまで待機します。

  4. 読み取り専用ノードは、整合性のある読み取りビューに基づいてクエリに関連するデータの可視性を判断し、クエリ結果をクライアントに返します。

手順

  1. PolarDB コンソール にログインします。

  2. 左側のナビゲーションウィンドウで、クラスタ をクリックします。

  3. 左上隅で、クラスタがデプロイされているリージョンを選択します。

  4. クラスタを見つけて、その ID をクリックします。

  5. 左側のナビゲーションウィンドウで、[設定と管理] > [パラメータ] を選択します。 polar_csn_enable パラメータと polar_global_csn_enable パラメータを ON に設定して、トランザクションの CSN 機能を有効にします。

    説明

    変更したパラメータ設定を有効にするには、クラスタを再起動する必要があります。 パラメータを変更する前に、ビジネス上の調整を行い、慎重に行ってください。 PolarDB コンソールでクラスタパラメータを設定する方法については、「クラスタパラメータの設定」をご参照ください。

  6. クラスタの [基本情報] ページの [データベース接続] セクションで、[クラスタエンドポイント] の横にある [構成] をクリックします。また、クラスタエンドポイントカードにポインターを移動し、表示されるメッセージ内の [変更] をクリックすることもできます。

    image

  7. [エンドポイント設定の変更] ダイアログボックスで、[整合性レベル] パラメータを [グローバル整合性 (強)] に設定し、パラメータを設定します。 次の表にパラメータを示します。

    パラメータ

    説明

    グローバル整合性タイムアウト

    システムが読み取り専用ノードがプライマリノードからの最新のデータと同期するのを待機する最大時間。 有効値: 1 ~ 1000000。 単位: ミリ秒。 デフォルト値: 100。

    グローバル整合性タイムアウトポリシー

    読み取り専用ノードが指定されたタイムアウト期間内にプライマリノードからの最新のデータと同期できなかった場合に適用されるポリシー。 有効値:

    • プライマリノードにリクエストを送信 (デフォルト)

    • タイムアウトによるエラーメッセージを返す

    • タイムアウトによる不整合読み取りに自動的にダウングレード

FAQ

グローバル整合性機能を有効にした後、特定のクエリに対してグローバル整合性を実装したくない場合はどうすればよいですか?

デフォルトでは、読み取り専用ノードのグローバル整合性機能を有効にすると、その機能はすべての新しいクエリに有効になります。 特定のクエリに対してグローバル整合性を実装したくない場合は、次の文を実行してセッションの機能を無効にすることができます。

SET polar_scc_enable = off;

[グローバル整合性タイムアウト] パラメータはどのように設定しますか?

PolarDB コンソール にログインし、クラスタの [基本情報] ページに移動します。 クラスターエンドポイントを見つけて、[設定] をクリックします。 また、クラスターエンドポイントカードにポインタを移動し、表示されるメッセージの [変更] をクリックすることもできます。 次に、[グローバル整合性タイムアウト] パラメータの値を変更します。 グローバル整合性タイムアウトが発生した場合、クライアントは次のエラーメッセージを受信します。

SCC timeout waiting for WAL replay
説明

クラスタが重い書き込み負荷または予測できない書き込み負荷を処理する場合は、[グローバル整合性タイムアウト] パラメータを大きい値に設定できます。

タイムアウトが発生した後、グローバル整合性レベルをダウングレードするにはどうすればよいですか?

PolarDB コンソール にログインし、クラスターの [基本情報] ページに移動します。クラスターエンドポイントを探し、[構成] をクリックします。また、[クラスターエンドポイント] カードにポインターを移動し、表示されるメッセージ内の [変更] をクリックすることもできます。次に、[グローバル整合性タイムアウトポリシー] パラメーターの値を [タイムアウトによる不整合読み取りへの自動ダウングレード] に設定します。このようにすると、グローバル整合性読み取りクエリがタイムアウトした場合、システムはクエリの整合性レベルを自動的に不整合読み取りにダウングレードします。クライアントにはエラーメッセージは返されません。グローバル整合性タイムアウトポリシーパラメーターの有効な値については、「グローバル整合性タイムアウトポリシーパラメーターについて説明する表」をご参照ください。

書き込み負荷の低いシナリオで読み取りレイテンシを回避するにはどうすればよいですか?

PolarDB コンソール にログインし、synchronous_commit パラメーターを ON に設定すると、書き込み負荷の低いシナリオでの読み取りレイテンシを回避できます。PolarDB コンソールでクラスタパラメーターを設定する方法については、「クラスタパラメーターを設定する」をご参照ください。