【kafka】kafka的数据丢失与重复

【消息ack机制】

ack=0:生产者消息发送后立即返回,不用确认消息是否发送成功。(性能最好,可靠性最差。发过去就完事了,不关心broker是否处理成功,可能丢数据。)

ack=1:(默认)生产者消息发送后,等待leader写入成功返回ack,则生产者才返回。(性能和可靠性相对平衡。当写Leader成功后就返回,其他的replica都是通过fetcher去同步的,所以kafka是异步写,主备切换可能丢数据。)

ack=-1:生产者消息发送后,不仅leader写入成功,还需要其他节点分区写入成功后,生产者才返回。(性能最差,可靠性最好。要等到isr里所有机器同步成功,才能返回成功,延时取决于最慢的机器。强一致,不会丢数据。)

注意:若ack=-1时还有数据丢失情况,确认是否集群中只有一台leader。

 

【数据丢失】

1.kafka的消息发送分为同步(默认,实时的)和异步(达到某种条件发送)。可通过 producer.type 属性进行配置

同步:生产者写一条数据,该数据立刻写入到某个分区。(数据重要,不能丢失,如银行数据)

异步:生产者写一条数据,先写入缓存,然后以batch(批量)的形式再写入到分区。(数据不是很重要,可以丢失一两条,如日志)

注意:如果设置成异步的模式,可以运行生产者以batch的形式push数据,这样会极大的提高broker的性能,但是这样会增加丢失数据的风险。

2.异步发送相关参数:
producer.type  async/sync 默认是sync 
当满足以下其中一个条件的时候就触发 发送
batch.num.messages 异步发送 每次批量发送的条目 
queue.buffering.max.ms 异步发送的时候 发送时间间隔 单位是毫秒
 

【数据丢失解决办法】

1.同步模式下的设置

(1)模式设置为同步模式,producer.type = sync

(2)ack设置为-1,Request.required.acks =  -1

(3)副本数大于等于2,replication.factor >= 2 且 min.insync.replicas >= 2

2.异步模式下的设置

不限制阻塞超时时间。就是一满生产者就阻塞

producer.type = async

request.required.acks=1

queue.buffering.max.ms=5000

queue.buffering.max.messages=10000

queue.enqueue.timeout.ms = -1

batch.num.messages=200
 

【数据重复】

acks = -1 的情况下,数据发送到 leader 后 ,部分 ISR 的副本同步,leader 此时挂掉。比如 follower1 和 follower2 都有可能变成新的 leader, producer 端会得到返回异常,producer 端会重新发送数据,数据可能会重复

另外, 在高阶消费者中,offset 采用自动提交的方式, 自动提交时,假设 1s 提交一次 offset 的更新,设当前 offset = 10,当消费者消费了 0.5s 的数据,offset 移动了 15,由于提交间隔为 1s,因此这一 offset 的更新并不会被提交,这时候我们写的消费者挂掉,重启后,消费者会去 ZooKeeper 上获取读取位置,获取到的 offset 仍为10,它就会重复消费. 解决办法使用低级消费者
 

【参考文献】

https://blog.csdn.net/tzwjava/article/details/39930715

https://blog.csdn.net/weixin_38750084/article/details/82941796

https://blog.csdn.net/a308601801/article/details/88642985

https://blog.csdn.net/zjh_746140129/article/details/88779640

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值