网站首页 > 技术文章 正文
摘要:
本文详细描述kafka集群副本不同步告警分析处理过程,并对此次告警产生原因进行了详细分析,最终找到根因并制定解决方案恢复系统正常。
通过总结本次案例遇到的问题,为其他应用系统故障排除提供参考,并思考总结了运维工作中需要改进的地方
1、 背景Situation
日志系统目前主要的功能是日志的的采集及存储,filebeat采集数据后,输出至kafka进行缓存,之前日志系统只把操作系统层面指标接入zabbix监控,随着监控指标的不断丰富,3月初已完成kafka监控的接入。
2、 事件描述及问题Task
日志系统kafka集群共3台服务器,2022年5月20日,收到zabbix监控告警,告警内容为:kafka未同步的副本数过多,之后的两分钟内,也收到集群其他两台机器的相同告警信息。
3、 分析与对策Action
3.1、故障定位
副本同步必须满足两个条件:
l 副本节点必须能与zookeeper保持会话(心跳机制)
l 副本能复制leader上的所有写操作,并且不能落后太多
先分析第一个条件,由于kafka与zookeeper集群都是部署在相同的服务器上的,目前只收到了kafka的告警信息,并未收到主机宕机以及zookeeper相关告警信息,故排除kafka节点故障、zookeeper集群故障;后续通过4A成功登录相应的服务器也验证了节点并未故障,通过相应的命令查看zookeeper集群,验证集群正常;
排除第一个条件后,那么只剩下第二个条件了,通过查看日志,发现有大量的报错信息如下:
通过日志分析,初步怀疑为消息过大,超过了接收配置的默认值,导致副本无法同步主的信息,从而报错未同步副本数过多。
3.2、根因分析
先解释一下告警指标:在一个运行健康的集群中,处于同步状态的副本数(ISR)应该与总副本数完全相等,如果分区的副本远远落后于leader,那这个follower将被ISR池删除,随之而来的是IsrShrinksPerSec(可理解为isr的缩水情况)的增加。由于kafka的高可用性必须通过副本来满足,所有有必要重点关注这个指标。
其实根本原因在日志报错里很清楚了,就是因为消息过大,超过了接收配置的默认值,导致副本无法同步主的信息;kafka作为接收端可以接收到这么大的消息,但是为什么会同步失败呢,难道是集群间配置不一样?重新检查了配置发现相应参数都是一致的。通过查阅官方文档有两个参数引起了我的注意:message.max.bytes、replica.fetch.max.bytes。
message.max.bytes:这是单个消息的最大值,默认是1M左右;生产集群配置文件配置的为100M。
replica.fetch.max.bytes: follower从 leader 拉取消息进行复制消息的大小,生产集群该配置未做配置。
message.max.bytes必须小于等于replica.fetch.max.bytes,否则就会导致replica之间数据同步失败。
3.3、故障解决方案
修改配置文件,让message.max.bytes与replica.fetch.max.bytes值相同,然后重启kafka。
4、 处理结果Result
查看了所有kafka主题消息的生产速率以及消费速率,发现目前消费速度完全跟得上,而且目前接收的都是日志文件,并不存在大消息情况,故相应修改接收大小,以及同步大小的限制,修改完成后,重启kafka,告警恢复。
5、 建议与讨论Review
配置文件
针对于开源的软件,配置文件的默认参数都是官方认为可以满足日常需求的,一般不需要修改,针对于未出现在配置文件中的参数,修改要慎重,要养成查看官方文档的习惯,最好不要百度,因为每个版本都有可能调整参数,百度出来的结果未必适用生产环境,且未经过验证。修改时一定要了解每个参数的具体含义,以及修改后带来的影响,参数修改很容易,但是有时候就是因为这么个配置,造成极大的影响。
针对集群中配置文件是否可以提取出来在特定的地方保管,每次启动时去拉取配置文件启动程序,避免造成集群中配置文件不一致问题。
监控
kafka监控模板中的监控项众多,在排查问题时,发现好多监控项并不了解其具体意义;既然存在模板中,那就说明该监控项还是有一定价值的,如果我们不知道如何学习开源软件的话,我们可以通过了解监控项,来逐步的了解开源软件以及相应的软件原理。
目前监控中只添加了系统重要配置文件的监控,针对于应用的配置文件监控我觉得也是有必要的,一是为了提醒应用管理员配置文件被修改过,通过该监控项管理员来判断配置文件是否为他人非法修改,集群内的所有节点是否都修改完毕;二是修改完配置后,影响可能不会马上发生,当以后影响发生时有配置文件修改告警,可根据当时告警信息来辅助排查是否由于配置变更引起
- 上一篇: Redis 常见问题处理(redis的问题)
- 下一篇: 大数据之系统基本要求(大数据系统主要包括)
猜你喜欢
- 2024-10-21 数据库同步 Elasticsearch 后数据不一致,怎么办
- 2024-10-21 (建议收藏)小白视角总结分布式搜索组件elasticsearch《二》
- 2024-10-21 RabbitMQ消息服务用户手册(rabbitmq消息id)
- 2024-10-21 索引生命周期管理ILM看完不懂你锤我
- 2024-10-21 Elasticsearch技术问答系列-NO3(elasticsearch curator)
- 2024-10-21 从裸机到700亿参数大模型,这里有份教程,还有现成可用的脚本
- 2024-10-21 「一文搞懂」Nacos健康检查机制(nacos修改健康检查模式)
- 2024-10-21 「ceph-deploy」CentOS7部署Ceph-nautilus 14.2.18版本集群学习
- 2024-10-21 Kibana 最常见的“启动报错”的故障原因及解决方案汇总
- 2024-10-21 二进制部署Kubernetes V1.18.X(etcd集群篇)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)