複製ファミリー内の変更は、各複製ごとに追跡されます。
そのため、oplog の項目には、その操作を引き起こした複製の識別情報が含まれます。
したがって、複製ファミリーの履歴は、複数の oplog 項目のスタックとして表示されます。
各スタックは、その複製で発生した操作の oplog ID を、線形的順序で表示したものです。
非複製
データベースの履歴は、操作を線形的順序で示したものです (
図 1)。
図 2 は、ファミリー内の 2 つの複製の状態を示します。
- oplog ID 1 から 950 までの操作は、複製 boston_hub によって引き起こされました。
- 1 から 702 までの操作は、複製 sanfran_hub によって引き起こされました。
複製は、その複製の操作に関してのみ、正確なデータを所持します。
他の複製に関する情報は、更新パケットを受信するまで無効です。
例えば、複製 boston_hub は 950 のローカル操作を記録しますが、504 の sanfran_hub 操作の更新パケットしか受信していません。
同様に、複製 sanfran_hub は 702 のローカル操作を記録しますが、791 の boston_hub 操作の更新パケットしか受信していません。
図 3 はこのシナリオを示しています。
ここでは、どの複製も、他の複製で発生した操作については無効です。
図 3 に示されている、oplog スタックのセットである複製ファミリーを図にすることで、同期化処理を容易に理解することができます。例えば、複製
boston_hub から複製
sanfran_hub に送信される更新パケットは、複製
boston_hub のスタックに対する増分 (操作 792 から 950) で構成されます。
図 4 は 2 つの増分を示しています。
sanfran_hub にとって自己の状態は明らかなため、他の複製で発生した操作のみ、更新が必要です。
(いくつかのエラー リカバリ状態においては、その複製そのものの操作に関するデータのリセットが必要です。)
注: パケットが sanfran_hub にインポートされるまでに、boston_hub にさらに変更が加えられる可能性があります。
それらの変更は、更新パケットには含まれません。