【发布时间】:2016-07-29 19:15:13
【问题描述】:
我正在尝试构建一个分布式系统来运行一些性能密集型计算。一个计算可以在多个工作节点上并行完成。问题是,随着数据源不断实时变化,我们希望每个工作节点(在单个计算期间)对数据的相同“版本”进行操作,即数据库的时间点快照。这是为了避免结果不一致。
另一个问题是,每次计算的整个输入数据集可能非常大,所以目前我们在每个工作节点上保留一个本地缓存,它通过向数据源询问“差异”来定期刷新内容,因为当前本地缓存版本并将差异应用到本地缓存。
有哪些设计策略可以实现每个工作节点看到相同“版本”数据的要求(同时仍然有相当新的数据)?我想过下面的解决方案,但想看看这是否是已解决的常见模式:
- 构建“版本控制”服务,定期查询数据源的差异并将每个差异存储为数据“版本”。工作节点的缓存与版本控制服务同步,并将其缓存数据保存在多个版本中。对于一种计算,我们确保工作节点使用相同版本的输入数据以实现一致性。此版本控制服务还应保留整个数据集的最新副本,以便工作程序节点最初加载其缓存,并在工作程序节点出现故障并重新启动时恢复本地缓存内容。
系统的一些估计参数:
工人数量:10
平均工作持续时间:显然我们希望它尽可能快,但假设它应该少于 2 分钟
作业的输入数据(所有工作人员的总体数据):~100GB
数据库大小:~1TB
【问题讨论】:
-
请提供一些数字,例如:工人人数,平均。工作时间,平均计算持续时间,数据库大小。另外,什么是大输入数据?粗略估计就足够了,因为它们可能有助于确定一个好的解决方案。
-
当然,我用一些估计数字更新了问题
-
如前所述,这太笼统了,无法正确回答。基本上你想建立一个multiversion concurrency control 系统。有很多关于该主题的文献可以帮助您入门。
-
我认为这里的需求没有 MVCC 复杂。它不必处理写入(假设写入仍然发生在其他地方),但作业引擎只需要在读取数据源时看到一致的时间点视图。
-
您暗示如果没有(某些代理的)写入能力,这将是一个更简单的解决方案。但是,您仍然需要在可能发生写入时提取 100 GB。为此,您要么需要在提取过程中停止这些写入(锁定、提取、解锁),要么需要各种 MVCC。为简单起见,您的主存储可能已经在后台使用 MVCC(例如,以支持“快照隔离”的形式)。
标签: database architecture distributed distributed-computing distributed-system