raft: Failed to contact

目录

问题

一个分布式服务是基于raft分布式协议并使用的go语言开发的,在一个新版本上线后,出现了Leader比较频繁的漂移问题。

Leader日志:

复制代码
2024/08/16 15:00:08 [WARN] raft: Failed to contact 10.103.27.136:11088 in 564.372946ms
2024/08/16 15:00:08 [WARN] raft: Failed to contact 10.193.42.8:11088 in 565.087834ms
2024/08/16 15:00:08 [WARN] raft: Failed to contact quorum of nodes, stepping down
2024/08/16 15:00:08 [INFO] raft: Node at 10.199.8.23:11088 [Follower] entering Follower state (Leader: "")
2024/08/16 15:00:08 [INFO] raft: aborting pipeline replication to peer 10.103.27.136:11088
2024/08/16 15:00:08 [INFO] raft: aborting pipeline replication to peer 10.19.42.88:11088

原因分析

在网上搜索raft: Failed to contact,原因可能是:

复制代码
It's the latter - it simply subtracts the last time it processed a message from the other node, so it could encompass all those different problems. Typically we've seen this when processes get starved for CPU and no longer respond in a soft real time fashion, or when there are periods of heavy packet loss between the servers.

大体意思是:cpu繁忙导致进程得不到执行,或者网络丢包问题等。

Raft协议中领导者(Leader)不稳定,即领导者频繁更换,可能由多种原因引起的。这些原因通常与网络问题、配置设置、资源限制等因素有关。

以下是一些可能导致领导者不稳定的原因:

  • 1.网络延迟或不稳定:Rat协议依赖于节点之间的稳定通信来维持领导者的状态和进行日志复制。如果网络延迟高或网络不稳定,可能导致领导者无法及时发送心跳消息,从而触发不必要的领导者选举。
  • 2.选举超时时间配置不当:Rat协议中的选举超时时间是一个关键参数,它决定了一个跟随者节点在多长时间内没有接收到领导者心跳后会成为候选者并发起选举。如果选举超时时间设置得太短,可能会因为网络抖动或正常的延迟而导致频繁的领导者选举。
  • 3.日志不一致:如果集群中的节点因为网络问题或其他原因导致日志不一致,可能需要更多时间来同步日志。在这个过程中,如果领导者无法有效地同步日志,可能会导致领导者失去大多数节点的支持,从而触发新的领导者选举。
  • 4.服务器资源不足:如果Raft节点运行在资源受限的服务器上(如CPU使用率高、内存不足),可能导致处理请求的速度变慢,影响到心跳包的发送和处理,从而导致领导者选举。
  • 5.节点频繁重启或不稳定:如果集群中的节点因为软件错误、硬件故障或维护操作而频繁重启,每次重启都可能触发领导者选举。此外,不稳定的节点可能导致集群无法维持稳定的领导者。
  • 6.负载不均衡:如果集群中的某些节点承担了过多的工作负载,可能导致这些节点响应变慢,影响心跳包的处理,进而触发领导者选举。

解决领导者不稳定的问题通常需要从以上几个方面进行排查和调整。例如,优化网络配置,确保网络稳定;调整Raft的时间参数,如适当增加选举超时时间;优化服务器资源使用,确保节点有足够的资源处理请求;以及确保集群中的日志一致性等。

经过以上分析,这些似乎很有道理,但具体问题原因还是需要我们去分析。

查看报错代码位置:
可以看到,Leader没有在预定时间内与follower通讯,就会触发 Leader step down。没有及时通信的可能是有很多因素导致的。

通过pprof抓取trace文件,分析raft hearbeat goroutine执行情况,可以看到raft hearbeat 被GC影响,没有按照以前频率发送:


解决方案

下一步的解决方案,是对GC的策略做调整。

具体可参考
聊聊两个Go即将过时的GC优化策略
A Guide to the Go Garbage Collector
Soft memory limit

参考

raft 论文
raft 演示动画
raft

相关推荐
kebeiovo2 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
Wang's Blog4 小时前
Go-Zero项目开发9: 微服务治理之服务注册中心
微服务·golang
布朗克1685 小时前
Go 入门到精通-27-泛型编程
开发语言·golang·xcode·泛型编程
名字还没想好☜6 小时前
Go 用 errgroup 管理并发子任务:错误收敛、取消传播与限流
开发语言·后端·golang·go·并发
web守墓人9 小时前
【go语言】gotar:使用go语言复刻tar命令,并加入7z支持,可独立运行在windows、linux、macos上
linux·macos·golang
看-是灰机9 小时前
使用go语言实现对接
linux·开发语言·后端·docker·语言模型·golang·飞书
Wang's Blog11 小时前
Go-Zero项目开发8: 构建社交API服务与微服务解耦实践
开发语言·微服务·golang
怒放de生命20101 天前
【web3基础】Go-Zero+mysql进行crud操作(三)
mysql·golang·web3·go-zero
名字还没想好☜1 天前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
灯澜忆梦1 天前
Go 语言 _JSON---序列化与反序列化
开发语言·golang·json