Cassandra 文档

版本

您正在查看预发布版本的文档。

添加、替换、移动和删除节点

引导

添加新节点称为“引导”。num_tokens 参数将定义加入节点在引导期间分配的虚拟节点(令牌)数量。令牌定义了节点将负责的环(令牌范围)的部分。

令牌分配

使用默认令牌分配算法,新节点将选择 num_tokens 个随机令牌来负责。由于令牌是随机分配的,因此虚拟节点数量越多,负载分布就越好,但令牌管理开销也会增加。默认的 256 个虚拟节点应该在可接受的开销下提供合理的负载平衡。

在 3.0+ 版本中,引入了一种新的令牌分配算法,该算法根据给定键空间中现有虚拟节点的负载来分配令牌,从而在更少的令牌数量下实现更好的负载分布。要使用这种方法,新节点必须使用 JVM 选项 -Dcassandra.allocate_tokens_for_keyspace=<keyspace> 启动,其中 <keyspace> 是算法可以从中找到负载信息以优化令牌分配的键空间。

手动令牌分配

您可以使用 initial_token cassandra.yaml 参数手动指定一个用逗号分隔的令牌列表,如果指定了该参数,Cassandra 将跳过令牌分配过程。这在使用外部工具进行令牌分配或使用其先前令牌恢复节点时可能很有用。

范围流式传输

分配令牌后,加入节点将选择它将负责的令牌范围的当前副本以从中流式传输数据。默认情况下,它将从每个令牌范围的主副本流式传输,以确保新节点中的数据与当前状态一致。

如果任何副本不可用,一致的引导过程将失败。要覆盖此行为并可能错过来自不可用副本的数据,请设置 JVM 标志 -Dcassandra.consistent.rangemovement=false

恢复失败/挂起的引导

在 2.2+ 版本中,如果引导过程失败,可以通过调用 nodetool bootstrap resume 从先前保存的状态恢复引导。如果由于某种原因引导挂起或停滞,也可以通过简单地重新启动节点来恢复。为了清理引导状态并重新开始,您可以设置 JVM 启动标志 -Dcassandra.reset_bootstrap_progress=true

在较低版本中,当引导过程失败时,建议擦除节点(删除所有数据),然后重新启动引导过程。

手动引导

可以通过设置隐藏参数 auto_bootstrap: false 来完全跳过引导过程并立即加入环。这在从备份恢复节点或创建新的数据中心时可能很有用。

删除节点

您可以使用 nodetool decommission 将节点从集群中移除到活动节点,或者使用 nodetool removenode(到任何其他机器)移除死节点。这将把旧节点负责的范围分配给其他节点,并在那里复制相应的数据。如果使用 decommission,数据将从退役的节点流式传输。如果使用 removenode,数据将从剩余的副本流式传输。

不会自动从退役的节点中删除任何数据,因此如果您想将该节点以环上的不同令牌重新投入使用,则应手动将其删除。

移动节点

num_tokens: 1 时,可以使用 nodetool move 移动节点在环中的位置。移动既比退役 + 引导更方便,也更有效。移动节点后,应运行 nodetool cleanup 以删除任何不必要的数据。

替换死节点

为了替换死节点,请使用 JVM 启动标志 -Dcassandra.replace_address_first_boot=<dead_node_ip> 启动 cassandra。启用此属性后,节点将以休眠状态启动,在此期间,所有其他节点将看到此节点处于 DOWN (DN) 状态,但此节点将看到自己处于 UP (UN) 状态。可以在 nodetool netstats 中找到准确的替换状态。

现在,替换节点将开始从集群中其他节点引导数据。如果替换节点的 IP 地址与被替换节点的 IP 地址不同,则替换节点只会在引导阶段接收写入操作。(参见 CASSANDRA-8523 和 CASSANDRA-12344)

引导完成后,节点将被标记为“UP”。

如果以下任何情况适用,您**必须**运行修复以使替换的节点再次一致,因为它在引导期间/之前错过了正在进行的写入操作。替换时间段是指从节点最初死亡到新节点完成替换过程的时间段。

  1. 节点在被替换之前停机时间超过 max_hint_window

  2. 您使用与死节点相同的 IP 地址进行替换,**并且**替换时间超过 max_hint_window

监控进度

可以使用 nodetool netstats 监控引导、替换、移动和删除进度,它将显示流式传输操作的进度。

范围移动后清理数据

作为安全措施,Cassandra 不会自动从由于范围移动操作(引导、移动、替换)而“丢失”部分令牌范围的节点中删除数据。在您确认新节点已启动并正常工作后,在丢失范围的节点上运行 nodetool cleanup。如果不这样做,旧数据仍将计入该节点的负载。