前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次线上kafka磁盘升级引发的事故分析

一次线上kafka磁盘升级引发的事故分析

作者头像
公众号-利志分享
发布2022-04-25 09:34:18
3090
发布2022-04-25 09:34:18
举报
文章被收录于专栏:利志分享

事情原委:由于业务量暴涨,kafka硬盘不够保存7天的数据,所以希望升级一下硬盘,能保存7天的日志,之后确认某一天进行升级,升级完了之后发现两三天之前的数据也被重新消费提交到数据库。发现有此问题之后,然后只能修复数据了,苦逼的修复线上最近3天的超过400G的数据。

关于上面出现的问题,需要查证为什么三天前已经提交过offset的数据还被重新消费?和阿里云的技术支持对接之后,他们让我给一下Kafka消费客户端配置。

代码语言:javascript
复制
clusterCfg.Consumer.Offsets.Initial = sarama.OffsetOldest

他们给的解释是OffsetOldest会拉到最旧的消息进行消费,而我们业务代码中的配置是拉取最旧的消息,并没有做幂等处理,所以造成重复消费。但是其实我这两三天前的被提交的offset也被消费了,我就很不接受他说的了,后面那个阿里云的技术工程师给了一些可能出现的情况会造成这个问题,具体我就这里先不阐述了。

为什么我两三天的数据已经被提交过offset的也被重复消费了?这个我总结了大概几个原因

  1. kafka磁盘扩容,kafka客户端没有正确获取到__consumer_offsets的位移,造成被重新消费。
  2. kafka客户端有bug,kafka重启触发了消费被重置。

我们先来看下kafka关于

代码语言:javascript
复制
auto.offset.reset

的参数值:latest和earliest的详解。

latest和earliest区别

代码语言:javascript
复制
1,earliest 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
2,latest 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据

下面我们来验证一下:

这个是生成zzh_test的topic,生成a1到a11,然后我通过设置

代码语言:javascript
复制
clusterCfg.Consumer.Offsets.Initial = sarama.OffsetOldest

代码语言:javascript
复制
clusterCfg.Consumer.Offsets.Initial = sarama.OffsetNewest

两个去消费,根据不同的情况打印一下结果,结果如下。

  1. 两个消费端都未提交offset,latest启动之后只会读新产生该分区下的数据,earliest会从头开始消费
  2. 两个消费端都提交了offset,并且offset是有序提交的,latest和earliest都是从提交的offset开始消费
  3. 两个消费端都提交offset,但是两个端都存在a1,a2,a9的offset被提交了,但是a3,a4,a5,a6,a7,a8的offset没有被提交,latest和earliest配置也是从a10开始消费。中间的提交的也会被忽略。

关于offset提交的位移配置我们清楚了,所以上面的问题肯定不是这个参数造成的。我们重新回到"为什么我两三天的数据已经被提交过offset的也被重复消费了"这个问题。这个其实主要是阿里云kafka的硬盘升级涉及到数据的迁移,kafka机器是一台一台升级然后重启,造成大量的rebalance,触发到了Sarama Go客户端的OutOfRange机制,然后消费位点重置。

吐槽一下:关于阿里云的文档,这样的注意事项相当于什么都没说。

总结:

  • 提交过offset,latest和earliest没有区别,但是在没有提交offset情况下,用latest直接会导致无法读取旧数据。
  • 服务的升级还是应该采取保守的方式,不要片面听信某云的理论,人总是会犯错的。比如Kafka磁盘扩容可以把消费服务停止,然后扩容完成再启动消费端,可能就不会触发到Sarama Go客户端的bug了。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档