Kafka怎么避免数据丢失和数据重复?

为什么会出现数据丢失和数据重复?
<1>、消息发送
Kafka有两种同步方式:同步和异步,默认是同步,可以通过参数producer.type来设置,Kafka通过配置request.required.acks属性来生产消息:
0——代表不进行消息是否成功接收的确认
1——代表当leader接收成功时确认
-1——代表leader和follower都接收成功的确认

分析一下消息发送时数据丢失的情形:
(1)、acks=0,不和kafka集群进行消息接收的确认,那么当网络异常、缓冲区满了等情况时,就会出现数据丢失;
(2)、acks=1,同步模式下,在只有leader接收成功并确认后,leader挂了,副本没有同步完成,就会造成数据丢失;

<2>、消息消费
Kafka消息消费有两个consumer接口:Low-level API和High-level API
Low-level API:消费者自己维护offset,消费者可以实现对Kafka的控制
High-level API:封装了partition和offset的管理,使用简单

如果使用高级接口High-level API,可能存在的一个问题是当从partition中把消息提取出来时,并且提交了新的offset,但是数据还没来得及消费consumer就挂了,那么在下次开始新的消费时,之前没有消费的消息就丢失了。

解决方案:
针对数据丢失:
1.同步模式下:
producer.type=sync
request.required.acks=-1
(0表示不需要反馈信息,1表示写入leader成功,-1表示所有备份块写入成功)
2.异步模式下:
如果是异步模式:通过buffer来进行控制数据的发送,有两个值来进行控制,时间阈值与消息的数量阈值,如果buffer满了数据还没有发送出去,如果设置的是立即清理模式,风险很大,一定要设置为阻塞模式
block.on.buffer.full = true
3.当存有你最新一条记录的 replication 宕机的时候,Kafka 自己会选举出一个主节点,如果默认允许还未同步最新数据的 replication 所在的节点被选举为主节点的话,你的数据将会丢失,因此这里应该按需将参数调控为 false;
unclean.leader.election.enable = false (Kafka 0.11版本之后默认参数为false,之前版本为true)
针对消息重复:
将消息的唯一标识存储在外部介质中(如redis等),每次消费时判断是否处理过即可;

具体操作解决方案:
数据丢失:首先对kafka进行限速,然后启用重试机制,重试的间隔时间长一点,最后将acks=all(代表至少成功发送一次,等同于-1),也就是所有处于ISR的分区都确认收到消息后,才算发送成功。

消息重复
消息使用唯一id标识,
生产者acks=all(消息至少成功发送一次),
消费者(offset手动提交,当业务逻辑处理完成后,手动提交offset),
落地一张表(主键或者唯一索引的方式存储到redis等,先查询表中是否存在,存在则不处理,不存在就先插入到表中,然后在消费数据,进行相关的逻辑处理,避免重复数据)。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值