如何将现有Cassandra节点数据同步至新节点以无损失停用旧节点?
单节点Cassandra 3.11.4零停机迁移全量数据同步方案
问题分析
你使用replace_address_first_boot参数启动新节点但未完成全量同步,核心原因是该参数用于替换故障节点,而你的场景是正常单节点迁移,应采用「集群扩展→同步→缩容」的零停机流程,而非直接替换。
修复&正确迁移步骤
1. 修正新旧节点配置一致性
确保新节点cassandra.yaml与旧节点以下核心配置完全一致:
cluster_name(集群名称)partitioner(分区器,默认org.apache.cassandra.dht.Murmur3Partitioner)endpoint_snitch(端点探测器,如SimpleSnitch)num_tokens(令牌数量,默认256)
新节点需单独调整的配置:
listen_address/broadcast_address:新服务器IPrpc_address/broadcast_rpc_address:新服务器IPseeds:设置为旧节点IP(新节点需从旧节点拉取集群元数据与数据)
2. 清理新节点无效数据(针对当前已启动失败的情况)
停止新节点:
./nodetool stopdaemon
删除新节点所有数据目录(避免残留无效数据影响同步):
rm -rf <数据目录路径>/* <commitlog目录路径>/* <saved_caches目录路径>/*
3. 启动新节点并加入集群
不要使用replace_address_first_boot参数,直接启动新节点:
./cassandra
查看新节点logs/system.log,确认日志中出现「New node joined cluster」类信息,说明节点成功加入。
4. 监控全量同步进度
- 查看集群节点状态:
nodetool status
等待新节点状态变为UN(Up/Normal),且两节点Load值逐渐趋近。
- 查看同步进度:
nodetool netstats
当「Pending range streams」数值变为0,代表全量数据同步完成。
5. 切换应用连接并移除旧节点
- 修改应用的Cassandra连接IP为新节点IP,验证业务正常运行。
- 在旧节点上执行优雅下线命令:
nodetool decommission
等待旧节点完成数据清理并退出集群,再次执行nodetool status确认旧节点已被移除。
关键注意事项
- 迁移全程保持旧节点运行,直到新节点同步完成、应用切换验证通过,避免数据丢失。
- 确保新旧节点Cassandra版本严格一致(3.11.4),版本差异会导致同步失败。
- 检查防火墙规则,确保新旧节点间7000(Gossip通信)、9042(CQL客户端)端口互通。
内容的提问来源于stack exchange,提问作者Alfred
相关产品推荐
相关产品推荐

