高效的同步算法

时间:2014-04-21 12:08:49

标签: algorithm synchronization dataset

假设我在 node_a 上有一个大的排序(+10 MB,+ 650k行)数据集,在 node_b 上有不同的数据集。没有数据集的主版本,这意味着任一节点都可以有一些其他节点不可用的部分。我的目标是让 node_a 的内容与 node_b 的内容同步。最有效的方法是什么?

常识解决方案将是:

node_a:这是我拥有的一切......(发送整个数据集)

node_b:这是你没有的......(发送丢失的部分)

但这种解决方案根本没有效率。每次尝试同步时,它都需要 node_a 发送(+10 MB)。

所以这次使用一点脑力我可以引入数据集的分区,只发送整个内容的一部分,并期望在部分的第一行和最后一行之间找到差异。

你能想到更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

对于单个同步:

将数据集分解为任意部分,每个部分哈希(例如,使用MD5),并且仅通过哈希值而不是整个数据集发送。然后使用另一侧的哈希值比较来确定每一方的不同内容,并在适当的时候发送。

如果每个部分没有全局唯一ID(即每侧的相应行保证相同的主键),您可能还需要发送一些元数据,或发送哈希值部件递增,随时确定差异,并根据需要更改发送的内容(例如,一次发送10行的散列,如果发现丢失的行,则会出现行不匹配的情况 - 要么满足此要求接收方,或将发送方偏移一行)。应该如何完成这将取决于您的数据是什么样的。

重复同步:

一个好主意可能是创建一个主版本,并将其单独存储在其中一个节点上,但如果您不关心冲突或能够避免错误,则可能不需要这样做。

无论有没有主版本,您都可以在此处使用版本控制。存储上次同步的版本,并在每个部分上存储版本。同步时,只需发送版本高于上一个同步版本的部分。

作为全局自动递增版本的替代方案,您可以使用时间戳作为版本,或者只是在每个部分上都有一个修改过的标志,在修改时设置它,发送所有部分并设置其标志,然后重置标志一旦同步。