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

时间:2016-05-17 18:09:53

标签: 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'以从现有节点获取流到这个新节点的数据。
  2. 如果我采用这种方式,读取请求很快就会启动这个新节点,因为此时它只分配了令牌范围(新节点),但是没有数据流传输到此节点,是否会导致读取请求失败/ CL问题/任何其他问题?

    OR

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

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

      提前致谢。

2 个答案:

答案 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 中的所有节点上运行清理。