1 可靠性
kafka的可靠性主要依赖下面几个级别配置
- broker 级别:关闭不完全的 Leader 选举,即 unclean.leader.election.enable=false
- producer 级别:acks=all(或者 request.required.acks=-1),同时preducer模式为同步模式:producer.type=sync
- topic 级别:设置 replication.factor>=3,并且 min.insync.replicas>=2
2 一致性
kafka的一致性主要依赖High Water Mark 机制
假设分区的副本为3,其中副本0是 Leader,副本1和副本2是 follower,并且在 ISR(in-sync replica)列表里面。虽然副本0已经写入了 Message3,但是 Consumer 只能读取到 Message1。因为所有的 ISR 都同步了 Message1,只有 High Water Mark 以上的消息才支持 Consumer 读取,而 High Water Mark 取决于 ISR 列表里面偏移量最小的分区,对应于上图的副本2,这个很类似于木桶原理。
引入了 High Water Mark 机制,会导致 Broker 间的消息复制因为某些原因变慢,那么消息到达消费者的时间也会随之变长(因为我们会先等待消息复制完毕)。延迟时间可以通过参数 replica.lag.time.max.ms
参数配置,它指定了副本在复制消息时可被允许的最大延迟时间。
参考