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

相关推荐
飞川撸码2 小时前
【LeetCode 热题100】208:实现 Trie (前缀树)(详细解析)(Go语言版)
算法·leetcode·golang·图搜索算法
LuckyLay14 小时前
LeetCode算法题(Go语言实现)_20
算法·leetcode·职场和发展·golang
宦如云15 小时前
Bash语言的哈希表
开发语言·后端·golang
草海桐16 小时前
golang 的strconv包常用方法
golang·rune·strconv
老赵骑摩托16 小时前
Go语言nil原理深度解析:底层实现与比较规则
开发语言·后端·golang
紧跟先前的步伐20 小时前
【Golang】第十一弹------反射
开发语言·后端·golang
apocelipes1 天前
golang的条件编译
golang·开发工具和环境
宦如云1 天前
PHP语言的分布式账本
开发语言·后端·golang
草海桐1 天前
golang 的reflect包的常用方法
golang·reflect
赴前尘2 天前
chromem-go + ollama + bge-m3 进行文档向量嵌入和查询
开发语言·数据库·golang