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

PolarDB:整合性レベル

最終更新日:Jun 16, 2026

PolarDB は、読み書き分離において 4 つの整合性レベルをサポートしています。結果整合性、セッション整合性、グローバル整合性、グローバル整合性 (高性能モード) の 4 つです。各レベルでは、読み取りレイテンシーとデータの鮮度のトレードオフが発生します。整合性が高いほど、レプリケーションが追いつくのを待つために読み取りに時間がかかる可能性があります。

適用範囲

整合性レベルを設定するには、クラスターに少なくとも 1 つの読み取り専用ノードが必要です。読み取り専用ノードがない場合、PolarDB コンソールには整合性レベルの設定が表示されません。

整合性レベルの選択

レベル 読み取り待機の有無 プライマリノードの負荷 推奨されるケース
結果整合性 なし 最小 ステイルリードが許容され、読み取り専用ノードの利用率を最大化する場合
セッション整合性 セッション内で必要な場合のみ ほとんどのアプリケーション:セッション内での書き込み後の読み取りを保証
グローバル整合性 あり (リクエストごと) コネクションプールなど、セッション間の依存関係がある場合
グローバル整合性 (高性能モード) なし (カーネルレベル) オーバーヘッド最小 PolarDB for MySQL 5.7、8.0.1、または 8.0.2 で厳密な強い整合性が必要な場合

ほとんどのワークロードでは、セッション整合性の使用を推奨します。クラスターのパフォーマンスへの影響を最小限に抑えながら、大半の整合性要件を満たします。PolarDB for MySQL 5.6 では、高性能モードがサポートされていないため、代わりにグローバル整合性を使用してください。

PolarDB のデータレプリケーション

PolarDB は、非同期物理レプリケーションを使用して、読み取り専用ノードをプライマリノードと同期させます。プライマリノードで書き込みが完了すると、変更は読み取り専用ノードに伝播します。ほとんどの場合、数ミリ秒以内に完了します。このレプリケーション遅延が、読み書き分離構成における読み取り不整合の根本原因です。

結果整合性

結果整合性では、すべての読み取りを待機することなく読み取り専用ノードにルーティングします。書き込み直後の SELECT では、レプリケーションが追いついていない場合、古いデータが返される可能性があります。

INSERT INTO t1(id, price) VALUES(111, 96);
UPDATE t1 SET price = 100 WHERE id=111;
SELECT price FROM t1;  -- レプリケーションが追いついていない場合、100 ではなく 96 が返される可能性があります

読み取り専用ノードの利用率を最大化し、アプリケーションが若干古いデータの読み取りを許容できる場合は、結果整合性を使用してください。

セッション整合性

セッション整合性は、因果整合性とも呼ばれ、セッション内での書き込み後の読み取りを保証します。書き込み後、同じセッション内の以降の読み取りでは、読み取り専用ノードにルーティングされた場合でも、常にその書き込みの結果が反映されます。

仕組み

PolarProxy は、各ノードで適用されたログシーケンス番号 (LSN) を追跡します。各書き込みは、その LSN をセッション LSN として記録します。読み取りが到着すると、PolarProxy は、適用された LSN がセッション LSN 以上のノードにのみルーティングします。読み取り専用ノードの LSN がセッション LSN より小さい場合、PolarProxy は、指定されたタイムアウト期間内にノードが最新データに更新された場合にのみ、そのノードにリクエストを転送します。

PolarDB は物理レプリケーションを使用するため、追いつきは高速です。読み取り専用ノードがクライアントに結果を返している間も、他のノードへのレプリケーションは並行して続行されるため、後続の読み取りリクエストが到着する前に読み取り専用ノードでデータが更新されます。

4

ほとんどのアプリケーションでは、セッション整合性を使用してください。読み書き分離と負荷分散のメリットを維持しながら、各セッション内で一貫した結果を保証します。

グローバル整合性

