【问题标题】:Best way to add multiple nodes to existing cassandra cluster将多个节点添加到现有 cassandra 集群的最佳方法
【发布时间】:2016-09-13 23:37:50
【问题描述】:

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

我们计划通过在每个 DC 中添加 3 个节点(总共 6 个节点)来增加集群容量。 一次添加多个节点的最佳方法是什么。(是的,可能有 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。

提前致谢。

【问题讨论】:

    标签: cassandra cassandra-2.0


    【解决方案1】:

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

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

    【讨论】:

    • 正如我所问的,如果我使用 'auto_bootstrap:false' 会怎样处理读取请求?他们会去这个新节点吗,因为此时这个新节点将只分配给他们的令牌范围(新节点),但没有数据流式传输到这个节点,它会导致读取请求失败/CL 问题/任何其他问题吗?感谢您的回复*
    • 再次感谢您的回复。对您的一行“此外,如果您的数据至少有一份副本已复制到您的本地数据中心(您要加入新节点的数据中心),那么这也是首选方法。”新节点是否也会尝试从其他数据中心的节点(除了它所属的节点)中提取数据?如果是这样,鉴于其 DC 中的节点拥有所有数据,为什么会这样?或者是否要求集群在添加新节点时必须处于完美状态,不需要任何修复?会不会是这个原因?
    • @techpyaasa StackOverflow 是一个问答网站,而不是论坛。首先,请每个问题只问一个问题。其次,如果您还有其他问题,请提出新问题。
    【解决方案2】:

    我不确定这是否有人回答:

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

    答案是肯定的。新节点将加入集群,接收令牌分配,但由于 auto_bootstrap: false,节点将不会接收任何流式数据。因此,它将成为集群的成员,但不会有任何旧数据。将接收并处理新的写入,但在该节点加入之前的现有数据将不可用。

    话虽如此,使用正确的 CL 级别,您的新节点仍将执行后台和前台读取修复,因此它对请求的响应不会有任何不同。但是,我不会走这条路。使用 2 个 DC,我会将流量转移到 DCA,将所有带有 auto_bootstrap: false 的节点添加到 DCB,然后从 DCA 重建节点。重建需要来自 DCA,因为 DCB 中的令牌已更改,并且使用 auto_bootstrap: false,数据可能不再存在。您也可以运行修复,这也应该可以解决任何差异。最后,在所有节点都被引导后,对 DCB 中的所有节点运行清理。

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 2012-01-03
      • 1970-01-01
      • 2014-05-14
      • 2014-11-15
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多