1

如果我有将数据写入存储的系统。

在集群设置中,如果数据是同步复制的,那就是当我收到更改在所有节点上更新的数据的请求时,然后返回响应。

在这种情况下是否可以动态添加节点?

也就是说,假设有 2 个节点,并且在该集群上执行了一些事务。我可以添加一个集群仍在运行的第三个节点吗?

如果我这样添加一个新节点,是不是破坏了集群的强一致性?

4

2 回答 2

0

我相信您正在寻找的是一致的散列(维基百科),它允许您以某种方式分配内存,以便数据在多个节点之间正确复制,并且添加或删除节点的相关开销更少,我建议您去通过链接一致性哈希的简单魔法

于 2017-08-11T05:56:07.603 回答
0

一个简单且示意性的示例(只是许多可能的变体之一):

  1. 在录制模式下添加了一个节点。集群的行为就像新节点不存在一样,但也会将需要驻留在其上的对象的更新复制到该节点。
  2. 确定哪些现有对象需要驻留在新节点上。在每个现有节点上创建快照并将其发送到新节点。新节点可能以批处理模式处理它们(插入其存储中)。
  3. 在记录阶段积累的更新将在新节点上重播,而新的更新仍在记录中。如果某些更新已计入快照的一部分,则应跳过它们或不进行更改。
  4. 重播所有更新并且如果过程中没有错误,集群将切换到新配置(新节点完全启动)。对应该驻留在新节点上的对象的更新停止发送到它们的旧目的地。从旧目的地清除数据。
  5. 如果在此过程中的任何时候发生错误,它会被中止并可能重新重复。

可能的调整:

  • 在切换到新配置之前查询旧节点和新节点一段时间并比较返回的结果。如果有任何差异,请中止并进行调查。
  • 在切换到新配置之前进行全面比较(可能是校验和)。
于 2017-08-22T15:59:59.770 回答