Kafka之数据可靠性和一致性

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 都能读到一样的数据。

Kafka之数据可靠性和一致性_第1张图片

假设分区的副本为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

 

你可能感兴趣的:(kafka)