Commit scopes#

コミットスコープは、PGDシステム内でトランザクションのコミットと競合を処理する方法を決定するルールです。それらの詳細については、 コミットスコープへの移行 を参照してください。

次のファンクションを使用して、コミットスコープを操作できます。

コミットスコープの構文#

コミットスコープルールの全体的な文法は次のように構成されます。

commit_scope:
    commit_scope_operation [AND ...]

commit_scope_operation:
    commit_scope_group confirmation_level commit_scope_kind

commit_scope_target:
    { (node_group [, ...])
      | ORIGIN_GROUP }

commit_scope_group:
{ ANY num [NOT] commit_scope_target
  | MAJORITY [NOT] commit_scope_target
  | ALL [NOT] commit_scope_target }

confirmation_level:
    [ ON { received|replicated|durable|visible } ]

commit_scope_kind:
{ GROUP COMMIT [ ( group_commit_parameter = value [, ... ] ) ] [ ABORT ON ( abort_on_parameter = value ) ] [ DEGRADE ON (degrade_on_parameter = value [, ... ] ) TO commit_scope_degrade_operation ]
  | QUORUM COMMIT [ ( commit_decision = { group | raft } ) ] ABORT ON ( timeout = value )
  | CAMO [ DEGRADE ON ( degrade_on_parameter = value [, ... ] ) TO ASYNC ]
  | LAG CONTROL [ ( lag_control_parameter = value [, ... ] ) ]
  | SYNCHRONOUS COMMIT [ DEGRADE ON (degrade_on_parameter = value ) TO commit_scope_degrade_operation ] }

commit_scope_degrade_operation:
   commit_scope_group confirmation_level commit_scope_kind

node_group は、PGDデータノードグループの名前です。

commit_scope_degrade_operation#

commit_scope_degrade_operation は、定義されるルール全体としてより制限の少ないコミットスコープグループと同じコミットスコープ種類であるか、非同期ASYNC のいずれかです。

例、 Degrading commit scope rules ALL SYNCHRONOUS COMMIT からMAJORITY SYNCHRONOUS COMMIT 、またはMAJORITY SYNCHRONOUS COMMIT からANY 3 SYNCHRONOUS COMMIT 、またはANY 3 SYNCHRONOUS COMMIT からANY 2 SYNCHRONOUS COMMIT 。 SYNCHRONOUS COMMIT からASYNC に低下することもできます。ただし、関係するコミットスコープグループに関係なく、SYNCHRONOUS COMMIT からGROUP COMMIT またはその逆に低下することはできません。

AND を使用して、それぞれが独自の低下句を持つルールを組み合わせることもできます。

ALL ORIGIN GROUP SYNCHRONOUS COMMIT DEGRADE ON (timeout = 10s) TO MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT AND ANY 1 NOT ORIGIN GROUP SYNCHRONOUS COMMIT DEGRADE ON (timeout = 20s) TO ASYNC

コミットスコープターゲット#

ORIGIN_GROUP#

特定のグループをターゲットとする代わりに、トランザクションが発生する最下位グループを動的に参照するORIGIN_GROUP を使用することもできます。したがって、トップレベルグループtop_group と、子として2つのサブグループleft_dc およびright_dc がある場合、次のようなコミットスコープを追加します。

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

left_dc のノードで発生したトランザクションの場合、 left_dc のノードの大部分は、トランザクションがコミットされる前に同期的に確認する必要があることを意味します。さらに、同じルールは、 right_dc のノードから発生したトランザクションの場合、 right_dc のノードの大部分が、コミットされる前にトランザクションを同期的に確認する必要があることも意味します。これにより、left_dc 用とright_dc 用の2つの別個のルールをコミットスコープに追加する必要がなくなります。

コミットスコープグループ#

任意#

例 ANY 2 (left_dc)

このコミットスコープグループのトランザクションは、 left_dc グループ内の2つのノードがトランザクションを処理したことを確認した後、コミットされたとみなされます。

ANY NOT#

例 ANY 2 NOT (left_dc)

left_dc グループにない2つのノードがトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

マジョリティ#

例 MAJORITY (left_dc)

left_dc グループ内のノードの大部分がトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

マジョリティではない#

例 MAJORITY NOT (left_dc)

left_dc グループにないノードの大部分がトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

すべて#

例 ALL (left_dc)

left_dc グループ内のすべてのノードがトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

ALL を Group Commit (legacy) とともに使用する場合、リコンシリエーションの問題を回避するには、 bdr.commit_Decisions 設定をraft に設定する必要があります。

すべてではない#

例 ALL NOT (left_dc)

left_dc グループにないすべてのノードがトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

確認レベル#

確認レベルは、リモートPGDノードがトランザクションの処理中に特定のポイントに到達したことを確認する時点を設定します。 QUORUM COMMIT は、durable およびvisible のみをサポートしています。

ONを受信しました#

