【HBZ分享】Kafka数据文件存储-可靠性保证ACK-ISR核心

【HBZ分享】Kafka数据文件存储-可靠性保证ACK-ISR核心,第1张

【HBZ分享】Kafka数据文件存储-可靠性保证ACK-ISR核心 Kafka数据文件存储

Kafka集群搭建 并 整合springboot.
Kafka日志存储流程和LOG日志解析 + LEO + HW 讲解【点击这里】.
Consumer消费者机制 与 分区策略讲解【点击这里】.
Kafka中日志清理策略.
Kafka高性能之零拷贝原理.

Kafka默认的消息同步 与 消息确认机制
当producter发送一条消息时,首先会进入partition的leader中,当leader把该消息写入到磁盘成功后,会给ack回应。 producter就会继续进行下一步或下一轮的 *** 作,kafka默认ack=1,即leader把消息落盘成功,就认为是成功了。

副本数据同步机制
(1). 当producter向partition写数据时,默认ack=1,只会向leader写数据,leader成功变认为成功
(2). 然后leader数据会复制到其他的replica中,follow会周期性的从leader中pull拉取数据并同步

kafka默认ack=1的缺点
对于follow只有当leader挂掉时,才会被选举成为新leader对外提供服务。如果当leader落盘成功,返回了ack,但此时follow还没来得及pull拉取同步,leader就挂掉了,那么此时就会造成该消息丢失。

解决方案: 令ack=all即可,但ack=all需要注意两个问题,第一个消息重复消费,第二个要配合多副本使用。这两个问题下面会具体讲解产生的原因

可靠性保证ACK

ack确认机制
(1). ack = 0
只要producter发送出去了,就直接认为成功,不会管leader是否收到,以及落盘成功
优势:性能极高,避开了等待落盘的时间
劣势:问题也非常多,发送过程中,只要出现一丢丢问题,就会导致消息丢失

(2). ack = 1(kafka默认)
producter发送后,partition的leader接收到并且成功写入磁盘,才会返回ack,否则producter会重试
优势:性能还可以,无需等待follow落盘成功,但leader需要落盘成功
劣势:由于follow在这种情况时周期性pull的,所以当leader成功落盘,并返回ack,producter会认为成功了,不会进行重试。那么此时follow还没来得及同步这条消息,leader就挂掉了,那么新选举的leader就不存在这条消息记录,所以消息丢失了

(3). ack=all
producter发送后,不仅leader要落盘成功,所有的follow也要落盘成功才会返回ack,否则producter重试
优势:最大程度保证数据一致性。
劣势:性能最低,除了要等leader落盘,还要等所有follow落盘成功才行。并且可能会造成消息重复消费问题。

ack=all会导致的问题
(1). 消息重复消费
当leader落盘成功,会等待其他follow落盘成功的响应,比如有3个follow,那么follow1,follow2落盘成功了。此时leader挂了,那么由于follow3还没响应成功,所以该消息没有ack掉,新leader会在3个follow中选一个,就很有可能follow1或follow2。由于follow1/2已经成功同步了,所以此时已经存在该消息记录,但是由于没有响应ack,producter会认为失败了而进行重试,此时follow1/2会再一次接收到同样的消息,这就导致了消息重复消费
解决办法:客户端消费者要做【幂等性校验】逻辑。

(2). 当副本只有一个,即只有一个leader,没有follow时,即使ack=all也没用,根本就没有容灾副本,leader挂了那就彻底挂了,所以要结合多副本使用才行。

抛一个问题:如果某个follow一直不给回应,那么leader就一直等着不响应ack吗?
答:kafka当然不会允许该事情发生,此问题ISR会完美解决

ISR核心(in-sync replica set)

什么是ISR(in-sync replica set)
(1). leader会维持一个与其保证同步的replica集合,该集合就是ISR, 每个leader partition都有一个ISR, leader动态维护,要保证kafka不丢失message,就要保证ISR这组集合存活(至少有一个存活), 并且消息commit成功
(2). Partition leader保持同步的Partition Follower集合,当ISR中的Follow完成数据同步后,会给leader发送ack
(3). 如果Follow长时间未向leader同步数据(时间超过replica.lag.time.max.ms设定的时间),则该Follow会被踢出ISR
(4). Leader发生故障后,会在ISR中选举新Leader。记住是ISR中选举,OSR中的Follow是没资格选举的

什么是OSR(out-of-sync-replicas)
与leader分区 同步滞后过多的副本集合

什么是AR (Assign Replicas)
分区中所有副本的统称AR,即【OSR+ISR】

纯文字过于枯燥难懂,下面一张图解决疑惑

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5701626.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存