当前位置: 首页 > article >正文

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


http://www.kler.cn/a/446749.html

相关文章:

  • 如何缩放组件
  • sql server索引优化语句
  • STL 剖析
  • imx6ull qt多页面控制系统(正点原子imx系列驱动开发)
  • 3.使用SD卡挂载petalinux根文件系统
  • 中间件 redis安装
  • 从零搭建纯前端飞机大战游戏(附源码)
  • Restaurants WebAPI(三)——Serilog/
  • 前端学习二
  • SQL血缘解析
  • ubuntu镜像开荒ssh
  • [数据结构] 链表
  • 【Linux开发工具】版本控制器git
  • Vivado - 远程调试 + 远程综合实现 + vmWare网络配置 + NFS 文件共享 + 使用 VIO 核
  • 如何看待Java面试造火箭工作拧螺丝?
  • 怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法
  • 数据结构与算法学习笔记----Prim算法
  • 复盘:“辩论赛”复盘
  • 容联云孔淼:金融数智化深水区,从数字化工具到业务变革提效
  • 驾考科目一考什么?
  • 感受野如何计算?
  • vtie项目中使用到了TailwindCSS,如何打包成一个单独的CSS文件(优化、压缩)
  • 阿里云OSS批量导出下载地址 OSS批量导出 OSS导出清单
  • 应用端sql慢查询监控分析
  • git全教程(长期更新)
  • Leetcode分隔链表