1、数据可靠性
(1)producer 级别:acks=all(或者 request.required.acks=-1),同时发生模式为同步 producer.type=sync
(2)topic 级别:设置 replication.factor>=3,并且 min.insync.replicas>=2;
min.insync.replicas:最小写入副本数的个数,默认值为1,当且仅当request.required.acks参数设置为-1时,此参数才生效。
如果ISR中的副本数少于min.insync.replicas配置的数量时,客户端会返回异常:org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required。
(3)broker 级别:关闭不完全的 Leader 选举,即 unclean.leader.election.enable=false;
参数配置详细讲解参看:https://blog.csdn.net/zuodaoyong/article/details/104192381和https://blog.csdn.net/zuodaoyong/article/details/101921190
2、数据一致性
不论是老的 Leader 还是新选举的 Leader,Consumer 都能读到一样的数据。
假设分区的副本为3,其中副本0是 Leader,副本1和副本2是 follower,并且在 ISR 列表里面。虽然副本0已经写入了 Message4,但是 Consumer 只能读取到 Message2。因为所有的 ISR 都同步了 Message2,只有 High Water Mark 以上的消息才支持 Consumer 读取,而 High Water Mark 取决于 ISR 列表里面偏移量最小的分区,对应于上图的副本2,这个很类似于木桶原理。
这样做的原因是还没有被足够多副本复制的消息被认为是“不安全”的,如果 Leader 发生崩溃,另一个副本成为新 Leader,那么这些消息很可能丢失了。如果我们允许消费者读取这些消息,可能就会破坏一致性。试想,一个消费者从当前 Leader(副本0) 读取并处理了 Message4,这个时候 Leader 挂掉了,选举了副本1为新的 Leader,这时候另一个消费者再去从新的 Leader 读取消息,发现这个消息其实并不存在,这就导致了数据不一致性问题。
当然,引入了 High Water Mark 机制,会导致 Broker 间的消息复制因为某些原因变慢,那么消息到达消费者的时间也会随之变长(因为我们会先等待消息复制完毕)。延迟时间可以通过参数 replica.lag.time.max.ms
参数配置,它指定了副本在复制消息时可被允许的最大延迟时间。
lso:https://blog.csdn.net/u013256816/article/details/88985769