Cassandra 4.0升级后节点重启失败 无法与对等节点Gossip
问题根因
该问题是Cassandra 4.0版本内部通信帧的默认限制导致,核心触发逻辑如下:
- Cassandra 4.0对CRC校验类型的内部通信帧新增了128KiB的单帧最大载荷硬限制,URGENT_MESSAGES类型的流量(包括Gossip协议消息)默认走CRC校验、不启用压缩,不受旧版本
internode_compression配置覆盖。 - 长期运行的集群Gossip状态会持续累积(包含端点存活状态、令牌环信息、全量schema元数据快照等信息),很容易超过128KiB的阈值。3.10版本无该帧大小限制,因此原有配置可以正常运行。
- 故障节点启动时,种子节点向其返回Gossip全量状态应答,消息大小超过128KiB触发编码异常,主动关闭通信连接,最终故障节点收不到Gossip响应,抛出
Unable to gossip with any peers错误启动失败。
解决方案
可根据集群实际情况选择以下任意一种方案处理:
- 方案一:临时调整通信配置快速恢复
修改所有节点cassandra.yaml配置,新增/调整参数internode_compression为all,强制所有内部通信流量(包括URGENT_MESSAGES)启用LZ4压缩,压缩后的Gossip消息基本都会低于128KiB阈值,滚动重启所有节点生效后再启动故障节点即可。 - 方案二:升级到4.0最新修复版本
该问题是4.0 GA版本的已知缺陷,4.0.1及之后的小版本已经优化了Gossip消息分帧逻辑、放宽了CRC帧大小默认限制,将集群所有节点升级到4.0系列最新稳定版即可从根本上解决该问题。 - 方案三:清理Gossip历史状态
逐节点滚动重启集群的种子节点,每次操作时先停止节点,删除节点数据目录下的gossip文件夹,再重新启动节点。操作过程中保证至少有1个种子节点正常运行,所有种子节点状态重建完成后,Gossip消息大小会回落至阈值以内,故障节点即可正常启动。
内容的提问来源于stack exchange,提问作者Jad Younan
相关产品推荐
相关产品推荐

