如果我有将数据写入存储的系统。
在群集设置中,如果数据是同步复制的,那就是当我收到更改跨所有节点更新的数据的请求时,然后返回响应。
在这种情况下,是否可以动态添加节点?
也就是说,假设有 2 个节点,并且在该集群上执行一些事务。是否可以添加群集仍在运行的第三个节点?
如果像这样添加新节点,会不会破坏集群的强一致性?
我相信您正在寻找的是 一致散列(维基百科( 它允许您以某种方式分配内存,以便在多个节点之间正确复制数据,并且添加或删除节点具有较少的与之相关的开销,我建议您通过链接 一致哈希的简单魔力
一个简单和示意图的例子(只是许多可能的变体之一(:
- 在记录模式下添加一个节点。群集的行为就像新节点不存在一样,但还会将需要驻留在其上的对象的更新复制到此节点。
- 确定哪些现有对象需要驻留在新节点上。快照在每个现有节点上创建并发送到新节点。新节点处理它们(插入到其存储中(,可能以批处理模式处理它们。
- 在记录阶段累积的更新将在新节点上重播,而新更新仍在记录中。如果某些更新已作为快照的一部分进行核算,则应跳过这些更新,或者不会导致任何更改。
- 重播所有更新后,如果过程中没有错误,群集将切换到新配置(新节点完全启动(。对应驻留在新节点上的对象的更新将停止发送到其旧目标。从旧目标清除数据。
- 如果在此过程中的任何时候发生错误,则会中止并可能重新重复。
可能的调整:
- 在切换到新配置之前,查询旧节点和新节点一段时间,并比较返回的结果。如果有任何差异,请中止并调查。
- 在切换到新配置之前进行完整比较(可能是校验和(。