Commit scopes#
コミットスコープにより、アプリケーションはEDB Postgres Distributedの耐久性と一貫性に関する詳細な制御を提供します。
コミットスコープは、トランザクションがコミットされるときのシステムの動作を記述する一連のルールです。実際の動作は、コミットスコープのルールがどの種類のコミットスコープを使用するかによって異なります Synchronous Commit 、 How Quorum Commit works 、 Commit At Most Once 、 Lag Control 、またはこれらの組み合わせを使用します。
ほとんどのコミットスコープの種類はトランザクションの処理を制御しますが、Lag Controlは例外で、遅いまたはキューアップされているレプリケーション操作に応じてシステムのパフォーマンスを動的に調整します。ただし、通常は他のコミットスコープ種類と組み合わせて使用されます
コミットスコープ構造#
すべてのコミットスコープには名前commit_scope_name があります。
各コミットスコープには1つ以上のルールがあります。
コミットスコープ内の各ルールには、コミットスコープルールを一意に識別するorigin_node_group
があります。
origin_node_group
はPGDグループであり、トランザクションのオリジネーターであるときにこのルールを適用するノードを定義します。
最後に、これらのトランザクションに適用されるコミットスコープまたはコミットスコープ種類の組み合わせを定義するルールがあります。
したがって、コミットスコープに次のルールがある場合
origin_node_group := ‘example_bdr_group’、rule := ‘MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT’,
次に、ルールは、example_bdr_group
のノードがトランザクションを発行したときに適用されます。
ルール自分自身は、変更を確認するために指定されたグループのノードの数を指定します。
MAJORITY ORIGIN GROUP
はコミットスコープグループであり、SYNCHRONOUS COMMIT
はコミットスコープの種類です。これは、変更がコミットされたと見なされる前に、元のノードのグループ内のノードの大部分が変更を確認する必要があることを意味します。
コミットスコープの選択方法#
変更が発生すると、 PGDはトランザクションまたはノードに使用するコミットスコープを検索します。
トランザクションがコミットスコープを指定している場合、そのスコープが使用されます。
指定しない場合、システムはデフォルトのコミットスコープを検索します。デフォルトのコミットスコープはグループレベルの設定です。システムはグループツリーを参照します。ノードのグループを含むグループツリーの下部から始めて上へ、default_commit_scope設定が定義されているグループを検索します。このコミットスコープが使用されます。
default_commit_scopeが見つからない場合、ノードのGUC、
bdr.commit_scopeが使用されます。そして、それが設定されていないか、local
に設定されている場合、コミットスコープは適用されず、PGDの非同期レプリケーションが使用されます。
コミットスコープルールは、元のノードのグループがルールのorigin_node_group
またはそのサブグループのいずれかである場合、トランザクションに適用されます。
PGDは、ノード自分のグループからグループツリーを昇順することにより一致を決定します。そのため、親またはトップレベルのグループで定義されたルールは、そのサブグループで発生したトランザクションにも適用されます。一致するルールがなく、スコープがlocal
でない場合、トランザクションはPGDのデフォルトの非同期レプリケーションを使用します。
コミットスコープの作成#
bdr.create_commit_scope
を使用して、ルール例をコミットスコープに追加します。例
SELECT bdr.create_commit_scope(
commit_scope_name := example_scope,
origin_node_group := example_bdr_group,
rule := MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT,
wait_for_ready := true
);
これにより、example_bdr_group
から発生したトランザクションのルールMAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT
がexample_scope と呼ばれるスコープに追加されます。
example_scope
に以前にルールが存在しなかった場合、このルールを追加するとスコープが存在します。
ルールが追加されるときは、origin_node_groupが既に存在する必要があります。そうしない場合、追加操作全体がエラーで破棄されます。
ルールが評価されます。ルールが存在しないグループを記載しているか、グループの設定がグループのノードの他の構成設定と互換性がない場合、警告が表示されますが、ルールは追加されます。
ルールが追加されると、コミットスコープが使用できるようになります。
wait_for_ready
は、ルールが関連するノードに追加されるまで、bdr.create_commit_scope()
呼び出しをブロックするかどうかを制御します。設定はデフォルトでtrueであり、省略できます。
コミットスコープを使用する#
この例のスコープを使用するには、トランザクション内でbdr.commit_scope
を設定できます
BEGIN;
SET LOCAL bdr.commit_scope = example_scope;
...
COMMIT;
トランザクションがデータを書き込む前に、コミットスコープを設定する必要があります。
bdr.alter_node_group_option
を使用して、グループまたはサブグループのデフォルトとしてコミットスコープを設定できます。
SELECT bdr.alter_node_group_option(
node_group_name := example_bdr_group,
config_key := default_commit_scope,
config_value := example_scope
);
グループまたはサブグループのデフォルトを完全にクリアするには、
default_commit_scope 値をlocal に設定します。
SELECT bdr.alter_node_group_option(
node_group_name := example_bdr_group,
config_key := default_commit_scope,
config_value := local
);
PGD CLIを使用してこの変更を行うこともできます。
pgd group example-bdr-group set-option default_commit_scope "example_scope"
また、PGD CLIを使用して値をlocal
に設定することにより、デフォルトをクリアできます。
pgd group example-bdr-group set-option default_commit_scope "local"
最後に、次を使用してノードのデフォルトのcommit_scopeを設定できます。
SET bdr.commit_scope = example_scope;
PGDのデフォルトの非同期レプリケーションを使用するには、
bdr.commit_scope からlocal を設定します。