Corosync 连接失败如何通过日志定位与修复?

来源:建站作者:鱼儿头衔:草根站长
导读:本期聚焦于鱼儿创作的《Corosync 连接失败如何通过日志定位与修复?》,敬请观看详情。节点突然从集群中脱离,Pacemaker 却显示资源仍在运行,查看日志只看到 Corosync 反复提示 FAILED TO RECEIVE 或 retransmit。这类连接失败的核心通常不在应用层,而在组网方式、防火墙和 totem 参数匹配上。本文以日志为入口,先说明如何从 corosync.log 与 systemd journal 中提取 TOTEM、FAILED TO RECEIVE、Token was lost 等关键信号,再结合 corosync-cfgtool、corosync-quorumtool、cmapctl 等命令判断节点是单播还是组播异常、成员列表是否完整。随后给出修改 bindnetaddr、切换 udpu、放开 UDP 端口、统一 MTU 和调整 token 超时的具体配置片段,并补充验证步骤。读完可形成从日志现象到参数修复的完整排查闭环。

Corosync 是 Pacemaker 高可用集群的底层消息与成员关系层,当它发生连接失败时,即使上层资源看起来仍在本机运行,集群也可能进入分裂状态。排查这类问题时,直接查看 Corosync 自身的日志是最有效的方式,因为大多数连接失败都会在日志中留下 TOTEM、FAILED TO RECEIVE、Token was lost 等关键字。本文围绕日志现象、状态命令和配置修复三个层面展开,帮助快速恢复节点间的稳定通信。

Corosync 连接失败如何通过日志定位与修复?

一、从日志中识别连接失败的关键信号

Corosync 的日志通常写入 /var/log/corosync/corosync.log,如果系统使用 journald,也可以用 journalctl -u corosync -f 持续查看。日志是否详细取决于 /etc/corosync/corosync.conflogging 段的 logfile_priority 设置,建议至少在排查阶段把级别调整为 debug,这样可以看到 TOTEM 协议在成员协商过程中的重传和超时记录。日志文件本身不会主动清理,可以放心保留几天数据用于时间线对照。

连接失败的典型日志关键字包括 FAILED TO RECEIVETOTEM Retransmit ListToken was lostA processor failed, forming new configuration 以及 sync member left。如果日志中频繁出现 retransmit 字样,通常说明节点发出的组播或单播消息没有按时到达其他节点,于是协议层启动重传,重传次数过多最终会导致成员被移除。如果看到 Token was lostforming new configuration,则往往与 token 超时、CPU 饥饿或网络瞬时中断有关,需要结合系统负载和交换机日志一起判断。

下面这条命令可以快速过滤最近一小时内的关键错误,适合在节点刚掉线时使用:

journalctl -u corosync --since "1 hour ago" | grep -E 'FAILED|retransmit|Token|processor failed'
# 如果使用 corosync.log
grep -E 'FAILED|retransmit|Token|processor failed' /var/log/corosync/corosync.log

需要注意的是,单行日志只能说明协议层发生了问题,不能直接判定根因。比如 FAILED TO RECEIVE 在组播模式下可能是交换机没有转发组播流量,在单播模式下可能是防火墙丢弃了某条 UDP 报文,因此下一步要通过状态命令确认当前链路模式以及节点是否仍留在 ring 中。

二、定位连接失败根因的常用命令与排查顺序

先确认本节点当前在 Corosync 中的 ring 状态,推荐使用 corosync-cfgtool -s。该命令会打印 ring ID、状态以及所有已知成员地址。如果只能看到本机,其他节点完全不出现,基本可以判定是网络层不通,而不是上层投票逻辑问题。另一个常用命令 corosync-quorumtool -s 可以查看 quorum 是否满足,两节点集群如果 quorum 不满足,资源会被 fence 或者进入停止状态。

corosync-cfgtool -s
corosync-quorumtool -s

接着检查本地监听端口与网络地址。Corosync 默认使用 UDP 5405 作为 totem 协议端口,5404 用于旧版或部分通信场景。执行 ss -lunp | grep -E '5404|5405' 可以看到进程是否正常监听。然后用 ip addr show 核对 bindnetaddr 对应的网段是否与实际网卡一致。很多连接失败的根因并不是防火墙,而是 bindnetaddr 配置成了具体主机地址或者写错了网段,导致 Corosync 没有在预期接口上绑定。

ss -lunp | grep -E '5404|5405'
ip addr show
cat /etc/corosync/corosync.conf

如果状态命令和端口都正常,但仍看不到其他节点,可以在两台节点上同时抓包。下面命令假设组播端口为 5405,抓取本机所有接口上的 UDP 5405 报文。若源节点有大量发送而无接收,说明流量被中间设备丢弃;若目标节点完全看不到报文,则要检查交换机是否启用 IGMP snooping 或是否允许该组播地址。

tcpdump -i any -nn udp port 5405

有一个容易忽略的点:云主机、部分虚拟化平台默认禁止二层组播,即使配置了 mcastaddr 也无法建立稳定连接。此时日志不会明确提示组播不可用,只表现为间歇性 retransmit 和成员反复加入退出。判断方法是切换为 udpu 单播传输后是否立刻恢复。若恢复,则说明原链路不适合组播,应保留单播配置。

三、典型连接失败的修复方案

第一种常见修复是修改 bindnetaddr。注意该字段要求填写接口所在的网络地址,而不是某个节点的 IP。例如节点 IP 为 192.168.1.10/24,那么网络地址应写 192.168.1.0,而不是 192.168.1.10。配置片段如下:

totem {
    version: 2
    secauth: off
    interface {
        ringnumber: 0
        bindnetaddr: 192.168.1.0
        mcastaddr: 226.94.1.1
        mcastport: 5405
        ttl: 1
    }
}
logging {
    to_logfile: yes
    logfile: /var/log/corosync/corosync.log
    logfile_priority: debug
    to_syslog: yes
}

第二种情况是交换机、云环境或跨网段链路不允许组播,这时需要改为单播传输。单播依赖 nodelist 明确列出每个节点的 ring0_addrnodeid。配置片段如下,transport 必须设为 udpunodeid 在所有节点上要唯一。

Corosync日志连接失败高可用集群修改时间:2026-08-29 01:54:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。