Commit scopes#

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

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

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

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

commit_scope:
    commit_scope_operation [AND ...]

commit_scope_operation:
    commit_scope_group confirmation_level commit_scope_kind

commit_scope_group:
{ ANY num [NOT] (node_group [, ...])
  | MAJORITY [NOT] (node_group [, ...])
  | ALL [NOT] (node_group [, ...]) }

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

commit_scope_kind:
{ GROUP COMMIT [ ( group_commit_parameter = value [, ...] ) ] [ ABORT ON ( abort_on_parameter = value ) ]
  | CAMO [ DEGRADE ON ( degrade_on_parameter = value ) TO ASYNC ]
  | LAG CONTROL [ ( lag_control_parameter = value [, ... ] ) ]
  | SYNCHRONOUS_COMMIT }

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

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

任意#

例 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``を :ref:`グループコミット <グループコミット>` とともに使用する場合、リコンシリエーションの問題を回避するには、 :ref:`commit_決める設定 <commit_決める設定>` 設定を\ ``raft に設定する必要があります。

すべてではない#

例 ALL NOT (left_dc)

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

確認レベル#

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

ONを受信しました#

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

ONが複製されました#

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

ON耐久性#

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

ON可視#

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

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

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

グループコミット#

ノードのコンセンサスによってコミットを確認でき、競合解決設定を制御します。

GROUP COMMIT [ ( group_commit_parameter = value [, ...] ) ] [ ABORT ON ( abort_on_parameter = value ) ]

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

bool

false

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

transaction_tracking設定#

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

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

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

fence_resolution設定#

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

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

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

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

列レベルの競合解決の有効化と無効化 を参照してください。

commit_決める設定#

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

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

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

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

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

CAMO#

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

詳細は、 CAMOまたはコミット・アット・モスト・ワンス を参照してください。

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_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#

SYNCHRONOUS_COMMIT

SYNCHRONOUS_COMMIT コミットスコープ種類にはパラメーターがありません。これは、コミットスコープグループとコミットスコープの可視性によってのみ効果的に構成されます。