前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文理解Kafka如何消息不丢失

一文理解Kafka如何消息不丢失

作者头像
全菜工程师小辉
发布于 2021-06-25 13:06:29
发布于 2021-06-25 13:06:29
1.6K0
举报

本文只聚焦于Kafka系统的消息丢失,如果是生产环境出现数据丢失,排查时要先从链路上分段定位,缩小问题范围。

如果对Kafka不了解的话,可以先看这篇博客《一文快速了解Kafka》。

数据丢失的原因

生产者丢失消息的情况

生产者(Producer) 调用send方法发送消息之后,消息可能因为网络问题并没有发送过去。

解决方法:

不能认为在调用send方法发送消息之后消息消息发送成功了。为了确定消息是发送成功,需要判断消息发送的结果。但要注意的是Kafka生产者(Producer) 使用send方法发送消息实是异步的操作,虽然可以通过get()方法获取调用结果,但降低业务服务的吞吐量。优化的方式是改为回调函数的形式。

此外,对于一致性要求不高的业务场景,可以考虑Producer端设置retries(重试次数)设置一个比较合理的值,一般是3。设置完成之后,当出现网络问题之后能够自动重试消息发送,避免消息丢失。另外,建议将重试间隔设置长一些,因为间隔时间太小,可能一次网络波动的时间重试全部结束了。

消费者丢失消息的情况

自动提交开启会存在这样的问题:当消费者poll到这个消息,还没进行真正消费的时候,offset被自动提交的同时消费者挂掉了。

解决办法:

关闭自动提交offset(即:enable.auto.commit为false),每次在真正消费完消息之后,手动提交offset。

但这样还是会存在消费者刚消费完消息,还没提交offset,结果宕机了,那么这个消息理论上就会被消费两次,因此消费端幂等性是需要保证。可以查看博客《一文理解如何实现接口的幂等性》,有这种问题对应的解决方案

Kafka系统内丢失消息的情况

假如leader副本所在的broker突然挂掉,那么就要从follower副本重新选出一个leader,但是leader的数据还有一些没有被follower副本的同步的话,就会造成消息丢失。

解决方法:

为了减少Kafka系统内丢失消息的情况,Kafka需要配置如下几个参数:

  1. Producer端设置acks=all。acks的默认值为1,代表消息被leader副本接收之后就算被成功发送。当配置acks=all代表则所有副本都要接收到该消息之后该消息才算真正成功被发送。(副本只是将消息存储在PageCache上的,定期flush到磁盘上的,如果出现断电或者机器故障等,PageCache上的数据就丢失了。但设置设置了acks=all,出现多个副本同时挂掉的概率比Leader挂掉的概率就小很多)
  2. topic设置replication.factor>=3。为了保证leader副本能有follower 副本能同步消息,一般会设置replication.factor>=3。这样就可以保证每个分区(partition)至少有3个副本。虽然造成了数据冗余,但是带来了数据的安全性。
  3. 设置min.insync.replicas>1。一般情况下需要设置min.insync.replicas>1,这样配置代表消息至少要被写入到2个副本才算是被成功发送(默认值为1)。在实际生产中应尽量避免min.insync.replicas值为1,此外,为了保证整个Kafka服务的高可用性,你需要确保replication.factor>min.insync.replicas,否则有一个副本挂掉,整个分区就无法正常工作了。推荐设置成replication.factor=min.insync.replicas+1。
  4. 设置unclean.leader.election.enable=false。即不允许Unclean leader选举。
  5. Producer端设置retries。配合acks=all,这样可以保证leader挂掉之后,Producer会重新发送消息。

Unclean leader选举:Kafka把不在ISR列表中的存活副本称为“非同步副本”,这些副本中的消息远远落后于leader,如果选举这种副本作为leader的话就可能造成数据丢失。Kafka broker端提供了一个参数unclean.leader.election.enable,用于控制是否允许非同步副本参与leader选举;如果开启,则当ISR为空时就会从这些副本中选举新的leader,这个过程称为Unclean leader选举。

异常导致的数据丢失

单条数据的长度超过限制会丢失数据,报kafka.common.MessageSizeTooLargeException异常,导致生产者消息积压,内存上升。

解决方法:

