在不同的数据库中有效地同步两组大的值

时间:2016-08-14 16:29:11

标签: algorithm synchronization set-difference

我有一个数据库表和一个Lucene(可能是Solr)索引。目标是索引数据库表,每行只有一个文档。但是:

  1. Lucene索引的初始状态未知,可能已经大部分已同步。它也可能包含不存在的行的文档,之后将通过其他机制删除。
  2. 执行重新同步的应用程序可能需要在此过程中多次重新启动。重启后可以存储很少的状态(理想情况下没有),因此强制预先设置差异是不可行的。
  3. 不允许对Lucene索引进行低级访问;我可以针对它运行查询但不能例如。直接枚举给定字段中的术语。查询范围中的键或计数键可以通过查询来完成。
  4. 数据库中的行没有任何版本控制信息或ETag。我们可以假设它们只是一列唯一键。
  5. 此处无需处理过时或需要删除的文档。我只需要确保每一行最终都有一个文档,尽可能少浪费时间。

    更新或删除过时的文档由系统的一个单独部分处理,在此重新同步机制指示完成后,可以假定该部分仅运行。 (事实上​​,一个强大的更新/删除系统很容易......)

    以前这个任务是通过强力设置差异完成的,但是这对于特别大的数据集来说会遇到困难,并且解决方案确实需要利用部分同步来支持恢复:如果应用程序总是生成一些在重新启动之前的进度最终将同步商店。

    差异摘要https://www.ics.uci.edu/~eppstein/pubs/EppGooUye-SIGCOMM-11.pdf看起来很有趣,但似乎只适用于数据存储具有必要的智能来自行计算的情况。在这种情况下,只有一个应用程序在完成这项工作,它只能查询,插入和删除两个商店。

    到目前为止,我认为这里有三个基本案例:

    • 这些集合非常不同步,例如。索引是空的。这应该很容易处理,只需从任一集的最低ID开始,从源查询一批记录,以及添加/删除目标中的差异。不幸的是,尽管这会在最初很快取得进展,但它会在每次重启后花费更长时间“追赶”时放慢速度。
    • 这些集几乎是同步的。感觉应该有一种有效的方法来解决这个问题,可能是通过在数据集中生成直方图并向下钻取到与源“不匹配”的各个桶,但仍然需要访问每个键并添加它是某种桶哈希。
    • 这些集合有很多微妙的差异,即。每个行中的行数相同,但约有60%的行具有不同的键。这似乎是最糟糕的情况,但并非特别不可能。

    是否有一种既定的技术来解决这个问题?我们确实使用一种事务日志来记录需要添加的内容,但这只能处理正常操作,而不是初始同步或后续迁移修复。

    我知道有些产品和系统可以为我“处理”这个问题,但是还有其他实现问题意味着此系统必须现在在现有代码库中实现,尽管它可能会在未来被更通用的解决方案所取代。事实上,这一点的重点是将当前系统变为“中途之家”,以便能够使用其他解决方案。

    我认为系统的更新/删除部分可能会被滥用以记录完整扫描的进度,方法是添加占位符文档,这些文档将在流程完成时自动删除?当套装几乎同步时,我想避免全扫描,但是......

0 个答案:

没有答案