トランザクションは、ローカルアプリケーションを開始する前に、受信後すぐに確認されます。

ONが複製されました#

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

ON耐久性#

トランザクションは、すべての変更がディスクにフラッシュされた後に確認されます。

ON可視#

これはデフォルトの可視性です。トランザクションは、すべての変更がディスクにフラッシュされ、同時トランザクションに可視された後に確認されます。

コミットスコープの種類#

コミットスコープの種類の詳細とそのパラメーターの詳細

Postgres GUC parameter value conventions を使用して、 Boolean、enum、int、およびinterval値を指定します。

SYNCHRONOUS COMMIT [ DEGRADE ON (degrade_on_parameter = value ) TO commit_scope_degrade_operation ]

DEGRADE ONパラメーター#

Parameter

Type

Default

Description

timeout

interval

0

ミリ秒単位のタイムアウト他の単位を受け入れます。その後、オペレーションが低下します。 0は設定されていないことを意味します。

require_write_lead

Boolean

False

ノードが縮退動作に切り替えることができるように書き込みリードである必要があるかどうかを指定します。

これらは、コミットスコープルールがより制限の低いオペレーションモードに低下する条件を設定します。

commit_scope_degrade_operation#

commit_scope_degrade_operation は、より制限の少ないコミットスコープグループのSYNCHRONOUS COMMIT であるか、非同期ASYNC である必要があります。

クォーラムコミット#

ノードがコミットする前に、すべての参加ノードにわたってコミット決定を調整することにより、分散トランザクションの一貫性を提供します。

詳細については、 How Quorum Commit works を参照してください。

QUORUM COMMIT [ ( commit_decision = { group | raft } ) ] ABORT ON ( timeout = value )

サポートされているコミットスコープグループは、ALL 、MAJORITY ORIGIN GROUP 、MAJORITY CLUSTER 、およびMAJORITY FOR EACH GROUP です。明示的なグループリストを使用したMAJORITY 、 ANY n 、およびNOT はサポートされていません。

QUORUM COMMIT では、 durable およびvisible 確認レベルのみがサポートされています。 received またはreplicated を使用するとエラーになります。

QUORUM COMMITパラメーター#

Parameter

Type

Default

Description

commit_decision

enum

group

コミットの決定がどのように行われるかを指定します。 group I raft 。 commit_決める設定 を参照してください。

QUORUM COMMIT ABORT ONパラメーター#

ABORT ON は、クォーラムコミットには必須です。

Parameter

Type

Default

Description

timeout

interval

0

アボートする前にクォーラムを待機する時間。 0は設定されていないことを意味します。

commit_決める設定#

値group は、オリジンノードがコミットスコープグループから必要な確認を受信すると、コミットすることを決定することを意味します。

値raft は、コミット決定がPGDのビルトインRaftコンセンサスを介して行われることを意味します。これはgroup より遅いですが、特定のマルチグループトポロジで必要になる場合があります。

CAMO#

クライアントの協力により、フェールオーバーシナリオで同じトランザクションの複数の挿入を防止する保護を有効にします。

詳細は、 Commit At Most Once を参照してください。

CAMO [ DEGRADE ON ( degrade_on_parameter = value ) TO ASYNC ]

DEGRADE ONパラメーター#

タイムアウト時に非同期操作に低下することを許可します。

Parameter

Type

Default

Description

timeout

interval

0

ミリ秒単位のタイムアウト他の単位を受け入れますこの後、操作は非同期になります。 0は設定されていないことを意味します。

require_write_lead

Boolean

False

ノードが非同期モードに切り替えることができるように書き込みリードである必要があるかどうかを指定します。

ラグコントロール#

レプリケーションラグによって制御される動的なレート制限の構成が可能になります。

詳細は、 Lag Control を参照してください。

LAG CONTROL [ ( lag_control_parameter = value [, ... ] ) ]

LAG CONTROLパラメーター#

Parameter

Type

Default

Description

max_lag_size

int

0

特定のノードが別のノードへのレプリケーション接続で持つことができるKB単位の最大遅延。遅延が`max_commit_delay`によってスケールされたこの最大値を超えると、遅延制御はコミット遅延を調整します。

max_lag_time

interval

0

特定のダウンストリームノードへのレプリケーション接続に関して、特定のオリジンが持つことができるミリ秒単位の最大レプリケーションラグ。

max_commit_delay

interval

0

各コミットにかかる最大遅延をミリ秒の小数単位で構成します。 0に設定すると、Lag Controlが無効になります。各コミット遅延調整の後たとえば、レプリケーションが`max_lag_size`または`max_lag_time`よりも遅延している場合、コミット遅延は`bdr.lag_control_commit_delay_adjust` GUCの重みで再計算されます。 `max_commit_delay`は、コミット遅延の上限です。

  • max_lag_size およびmax_lag_time が0に設定されている場合、LAG CONTROLは無効になります。

  • max_commit_delay が設定されていないか、0に設定されている場合、LAG CONTROLは無効になります。

