Commit scope groups#

PGDでトランザクションがコミットする前に、1つ以上のノードがそれを確認する必要があります。コミットスコープグループは、それらがどのノードであるかを指定するコミットスコープルールの一部です。

例、次のコミットスコープ定義の場合。

SELECT bdr.create_commit_scope(
    commit_scope_name := example_scope,
    origin_node_group := top_group,
    rule := MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT,
    wait_for_ready := true
);

ルールMAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT では、 SYNCHRONOUS COMMIT はコミットスコープの種類であり、確認の動作を制御します。 MAJORITY ORIGIN GROUP はコミットスコープグループであり、元のノードと同じサブグループ内のノードの大部分が確認する必要があることを意味します。コミットスコープルールの構文の完全な説明については、 Commit scope rules を参照してください。

コミットスコープグループは、しきい値を設定する量子子MAJORITY などの2つの部分で構成され、もう1つはカウントするノードを識別するグループ指定子ORIGIN GROUP などです。

数量子#

量指定子は確認しきい値を設定し、トランザクションをコミットする前にグループ指定子のノードの数を確認する必要があります。

  • ALL では、グループ内のすべてのノードを確認する必要があります。単一ノードに障害が発生すると、ノードが復旧するかタイムアウトが満了するまで、新しいコミットが妨げられます。

  • MAJORITY では、ノードの半分を超えて3つ中2つ、または5つ中3つを確認する必要があります。この量子は、クォーラムを維持しながら半分未満のノードの障害を許容するため、高可用性構成の標準の選択です。

  • ANY n で確認するには、少なくともn ノードが必要です。 ANY 1 は、少なくとも1つのノードを意味します。 ANY 2 は、少なくとも2つを意味します。これにより、きめの細かい制御が可能になり、完全なマジョリティを必要とせずにリモートリージョンから少なくとも1つの確認が必要な場合に役立ちます。

グループ指定子#

グループ指定子は、どのノードがトランザクションを確認する資格があるかを識別します。

明示的なグループ名#

明示的なグループ名を使用して、クラスター内に存在する特定の名前付けのPGDグループをターゲットにします。この動作は修正され、どのノードがトランザクションを開始したかに関係なく、予測可能です。例、MAJORITY (region_a) 、ALL (region_a) 、またはANY 2 (region_a) 。

クラスター#

CLUSTER は、クラスター内のすべてのサブグループにわたって、クラスター内のすべてのデータノードから選択します。クォーラムを単一のサブグループではなくクラスター全体にまたがる場合に、 CLUSTER を使用します。例、MAJORITY CLUSTER またはALL CLUSTER 。

ORIGIN_GROUP#

ORIGIN_GROUP は、トランザクション元のノードを含むサブグループを動的に解決し、固定グループに名前を付けるのではなくトランザクションが書き込まれる場所に適応します。例、MAJORITY ORIGIN GROUP またはALL ORIGIN GROUP 。

注釈

ORIGIN_GROUP および`ORIGIN GROUP` は互換性があります。

ORIGIN_GROUP は、ローカルルーティングを使用する展開の標準の選択です。各サブグループには独自の書き込みリーダーがあり、アプリケーションはローカルリージョンに接続します。サブグループごとに個別のルールを記述するのではなく、 ORIGIN_GROUP を使用する単一のルールは、どのサブグループがオリジンであるかに関係なく、正しく適用されます。

たとえば、トランザクションがregion_a のノードから発生した場合、 ORIGIN_GROUP はregion_a に解決されます。 region_b から発生した場合、region_b に解決されます。同じコミットスコープは、どちらの場合も正しく動作します。

ORIGIN_GROUPではありません#

NOT ORIGIN_GROUP は、起点ノードを含まないすべてのサブグループに動的に解決されます。これはORIGIN_GROUP を補完するものであり、マルチリージョンルールでそれと一緒に使用されるように設計されています。例、ANY 1 NOT ORIGIN_GROUP またはALL NOT ORIGIN_GROUP 。

