Kafka对于producer发来的消息怎么保证可靠性?
每个partition都给配上副本,做数据同步,保证数据不丢失。
副本数据同步策略
和zookeeper不同的是,Kafka选择的是全部完成同步,才发送ack。但是又有所区别。
所以,你们才会在各种博客看到这句话【kafka不是完全同步,也不是完全异步,是一种ISR机制】
这句话对也不对,不对也对(谜语人......)
首先笔者认为:Kafka使用的就是完全同步方案。
完全同步的优点
同样为了容忍 n 台节点的故障,过半机制需要 2n+1 个副本,而全部同步方案只需要 n+1 个副本,
而 Kafka 的每个分区都有大量的数据,过半机制方案会造成大量数据的冗余。(这就是和zookeeper的不同)
完全同步会有什么问题?
假设就有这么一个follower延迟太高或者某种故障的情况出现,导致迟迟不能与leader进行同步。
怎么办?leader等还是不等?
等吧:producer有话要说:“Kafka也不行啊,处理个消息这么费劲,垃圾,你等NM呢等”
不等:那你Kafka对外说完全同步个鸡儿,你这是完全同步么?
基于此,Kafka的设计者和开发者想出了一个非常鸡贼的点子:ISR
什么是ISR?
先来看几个概念
1、AR(Assigned Repllicas)一个partition的所有副本(就是replica,不区分leader或follower)
2、ISR(In-Sync Replicas)能够和 leader 保持同步的 follower + leader本身 组成的集合。
3、OSR(Out-Sync Relipcas)不能和 leader 保持同步的 follower 集合
4、公式:AR = ISR + OSR
所以,看明白了吗?
Kafka对外依然可以声称是完全同步,但是承诺是对AR中的所有replica完全同步了吗?
并没有。Kafka只保证对ISR集合中的所有副本保证完全同步。
至于,ISR到底有多少个follower,那不知道,别问,问就是