我们有一个带有2个数据中心的12节点集群(每个DC有6个节点),每个DC都有RF-3。
我们计划通过在每个DC(总共6个节点)中添加3个节点来增加群集容量。 一次添加多个节点的最佳方法是什么(ya,可能有2分钟的差异)。
如果我采用这种方式,读取请求很快就会启动这个新节点,因为此时它只分配了令牌范围(新节点),但是没有数据流传输到此节点,是否会导致读取请求失败/ CL问题/任何其他问题?
OR
请建议一次添加多个节点的最佳方法。
PS:我们使用的是c * -2.0.3。
提前致谢。
答案 0 :(得分:3)
由于每个都依赖于网络上的流数据,因此很大程度上取决于您的群集的分布情况以及当前数据的位置。
如果您有单DC群集,并且所有节点之间的延迟最小,那么使用auto_bootstrap: true
创建一个新节点应该没问题。此外,如果您的数据的至少一个副本已复制到您的本地数据中心(您要加入新节点的数据中心),那么这也是首选方法。
另一方面,对于多个DC,我在设置auto_bootstrap: false
和使用nodetool rebuild
方面取得了更大的成功。原因是,nodetool rebuild
允许您指定数据中心作为数据源。此路径使您可以控制流式传输到特定DC(更重要的是,不到其他DC)。与上述类似,如果您正在构建一个新的数据中心并且您的数据尚未完全复制到它,那么您将需要使用nodetool rebuild
来传输数据来自不同的DC。
如何处理读取请求?
在这两种情况下,无论数据是否实际存在,都会在新节点加入群集时为其计算令牌范围。因此,如果要将读取请求发送到CL ONE的新节点,则应将 路由到包含辅助副本的节点(假设RF> 1)。如果您在CL QUORUM(RF = 3)查询,应找到另外两个。当然,假设正在拾取松弛的节点没有被其流式活动克服,它们也无法满足请求。这是" 2分钟规则"存在。
最重要的是,在新节点完全流式传输之前,您的查询确实有更高的失败机会。查询成功的机会随着集群规模的增加而增加(更多节点=更多可扩展性,每个节点承担的流量责任要少得多)。基本上,如果您从3个节点到4个节点,则可能会出现故障。如果您从30个节点到31个节点,您的应用程序可能不会注意到任何事情。
新节点是否也会尝试从其他数据中心的节点提取数据?
仅当您的查询未使用LOCAL一致性级别时。
答案 1 :(得分:1)
我不确定有人回答过这个问题:
<块引用>如果我这样做,读取请求很快就会开始这个新节点,因为此时它只有分配给它们的令牌范围(新节点)但没有数据流到这个节点,它会导致读取请求失败/CL 问题/任何其他问题?
答案是肯定的。新节点将加入集群,接收令牌分配,但由于 auto_bootstrap: false,节点将不会接收任何流数据。因此,它将成为集群的成员,但不会有任何旧数据。新的写入将被接收和处理,但在节点加入之前的现有数据在该节点上将不可用。
话虽如此,使用正确的 CL 级别,您的新节点仍将进行后台和前台读取修复,因此它不应对请求做出任何不同的响应。但是,我不会走这条路。使用 2 个 DC,我会将流量转移到 DCA,将所有带有 auto_bootstrap: false 的节点添加到 DCB,然后从 DCA 重建节点。重建将需要来自 DCA,因为 DCB 中的令牌已更改,并且使用 auto_bootstrap: false,数据可能不再存在。您也可以运行修复,这也应该可以解决任何差异。最后,在所有节点都被引导后,在 DCB 中的所有节点上运行清理。