如何排查Kafka消息丢失原因

后端 潘老师 5个月前 (11-27) 152 ℃ (0) 扫码查看

本文主要讲解关于如何排查Kafka消息丢失原因相关内容,让我们来一起学习下吧!

Apache Kafka 被广泛应用于各种企业众多的大数据和实时数据流场景。无论在日志收集还是流数据处理上,我们都希望消息传递可以100%可靠地运行。但实际上,如同任何系统一样,Kafka在极端条件下可能会出现消息丢失的问题。那么,这究竟是在什么情况下可能发生信息丢失呢?

一、生产侧

1.1 配置问题

在Kafka的生产者配置中,acks参数主要用来设置生产者需要服务器确认消息的程度,这对消息的可靠性至关重要

  1. acks=0:生产者在完全不等待任何确认的情况下就可以继续发送下一条消息。这种情况下会有可能数据丢失。
  2. acks=1:只要集群的首领节点收到信息则认为消息未丢失。这种情况下如果首领节点未及时将数据同步给追随者就挂掉了,则消息丢失。
  3. acks=all(-1):这意味着leader将等待所有同步副本确认记录。这保证了只要至少有一个同步副本仍然存活,记录就不会丢失。这是最高的保证等级。

生产者的acks参数设置不当可能会导致消息丢失。如果设置为0,生产者发送消息后不会等待Broker的确认,消息在网络传输过程中的丢失将无法感知。****

1.2 代码问题

  1. 错误的使用 Producer API:例如,发送消息的方法没有被正确调用或者在发送消息之后未正确关闭 Producer。
  2. 异常处理不当:在发送消息过程中可能会遇到各种异常,如果代码中没有正确处理这些异常,可能会导致消息丢失。
  3. 消息封装错误:例如,消息的 key或value未正确设置,或者使用的序列化方法不正确。
  4. KafkaProducer的发送是异步的,如果在callback回调函数中未妥善处理失败情况,可能会导致发送失败的消息丢失。生产者在编写代码时出现的问题,例如错误地封装了消息,或者没有成功调用Kafka的生产者API发送消息。

1.3 网络问题

生产者发送消息到Broker期间,如果网络出现问题,消息可能丢失。

二、Bro ker节点侧

2.1 硬件故障

如果 kafka Broker 所在的机器硬盘损坏,可能导致存储在其中的消息丢失

2.2 配置问题

Kafka 通过一种称为“日志清除(log cleaning)”的机制来清理旧的、不再被使用的消息。这可以是基于时间的(例如,保留 7 天的数据),或者基于大小的(例如,每个部分超过1GB,则清理最旧的数据)。清理工作由日志清理线程进行,可以配置为运行在后台。如果这个清理策略配置得过于激进(例如,设置时间或大小限制太小),可能在消费者还没来得及消费这些消息时,消息就被清理了。这样,消费者就无法再读取到这些消息,从消费者的角度看,这些消息就被“丢失”了。同样的,如果配置了清理策略但是由于某种原因(比如磁盘空间满)没有及时进行清理,那么新产生的消息也可能无法写入,从而造成消息丢失。

2.3 集群副本同步问题

Kafka 通过 Broker 节点间的副本机制来确保数据的可靠性和容错性。一旦 lead broker 宕机或数据丢失,另一个 in-sync 的副本(ISR)可以接管成为新的 lead,保证数据的持续可用。

但是,如果在 lead broker 尚未完成数据同步到 follower broker 时就突然宕机,那么尚未同步的消息就可能丢失。尤其在参数配置不当(例如,将 replica.lag.time.max.ms 设置得过小,以至于 follower broker 没有足够的时间来追赶 lead broker)或 follower broker 由于网络故障等原因无法及时获取更新时,副本同步问题就可能导致消息丢失。

同时,如果所有的 ISR 都挂了,那么那些尚未被副本同步的消息也将会丢失。

所以,保持 Broker 之间副本正确的同步是 Kafka 数据可靠性的一个重要保证,任何副本同步上的问题都可能引起消息丢失。

2.4  节点网络问题

1.在 Kafka 集群中,各个 Broker 节点间需要通过网络进行数据同步。如果网络中断或延迟过高,可能导致 follower Broker 无法及时获取到数据,这在 leader Broker 宕机时可能会导致数据丢失。

2.Kafka使用ZooKeeper来进行集群管理,维护全局元数据信息。如果网络出现问题,Broker与ZooKeeper之间的通信可能受影响,影响正常的消息生产和消费。

三、消费侧

3.1 偏移量管理问题

在 Kafka 中,消费者消费每个主题的每个分区的消息后,会把当前消费的位置(偏移量)保存下来,下次消费时会从这个位置开始。所以,偏移量管理决定了消费者下次消费消息的起始位置。

如果偏移量没有正确提交,可能导致以下两种情况造成消息丢失:

1.重复消费:如果消费者消费了消息但是未提交偏移量,而此时消费者重启或者发生 rebalance,那么消费者下次消费的起始位置还是上次提交的偏移量,导致这部分消息被重复消费。如果消费者是进行删除、修改等非幂等操作,可能导致这部分消息“丢失”。

2.消息跳过:如果消费者在消费前就错误地提交了偏移量(比如提交了消费位置的下一位),那么下次消费时会从新的偏移量开始,从而跳过了实际未消费的消息,这就直接导致了消息丢失。

3.2 消费者宕机

消费者在消费消息过程中如果突然宕机,那么在内存中尚未处理的消息可能会丢失

3.3 消费者处理消息速度过慢

如果消费者处理消息的速度跟不上生产者,那么在日志清理策略生效后,可能会导致一部分尚未被消费的消息被删除,从而产生消息丢失。

3.4 网络问题

同上面生产侧和消费侧来说网络都是一个不稳定的因素

3.5 消费者代码问题

如果消费者在处理或提交消息时的代码写得有误,可能导致消费者无法成功获取到或存储消息,导致消息丢失。****

结语

避免 Kafka 消息丢失,可以从以下几个方面入手:

1.合理配置参数:需要合理设置生产者和消费者的参数,例如设置生产者的 acks 参数为 ‘all’ 或 ‘-1’,以确保所有复制都已确认写入后才进行下一步。同时,合理设置消费端的 auto.commit.interval 来及时提交消费的偏移量。

2.副本和同步:合理设置副本数量,保证每个分区有足够的副本来提供容错。并确保 follower broker 能够及时获取 lead broker 的消息更新。

3.网络和硬件:确保网络稳定和硬件设备可靠运行,以避免由于网络故障或硬件问题导致消息丢失。

4.日志清理策略:合理设置 Kafka Broker 的日志清理策略,避免在消费者尚未消费的消息被清除。

5.代码优化:在生产和消费消息的代码中加入适当的错误处理逻辑,避免由于代码错误导致消息丢失。

6.监控:对 Kafka 集群进行监控,一旦出现可能导致消息丢失的问题,比如leader broker宕机,网络故障等,可以立即发现并进行处理。

通过这些措施,可以在很大程度上避免 Kafka 中消息的丢失,从而提高系统的可靠性和稳定性。

以上就是关于如何排查Kafka消息丢失原因相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/11906.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】