セッション整合性は、単一セッション内の依存関係に対応しますが、セッション間の依存関係には対応していません。たとえば、コネクションプールが同じ論理スレッドをリクエスト間で異なるデータベース接続に割り当てる場合などです。この場合、あるセッションでの書き込みが、別のセッションでの読み取りでは反映されない可能性があります。

グローバル整合性は、すべての読み取りリクエストの前にプライマリノードの最新 LSN をチェックすることで、この問題を解決します。PolarProxy は、複数の同時読み取りリクエストをまとめて、プライマリ LSN を一括で取得し、オーバーヘッドを最小限に抑えます。少なくとも 1 つの読み取り専用ノードの LSN がプライマリ LSN (LSN0) に到達すると、PolarProxy はそのノードに読み取りをルーティングします。これにより、すべての読み取りが、リクエストが開始された時点までのすべてのコミット済み書き込みを反映することが保証されます。

会话间存在的依赖关系

設定パラメータ

パラメータ 表示名 説明 有効な値 デフォルト
ConsistTimeout グローバル整合性タイムアウト 読み取りリクエストを受信した後、PolarProxy が読み取り専用ノードがプライマリ LSN に到達するまで待機する最大時間。 0 ~ 60000 20 (ミリ秒)
ConsistTimeoutAction グローバル整合性タイムアウトポリシー ConsistTimeout が期限切れになったときに実行されるアクション。0:読み取りをプライマリノードにルーティングします。1:エラー wait replication complete timeout, please retry を返します。 0、1 0

これらのパラメータを変更するには、「PolarProxy の設定」をご参照ください。

グローバル整合性は、大量の読み取りリクエストと少量の書き込みリクエストが処理されるシナリオ (セッション間での書き込み後の読み取り依存関係があるコネクションプールなど) で使用してください。レプリケーション遅延が大きい場合、一部の読み取りがプライマリノードにフォールバックし、その負荷が増加する可能性があります。

グローバル整合性 (高性能モード)

グローバル整合性 (高性能モード) は、強い整合性を提供します。これは、グローバル整合性よりも強力な保証であり、PolarTrans によってカーネルレベルで実装されます。Commit Timestamp Store (CTS) と Remote Direct Memory Access (RDMA) を使用して、クラスター内のすべての読み取り専用ノードからのすべての読み取りが、標準のグローバル整合性のようなリクエストごとの待機オーバーヘッドなしで、強い整合性のある結果を返すことを保証します。

制限事項、仕組み、有効化方法、パフォーマンスベンチマークについては、「グローバル整合性 (高性能モード)」をご参照ください。

クエリのプライマリノードへの強制

/*FORCE_MASTER*/ ヒントを使用すると、設定された整合性レベルに関係なく、特定のクエリをプライマリノードに直接送信できます。

/*FORCE_MASTER*/ SELECT * FROM user;

ヒントは最も高いルーティング優先度を持ち、整合性レベルとトランザクション分割をオーバーライドします。

使用上の注意:

  • MySQL コマンドラインクライアントからこのステートメントを実行する場合は、-c フラグを追加してください。追加しないと、クライアントがヒントコメントを削除します。詳細については、「mysql クライアントオプション」をご参照ください。

  • ヒントには、環境変数を変更する SQL ステートメントを含めることはできません。たとえば、/*FORCE_SLAVE*/ SET NAMES utf8; を使用すると、エラーが発生する可能性があります。

  • 本番環境でヒントを使用する前に、ワークロードへの影響を評価してください。ヒントはすべての負荷分散ロジックをバイパスします。

整合性レベルの設定

よくある質問

コンソールに整合性設定が表示されないのはなぜですか?

整合性レベルの設定は、クラスターに少なくとも 1 つの読み取り専用ノードがある場合にのみ表示されます。クラスターに読み取り専用ノードがない場合、PolarDB コンソールには整合性設定セクションが表示されません。この問題を解決するには、クラスターに少なくとも 1 つの読み取り専用ノードを追加してください。詳細については、「ノードの追加または削除」をご参照ください。

次のステップ