首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保持本地缓存的策略--在分布式系统中看到相同“版本”的数据

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

Stack Overflow用户
提问于 2016-07-29 19:15:13
回答 2查看 265关注 0票数 6

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

另一个问题是,每一次计算的全部输入数据集可能非常大,因此目前我们在每个工作节点上保留了一个本地缓存,该缓存定期刷新内容,因为当前本地缓存版本向数据源请求" diffs“,并将差异应用于本地缓存。

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

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

该系统的一些估计参数:

  • 工人人数: 10
  • 平均工作时间:很明显,我们希望尽可能快地完成任务,但假设时间应该少于2分钟
  • 输入作业数据(所有员工的总体数据):~100 job
  • 数据库大小:~1TB
EN

回答 2

Stack Overflow用户

发布于 2016-08-08 12:59:12

如果您没有绑定到MySQL,并且可以使用Oracle,那么有一个简单的解决方案:

Oracle闪回

(我还没有找到MySQL的回放,如果你知道这方面的马达,请发表评论。)您不必创建手动快照等。您可以将其用于单个数据库服务器,并且您的所有进程都可以读取数据,因为它是在所需的时间中表示的。这个解决方案是相当干净和健壮的,但需要许可证。

如果我是你,我会尽量后退一步,尽量简化这个问题。如果不同的工人可以并行运行,则应适用以下规定:

  • 没有一个工人使用其他工人的产出。
  • 他们都没有改变原始数据。

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

另一方面,在一个simmilar项目中,我们使用了一个小技巧来实现这一点(作为闪回解决方案):数据库中也存储了插入时间。(而更新实际上是用新的时间戳插入的。)所有的计算等都是根据准确的记录进行的,方法是将

请给我x时间戳之前这类行的最后一个版本。

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

如果你想得到更多,有一个叫做影子表的东西。有一篇关于这个主题的不错的MySQL博客文章:http://arnab.org/blog/shadow-tables-using-mysql-triggers

票数 1
EN

Stack Overflow用户

发布于 2016-08-08 18:14:16

我觉得你太复杂了。对于您的任务,您只需要存储和区分当前和最新版本的数据。因此,您的脚本应该:

  1. 将最新数据标记为当前使用的数据集
  2. 删除所有旧数据
  3. 告诉员工使用标记数据集
  4. 一直以来,您都会向表中添加新数据(不是更新而是添加)。
  5. 进入步骤1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38666043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档