遅延サイズは、walsenderのsend_ptr から受信者のapply_ptr までのデルタから導き出されます。

遅延時間は次の式に従って計算されます。

lag_time = (lag_size / apply_rate) * 1000;

lag_size は、send_ptr とapply_ptr max_lag_size に使用されるデルタであり、 apply_rate は、単純化された式に従う加重指数移動平均です。

apply_rate = prev_apply_rate * (1 - apply_rate_weight) +
              ((apply_ptr_diff * apply_rate_weight) / diff_secs);

そこで

  • prev_apply_rate は、新しいレートを再計算する前に、以前に構成されたapply_rate でした。

  • apply_rate_weight は、GUC bdr.lag_tracker_apply_rate_weight の値です。

  • apply_ptr_diff は、現在のapply_ptr と、適用レートが最後に計算された時点でのapply_ptr の差です。

  • diff_secs は、最後に適用レートが計算されてからの秒単位のデルタです。

グループコミット#

ノードのコンセンサスによってコミットを確認でき、競合解決設定を制御し、 Synchronous Commit と同様に、オプションのルール低下パラメーターがあります。

GROUP COMMIT [ ( group_commit_parameter = value [, ...] ) ] [ ABORT ON ( abort_on_parameter = value ) ] [ DEGRADE ON (degrade_on_parameter = value ) TO commit_scope_degrade_operation ]

GROUP COMMITパラメーター#

Parameter

Type

Default

Description

transaction_tracking

Boolean

Off/False

トランザクションのステータスを追跡するかどうかを指定します。 transaction_tracking設定 を参照してください。

conflict_resolution

enum

async

競合を処理する方法を指定します。 async`I`eager 。 fence_resolution設定 を参照してください。

commit_decision

enum

group

COMMIT決定を行う方法を指定します。 group`I`partner`I`raft 。 commit_決める設定 を参照してください。

ABORT ONパラメーター#

Parameter

Type

Default

Description

timeout

interval

0

ミリ秒単位のタイムアウト他の単位を受け入れます。 0は設定されていないことを意味します。

require_write_lead

Boolean

False

CAMOのみ。設定されている場合、トランザクションをローカル非同期モードに切り替えるには、コンセンサス要求が必要です。

DEGRADE ONパラメーター#

Parameter

Type

Default

Description

timeout

interval

0

ミリ秒単位のタイムアウト他の単位を受け入れます。その後、オペレーションが低下します。 0は設定されていないことを意味します。

require_write_lead

Boolean

False

ノードが縮退動作に切り替えることができるように書き込みリードである必要があるかどうかを指定します。

transaction_tracking設定#

trueに設定されている場合、2フェーズコミットトランザクション

  • ライタがPREPAREメッセージを処理しているときにコミット決定をルックアップします。

  • 中断から回復するときは、中断前に準備されたトランザクションを検索します。見つかると、トランザクションのコミットスコープと、対応するRAFTコミット決定を検索します。ノードがトランザクションのオリジンであり、RAFTコミット決定がなく、コミットスコープでtransaction_tracking がオンであると仮定します。その場合、コミットまたは中止されるまで、この未解決のトランザクションのRAFTコミット決定を定期的に検索します。

fence_resolution設定#

値async は、レプリケーション中に競合解決ポリシーを使用して競合を非同期的に解決することを意味します。

値eager は、 COMMIT中に、競合するトランザクションのいずれかがアボートすることにより、競合が熱心に解決されることを意味します。

Eagerは、 MAJORITY またはALL コミットスコープグループでのみ使用できます。

ALL コミットスコープグループで使用する場合、リコンシレーションの問題を回避するには、 bdr.commit_Decisions をraft に設定する必要があります。

欠落列の競合の解決 を参照してください。

GROUP COMMIT commit_決断設定#

値group は、前述のcommit_scope_group 仕様が耐久性だけでなくCOMMIT決定にも影響を与えることを意味します。

値partner は、パートナーノードがトランザクションをコミットできるかどうかを決定することを意味します。この値は、2つのデータノードを持つグループでのみ許可されます。

値raft は、決定がPGDのビルトインRaftコンセンサスを利用することを意味します。選択したコミットスコープグループのすべてのノードがトランザクションを確認したら、PGDクラスター内のすべてのノードがトランザクションを記録したことを確認するために、全ノードのRaftで記録されます。

ALL コミットスコープグループが使用されている場合、このオプションは使用して、決定を巡ってノード間で相違がないことを保証する必要があります。このオプションはパフォーマンスが低い場合があります。

決定をコミットする を参照してください。

commit_scope_degrade_operation設定#

commit_scope_degrade_operation は、より制限の少ないコミットスコープグループのGROUP_COMMIT であるか、非同期ASYNC である必要があります。