NOT ORIGIN_GROUP は、通常、単独で使用されることはありません。その目的は、 MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT AND ANY 1 NOT ORIGIN GROUP SYNCHRONOUS COMMIT と同様に、ORIGIN_GROUP を介してローカルリージョンを既にカバーしているルールにクロスリージョンの確認要件を追加することです。

グループごとに#

明示的なリストを使用するFOR EACH GROUP では、各名前付けグループ内で独立して量指定子が満たされる必要があります。たとえば、 MAJORITY FOR EACH GROUP (region_a, region_b) は、 region_a のノードの大部分とregion_b のノードの大部分が、トランザクションがコミットする前に両方とも確認する必要があることを意味します。

FOR EACH GROUP は、両方のグループのノードをプールし、合計の大部分を必要とするMAJORITY (region_a, region_b) より厳密です。 FOR EACH GROUP では、すべてのグループ内で個別にしきい値を満たす必要があります。

規制要件または可用性保証で、コミットが確認される前にすべてのリージョンでデータの耐久性が必要な場合など、各リージョンがトランザクションを独立して確認する必要がある場合に、 FOR EACH GROUP を使用します。

クラスター内のグループごとに#

FOR EACH GROUP IN CLUSTER は、明示的なリストを使用したFOR EACH GROUP の動的同等です。サブグループに個々に名前を付けるのではなく、クラスター内のすべてのサブグループに量指定子を自動的に適用します。例、MAJORITY FOR EACH GROUP IN CLUSTER またはANY 1 FOR EACH GROUP IN CLUSTER 。

サブグループが追加または削除されると、ルールはコミットスコープ定義を変更せずに適応します。 FOR EACH GROUP IN CLUSTER は、サブグループのセットが時間の経過とともに変更される可能性がある3つ以上のリージョンを持つクラスター、またはクラスターが成長しても単一のコミットスコープ定義を有効なままにしておきたい場合に、 FOR EACH GROUP IN CLUSTER を使用します。

グループの結合#

グループ式をAND と組み合わせて、複数のグループからの確認を必要とします。各式は独立して評価され、トランザクションがコミットする前にすべてが満たされる必要があります。

ローカルマジョリティとリモート確認が必要#

最も一般的なマルチリージョンパターンでは、ローカルリージョン内のノードの大部分に加えて、他のリージョンからの少なくとも1つの確認が必要です。

SELECT bdr.create_commit_scope(
    commit_scope_name := ha_scope,
    origin_node_group := top_group,
    rule := MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT AND ANY 1 NOT ORIGIN GROUP SYNCHRONOUS COMMIT,
    wait_for_ready := true
);

どのサブグループがトランザクションを発生したかに関係なく、ORIGIN GROUP はそのサブグループに解決され、NOT ORIGIN GROUP は他のすべてのサブグループに解決されます。このルールでは、常にローカルマジョリティとローカルサブグループの外部からの少なくとも1つの確認が必要で、コミットされたすべてのトランザクションが少なくとも2つのリージョンで確認されていることを保証します。リモート確認により、他の場所でのトランザクションの耐久性が保証されるため、単一リージョンの停止がデータ損失を引き起こす可能性はありません。

すべてのローカルノードとリモート確認を必要とする#

サブグループが固定され、どのグループが参加するかを明示したい場合

SELECT bdr.create_commit_scope(
    commit_scope_name := explicit_scope,
    origin_node_group := region_a,
    rule := ALL (region_a) SYNCHRONOUS COMMIT AND ANY 1 (region_b) SYNCHRONOUS COMMIT,
    wait_for_ready := true
);

region_a のすべてのノードとregion_b の任意の1つのノードを確認する必要があります。明示的なグループORIGIN_GROUP ではなくでALL を使用する場合、これは通常、すべてのコミットで両方のセンターが表される必要がある2データセンター構成に適切な構造です。

これらのグループを使用する対応するコミットスコープの種類については、 How Quorum Commit works および Synchronous Commit を参照してください。