添加、替换、移动和删除节点
引导
添加新节点称为“引导”。num_tokens
参数将定义加入节点在引导期间分配的虚拟节点(令牌)数量。令牌定义了节点将负责的环(令牌范围)的部分。
令牌分配
使用默认令牌分配算法,新节点将选择 num_tokens
个随机令牌来负责。由于令牌是随机分配的,因此虚拟节点数量越多,负载分布就越好,但令牌管理开销也会增加。默认的 256 个虚拟节点应该在可接受的开销下提供合理的负载平衡。
在 3.0+ 版本中,引入了一种新的令牌分配算法,该算法根据给定键空间中现有虚拟节点的负载来分配令牌,从而在更少的令牌数量下实现更好的负载分布。要使用这种方法,新节点必须使用 JVM 选项 -Dcassandra.allocate_tokens_for_keyspace=<keyspace>
启动,其中 <keyspace>
是算法可以从中找到负载信息以优化令牌分配的键空间。
范围流式传输
分配令牌后,加入节点将选择它将负责的令牌范围的当前副本以从中流式传输数据。默认情况下,它将从每个令牌范围的主副本流式传输,以确保新节点中的数据与当前状态一致。
如果任何副本不可用,一致的引导过程将失败。要覆盖此行为并可能错过来自不可用副本的数据,请设置 JVM 标志 -Dcassandra.consistent.rangemovement=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”。
如果以下任何情况适用,您**必须**运行修复以使替换的节点再次一致,因为它在引导期间/之前错过了正在进行的写入操作。替换时间段是指从节点最初死亡到新节点完成替换过程的时间段。
|