修改Kafka Broker的配置,修改单条消息的最大长度、单条消息的最大长度等参数配置。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全菜工程师小辉 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
注意:Kafka 的这 6 个场景会丢失消息!
Producer 异步发送是丢失消息比较多的场景,Kafka 异步发送的代码如下:
jinjunzhu
2024/04/12
1760
注意:Kafka 的这 6 个场景会丢失消息!
Kafka —— 如何保证消息不会丢失
当我们通过 send(msg, callback) 是不是就意味着消息一定不丢失了呢?
solve
2019/11/26
1.5K0
Kafka零数据丢失的配置方案
如果要想保证Kafka数据不丢, 要从Kafka的三个地方入手:生产者、服务端和消费者。
江帅帅
2020/05/15
9760
Kafka精进 | Producer端核心参数及调优建议
在前面文章《Kafka精进 | 一文读懂Producer消息发送机制》中,我们从Kafka消息结构、序列化器、分区器及消息缓冲池等方面介绍了Producer端的原理,回顾示意图如下:
大数据技术架构
2020/04/22
8640
Kafka 数据可靠性深度解读
1 概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark等都支持与Kafka集成。 Kafka凭借着自身的优势,越来越受到互联网企业的青睐,唯品会也采用Kafka作为其内部核心消息引擎之一。Kafka作为一个商业级消息中间件,消息可靠性的重要性可想而知。如何确保消息的精确传输?如何确保消息的准确存储?如何确保消息的正
用户1263954
2018/01/30
1.5K0
Kafka 数据可靠性深度解读
Kafka 是如何保证数据可靠性和一致性
学过大数据的同学应该都知道 Kafka,它是分布式消息订阅系统,有非常好的横向扩展性,可实时存储海量数据,是流数据处理中间件的事实标准。本文将介绍 Kafka 是如何保证数据可靠性和一致性的。
大数据技术架构
2019/08/16
6.8K0
Kafka 是如何保证数据可靠性和一致性
kafka学习笔记
kafka相关概念图 重点: kafka里的副本针对的是分区来做的, 副本不提供对外的服务,只记录消息数据,kafka通过对topic分区来实现消息系统的负载。
良辰美景TT
2022/05/13
3660
kafka学习笔记
​ ISR HW、LEO、LSO、LW 详解
leader副本的LEO为9,follower副本的LEO为7,而follower2副本的LEO为6,如果判定这三个副本都处于ISR集合中,那么分区的HW为6,如果follower3已经判定失效副本被剥离出ISR集合,那么此时分区HW为leader副本和follower副本中LEO的最小值,即为
派大星在吗
2021/12/15
8890
Kafka 消息丢失与消费精确一次性
如果Kafka Producer使用“发后即忘”的方式发送消息,即调用producer.send(msg)方法来发送消息,方法会立即返回,但此时并不能说明消息已经发送成功。消息发送方式详见初次邂逅Kafka生产者。
江帅帅
2020/07/03
7610
kafka怎么保证数据消费一次且仅消费一次?使用消息队列如何保证幂等性?
精确一次处理语义(exactly onece semantic–EOS),Kafka的EOS主要体现在3个方面:
一个会写诗的程序员
2021/03/23
7.8K0
kafka怎么保证数据消费一次且仅消费一次?使用消息队列如何保证幂等性?
Kafka笔记—可靠性、幂等性和事务
这几天很忙,但是我现在给我的要求是一周至少要出一篇文章,所以先拿这篇笔记来做开胃菜,源码分析估计明后两天应该能写一篇。给自己加油~,即使没什么人看。
luozhiyun
2019/09/10
1.1K0
程序员的27大Kafka面试问题及答案
Producer将消息发送到集群指定的主题中存储,同时也自定义算法决定将消息记录发送到哪个分区?
鱼找水需要时间
2023/12/24
3070
面试官问我如何保证Kafka不丢失消息?我哭了!
不了解 Kafka 的朋友建议先看一看我的下面这几篇文章,第一篇一定要看,其他的可以按需学习。
Guide哥
2020/05/07
2.9K0
面试官问我如何保证Kafka不丢失消息?我哭了!
案例 | Kafka 为什么会丢消息?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/09/14
8770
案例 | Kafka 为什么会丢消息?
聊聊kafka的生成和消费的问题
大致数据流程是kafka的生产者Producer生成数据,通过broker服务写到Topic A中的Partition 0分区中,这个时候数据已经存到磁盘中了,然后Consumer A通过消费把Topic A中的Partition 0中的数据消费出来,存到相关存储DB中。
公众号-利志分享
2022/04/25
4460
聊聊kafka的生成和消费的问题
【年后跳槽必看篇】Kafka核心知识点 技术探秘第一章
Kafka是一个成熟的消息队列,是一个天然分布式、支持分区(partition)、多副本(replica)。是基于Zookeeper协调的分布式消息系统。它最大特性就是可以实时的处理大量数据以满足各种需求场景:比如:基于Hadoop的批处理系统,低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等。Kafka使用Scala语言编写的。
@派大星
2024/01/19
3590
硬核 | Kafka 如何解决消息不丢失?
Kafka 消息框架,大家一定不陌生,很多人工作中都有接触。它的核心思路,通过一个高性能的MQ服务来连接生产和消费两个系统,达到系统间的解耦,有很强的扩展性。
捡田螺的小男孩
2021/08/12
8790
硬核 |  Kafka 如何解决消息不丢失?
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?
数据的丢失问题,可能出现在生产者、MQ、消费者中,咱们从 RabbitMQ 和 Kafka 分别来分析一下吧。
IT技术小咖
2019/11/22
8540
【大数据哔哔集20210124】有人问我Kafka Leader选举?我真没慌
一条消息只有被ISR中所有Follower都从Leader复制过去才会被认为已提交。这样就避免了部分数据被写进了Leader,还没来得及被任何Follower复制就宕机了,而造成数据丢失。而对于Producer而言,它可以选择是否等待消息commit,这可以通过request.required.acks来设置。这种机制确保了只要ISR中有一个或者以上的follower,一条被commit的消息就不会丢失。
大数据真好玩
2021/02/23
3380
【大数据哔哔集20210124】有人问我Kafka Leader选举?我真没慌
Kafka消息分区&producer拦截器&无消息丢失(八)
上篇文章说了,acks,1代表什么都不管,即使配置了回调也不会起作用,0代表不会等待replic副本里的不会持久化,只要broker leader持久化成功则返回给producer。-1代表all,则表示全部持久化成功才返回成功给producer,Retries,batch.size:kafka,linger.ms,buffer.memory,compression.type等参数。
用户9919783
2022/12/14
4070
推荐阅读
相关推荐
注意:Kafka 的这 6 个场景会丢失消息!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档