Cassandra 3.0.15集群分区故障求助:节点状态显示不一致
修复Cassandra 3.0.15集群分区问题
这看起来是典型的Cassandra集群脑裂/网络分区问题——虽然nodetool gossipinfo显示信息最新,但不同节点的schema视图完全不一致,只有节点2能识别完整集群。结合你已经尝试过的滚动重启、全集群重启和gossip开关操作,我们可以通过以下针对性步骤修复:
第一步:验证核心配置一致性
首先要确保所有节点的cassandra.yaml关键配置完全一致,配置不一致是这类分区问题的常见根源:
- 登录每个节点,检查
seed_provider中的seed列表:必须包含至少一个所有节点都能稳定访问的节点(这里节点2是唯一正常识别全集群的,所以seed里必须有192.168.2.248) - 确认
listen_address/broadcast_address是节点的正确IP,没有配置为localhost或错误地址 - 检查
endpoint_snitch和partitioner:必须和nodetool describecluster显示的一致(分别是org.apache.cassandra.locator.DynamicEndpointSnitch和org.apache.cassandra.dht.Murmur3Partitioner)
如果发现配置不一致,先修正后保存。
第二步:强制重置异常节点的集群状态
节点1和节点3的schema视图异常,我们需要让它们以节点2为权威,重新拉取集群信息:
处理节点1(192.168.2.247):
- 停止Cassandra服务:
sudo systemctl stop cassandra # 若用init系统则执行 sudo service cassandra stop - 清理节点本地的集群状态缓存数据(这会让节点重启后从seed节点重新同步集群信息):
rm -rf /var/lib/cassandra/data/system/* rm -rf /var/lib/cassandra/commitlog/* rm -rf /var/lib/cassandra/saved_caches/* - 修改节点1的
cassandra.yaml,将seed列表暂时改为仅包含节点2的IP:- seeds: "192.168.2.248" - 启动Cassandra服务:
sudo systemctl start cassandra - 等待5-10分钟,运行以下命令验证:
确认节点1能识别所有3个节点,且schema版本统一。nodetool status nodetool describecluster
处理节点3(192.168.2.249):
重复上述节点1的操作步骤,完成后同样验证节点状态和schema一致性。
第三步:验证集群整体恢复
等节点1和3都重启完成后,在所有节点上执行以下检查:
nodetool status:所有节点必须显示为UN(Up/Normal)状态nodetool describecluster:仅存在一个schema版本,且包含所有三个节点的IPnodetool gossipinfo:所有节点的gossip信息中,没有UNREACHABLE标记
额外排查点(若上述步骤无效)
如果问题仍存在,需要进一步排查:
- 网络连通性:用
ping、telnet 192.168.2.X 7000测试节点间gossip端口(7000)和CQL端口(9042)的连通性,确认没有防火墙/安全组拦截流量 - 时间同步:Cassandra对时间同步要求严格,用
timedatectl或ntpq -p检查所有节点的时间差是否在3秒以内,时间不同步会导致gossip异常 - 启动日志:查看
/var/log/cassandra/system.log,寻找连接seed失败、schema拉取错误等日志条目,根据具体错误进一步定位问题
内容的提问来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

