向现有cassandra集群添加多个节点的最佳方法

tec*_*asa 7 cassandra cassandra-2.0

我们有一个带有2个数据中心的12节点集群(每个DC有6个节点),每个DC都有RF-3.

我们计划通过在每个DC(总共6个节点)中添加3个节点来增加群集容量.一次添加多个节点的最佳方法是什么(ya,可能有2分钟的差异).

  1. auto_bootstrap:false - 在所有新节点上使用auto_bootstrap:false(因为这是启动节点的更快过程),启动所有节点然后运行"nodetool rebuild"以从现有节点获取流向此新节点的数据.

如果我这样做,读取请求很快就会启动这个新节点,因为此时它只分配了令牌范围(新节点),但没有数据流传输到这个节点,是否会导致读取请求失败/ CL问题/任何其他问题?

要么

  1. auto_bootstrap:true - 使用auto_bootstrap:true,然后一次启动一个节点,等到流式处理完成(这可能需要时间,因为我们在每个节点上有大约600 GB +的巨大数据),然后再启动下一个节点.如果我这样做,我必须等到一个节点完成整个流程,然后继续添加下一个新节点.

请建议一次添加多个节点的最佳方法.

PS:我们使用的是c*-2.0.3.

提前致谢.

Aar*_*ron 7

由于每个都依赖于网络上的流数据,因此很大程度上取决于集群的分布情况以及数据当前的位置。

如果您有一个单 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 一致性级别时。