Automatic synchronization#

同期の自動トリガー#

BDRマネージャープロセスは、同期要求の自動トリガーを実行します。 bdr.raft_global_election_timeout デフォルト6秒を超えてノードからの更新がない場合、ダウンしているとみなされます。

ノードは互いの近さについてチェックされます。すべてのノードが等しく追い付いている場合、同期は必要ありません。そうでない場合、「ダウン」ノードから最も前にあるノードがソースとして選択されます。ソースが決定されると、各ターゲット-オリジンとソース以外のノード-に対して、同期要求が設定されます。 Witnessノードとスタンバイノードは、同期のターゲットである必要はありません。

ビュー bdr.sync_node_requests_summary は、同期要求を追跡します。

  • Origin オリジンノードはダウンノードです。

  • Source ソースノードは、オリジンから最も遠いノードです。

  • Target オリジンに関してソースの背後にある他の各ノード。

  • Sync_start_lsn 同期が開始されたときにオリジンからターゲットが受信した最大LSN。

  • Sync_end_lsn 同期が終了したときのオリジンからのターゲットノードのターゲットLSN。

  • Sync_status 同期のステータス。

  • Sync_start_ts 同期が開始された時刻。

同期要求がカタログに入力されると、完了まで転送されます。

キャンセル#

選択したソースノードがダウンしていることが判明した場合、マネージャーは同期操作をキャンセルします。これは、他のノードが起動している可能性があるため、最も遠いとは言えませんが、少なくとも一部のターゲットよりも前にあります。また、ノードを同期するために使用される場合があります。したがって、マネージャーはダウンしたノードをソースとして持つすべての同期操作をキャンセルし、ダウンしていない別のノードを同期のソースとして選択します。成功した同期とキャンセルされた同期のステートマシンを以下に説明します。

同期キャンセルAPI

bdr.sync_node_cancel() は、手動でのみ使用され、同期要求が何らかの理由でスタックし、クラスターの通常の機能をブロックしている場合にのみ使用されます。

select bdr.sync_node_cancel(origin, source)

これにより、指定されたオリジンとソースを持つすべてのターゲットのすべての同期ノード要求がキャンセルされます。これは、書き込みリードからのみ呼び出すことができます。

同期要求のライフサイクル#

単一の同期要求には、オリジン、ソース、ターゲット、および到達するsync_end_lsnがあります。同期要求はさまざまな状態を経て、各状態は別のノードで実行されます。

Autosync Request Life Cycle

Autosync Request Life Cycle#

状態は次のとおりです。 setup 書き込みリードで実行します。 sync_end_lsn を除く同期のフィールドを設定します。 setup_source ソースで実行します。 sync_end_lsn を設定し、同期サブスクリプションのスロットを作成します。 setup_target これはターゲットノードで実行されます。この状態では、オリジンへの元のサブスクリプションは無効になっています。同期サブスクリプションはターゲットで設定され、オリジンの変更をソースノードからターゲットに転送します。 start これはターゲットで実行されます。ターゲットの進行状況を監視して、sync_end_lsn に到達したかどうかを確認し、到達した場合は同期状態に移動します。 synced サブスクリプションはsync_end_lsn に同期しました。この状態では、スロットはドロップされます。 complete この状態はターゲットで実行されます。この状態では、同期サブスクリプションがターゲットでドロップされ、元のサブスクリプションが有効になります。次に、done状態に移行します。 done これは、同期が成功したことを意味します。 cancel start これはターゲットノードで実行されます。この状態では、同期サブスクリプションは後でドロップする準備として無効になり、オリジンへの元のサブスクリプションが再度有効になります。 cancel resume これはターゲットノードで実行されます。この状態では、同期サブスクリプションがドロップされます。 cancel denied これはソースノードで実行されます。この状態では、スロットはドロップされます。 failed キャンセルが発生し、すべてのクリーンアップが完了した場合、同期はこの状態で終了します。これは、同期が発生せず、再試行する必要があることを意味します。

同期のキャンセルは、選択したソースノードがダウンしていることが判明した場合に、自動的に発生する場合があります。キャンセル中に、サブスクリプションとスロットをクリーンアップし、元のサブスクリプションを有効にする必要があります。ソースまたはターゲットノードがダウンしている場合、同期要求はストールする可能性があります。

GUC#

自動同期を制御するGUCは bdr.enable_auto_sync_reconcile で、デフォルトでtrueに設定されています。オフにするには、すべてのノードでfalseに設定し、サーバーを再起動する必要があります。