保持本地缓存的策略在分布式系统中看到相同的“版本”数据

时间:2016-07-29 19:15:14

标签: database architecture distributed distributed-computing distributed-system

我正在尝试构建一个分布式系统来运行一些性能密集型计算。一个计算可以在多个工作节点处并行完成。问题是,随着数据源实时变化,我们希望每个工作节点(在单次计算期间)对相同的“版本”数据进行操作,即数据库的时间点快照。这是为了避免不一致的结果。

另一个问题是,每次计算的整个输入数据集可能非常大,所以目前我们在每个工作节点保留一个本地缓存,通过向数据源询问“差异”来定期刷新内容,因为当前本地缓存版本并将差异应用于本地缓存。

有哪些设计策略可以实现每个工作节点看到相同“版本”数据的要求(同时仍然有合理的新数据)?我已经考虑过下面的解决方案,但想知道这是否是一个已经解决的常见模式:

  • 构建“版本控制”服务,定期查询数据源的差异,并将每个差异存储为数据“版本”。工作节点的缓存与版本控制服务同步,并且还将其缓存数据保留在多个版本中。对于一个计算,我们确保工作节点使用相同版本的输入数据来实现一致性。此版本控制服务还应保留工作节点的整个数据集的最新副本,以便最初加载其缓存,并在工作节点关闭并重新启动时恢复本地缓存内容。

系统的一些估计参数:

  • 工人人数:10

  • 平均工作时间:显然我们希望这个工作时间尽可能快,但是假设它应该不到2分钟

  • 输入作业数据(所有工作人员的总体数据):~100GB

  • 数据库大小:~1TB

2 个答案:

答案 0 :(得分:1)

如果您不依赖MySQL并且可以使用Oracle,那么有一个简单的解决方案:

  

Oracle Flashback

(我还没有找到MySQL闪回但请注意,如果你知道一些电机那么。)你不必创建一个手动快照等。你可以将它用于一个数据库服务器,所有的进程都可以读取在需要的时间内表示的数据。该解决方案非常干净且功能强大,但需要许可证。

如果我是你,我会尝试退一步,尝试更多地简化问题。如果不同的工人可以并行运行,则应适用以下条件:

  • 没有工人使用其他人的输出
  • 他们都没有改变原始数据

如果这两个要求都有效,您可以使用单个数据库来存储计算等。您唯一需要关心的是交易应该仔细规划。

另一方面,在一个类似的项目中,我们使用了一个小技巧来实现这一点(作为闪回解决方案):插入时间也存储在数据库中。 (并且更新实际上是带有新时间戳的插入。)所有计算等都是通过添加到查询中的准确记录进行的

  

在x时间戳

之前给我这一行的最后一个版本

通过此解决方案,我们避免了许可证成本和快照维护。唯一的问题是,如果你不需要整个历史记录,它会快速占用你的数据库空间。为了解决这个问题,我们做了一个cron作业,根据时间戳清除未使用的记录。

如果你想获得更多,有一种称为影子表的东西。关于这个主题有一个很好的MySQL博客文章: http://arnab.org/blog/shadow-tables-using-mysql-triggers

答案 1 :(得分:1)

我认为你太复杂了。对于您的任务,您需要存储和区分当前和最新版本的数据。所以,你的脚本应该:

  1. 将最新数据标记为当前使用的数据集
  2. 删除所有旧数据
  3. 告诉工人使用标记数据集
  4. 此时,您向表中添加新数据(不更新但添加)
  5. 转到第1步
相关问题