Group Commit

Group Commitの目的は、単一ノードの障害または一時的な停止の場合にデータロスから保護することです。これは、COMMIT時にトランザクションを正常に受信して確認するために複数のBDRノードを必要とすることによって実現されます。

要件

通常のオペレーション中、 Group Commitはアプリケーションに対して完全に透過的です。フェイルオーバー時に、調整フェーズは、アプリケーションまたは中間のプロキシによって明示的にトリガーまたは統合されるニーズがあります。 HARPはグループコミットのネイティブサポートを提供し、調整フェーズをトリガーするため、これをクライアントに対して同様に透過的にします。

オリジンノードでは、グループコミットでコミットされたトランザクションは、下で二相コミットを使用します。したがって、 max_prepared_transactions は、ノードごとに発生するそのようなすべてのトランザクションをハンドルするのに十分な高さに構成ニーズがあります。

構成

Group Commitを使用するには、最初にCommit Scopeを定義ニーズがあります。これにより、トランザクションのコミットに関係するBDRノードが決まります。スコープが確立されると、次のようにグループコミットを使用するようにトランザクションを構成できます。

BEGIN;
SET LOCAL bdr.commit_scope = example_scope;
...
COMMIT;

この例を完了するには、問題のコミットスコープが以前に次のように定義されている場合があります。

SELECT bdr.add_commit_scope(
    commit_scope_name := example_scope,
    origin_node_group := example_bdr_group,
    rule := ANY 2 (example_bdr_group)
);

これは、 example_bdr_group 名前付けのノードグループが存在し、少なくとも2つのBDRノードをメンバーとして(直接またはサブグループに)含むことを前提としています。 example_scope 内でコミットされたトランザクションには、グループ内のBDRノードからの追加の確認が1つ必要です。オリジンノードとともに、これはグループ内の「ANY 2」ノードを説明し、コミット後にトランザクションが可視で耐久性があることが保証されます。

オリジングループ

コミットスコープのルールは、トランザクションがコミットされるノード、つまり、どのノードがトランザクションのオリジンとして機能するかによって異なります。これをアプリケーションに対して透過的にするために、 BDRでは、トランザクションの発生元に応じてコミットスコープがさまざまなルールを定義できます。

例、ノードが左側と右側の2つのデータセンターにまたがるBDRクラスターを考えます。最上位のBDRノードグループの名前がtop_group であるとします。次のコマンドを使用して、サブグループを設定し、ローカルデータセンター内のすべてのノードがトランザクションを確認することを必要とするコミットスコープを作成できますが、リモートからは1つのノードのみです。

- - create sub-groups
SELECT bdr.create_node_group(node_group_name := left_dc,
                             parent_group_name := top_group,
                             join_node_group := false);
SELECT bdr.create_node_group(node_group_name := right_dc,
                             parent_group_name := top_group,
                             join_node_group := false);

- - create a commit scope with individual rules for each sub-group
SELECT bdr.add_commit_scope(
    commit_scope_name := example_scope,
    origin_node_group := left_dc,
    rule := ALL (left_dc) AND ANY 1 (right_dc)
);
SELECT bdr.add_commit_scope(
    commit_scope_name := example_scope,
    origin_node_group := right_dc,
    rule := ANY 1 (left_dc) AND ALL (right_dc)
);

確認レベル

BDRノードは、 Commit At Most Once と同様に、さまざまな時点でトランザクションの確認を送信できます。保護レベルを上げると、確認ノードの観点から、これらは次のとおりです。

  • received -リモートBDRノードは、ローカルアプリケーションを開始する前に、トランザクションを受信した直後に確認します

  • replicated -トランザクションの変更を適用した後、ディスクにフラッシュする前に確認します

  • durable - すべての変更がディスクにフラッシュされた後にトランザクションを確認する

  • visible (デフォルト)-すべての変更がディスクにフラッシュされ、同時実行トランザクションから可視になった後、トランザクションを確認します。

コミットスコープのルールでは、次のようにON を使用してこれらの確認レベルをノードグループ定義(括弧内)に追加できます。

  • ANY 1 (right_dc) ON remote_write

  • ALL (left_dc) ON remote_commit_flush (デフォルトで省略可)

  • ALL (left_dc) ON remote_commit_async AND ANY 1 (right_dc) ON remote_write

リファレンス

コミットスコープの文法

リファレンスまでに、コミットスコープの文法は次のとおりです。

commit_scope: confirmation
              | confirmation AND commit_scope

confirmation: node_def (ON [received|replicated|durable|visible])

node_def:     ANY num (node_group [, ...])
              | MAJORITY (node_group [, ...])
              | ALL (node_group [, ...])

コミットスコープルールの追加

ファンクションbdr.add_commit_scope は、指定されたコミットスコープ名前とオリジンノードグループのルールを作成します。 BDRクラスター内のすべてのノードでルールが同じ場合、最上位のノードグループに対してこのファンクションを1回呼び出すだけで、コミット範囲を完全に定義できます。

または、同じ commit_scope_name でマルチプル回呼び出される場合がありますが、オリジンノードグループと、トランザクションのオリジンによって異なるコミットスコープのルールがあります。

概要

bdr.add_commit_scope(commit_scope_name NAME, origin_node_group NAME,
                     rule TEXT)

コミット範囲ルールの変更

コミットスコープ内の単一のオリジンノードグループの特定のルールを変更するには、ファンクションbdr.alter_commit_scope を使用できます。

概要

bdr.alter_commit_scope(commit_scope_name NAME, origin_node_group NAME,
                       rule TEXT)

コミットスコープルールの削除

bdr.remove_commit_scope を使用して、コミット範囲内の単一のルールを削除できます。コミットスコープにマルチプルのルールが定義されている場合、このファンクションをルールごとに1回呼び出して、コミットスコープ全体を完全に削除する必要があります。

概要

bdr.remove_commit_scope(commit_scope_name NAME, origin_node_group NAME)