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】
纯文字过于枯燥难懂,下面一张图解决疑惑