23 | Kafka副本机制详解
该思维导图由 AI 生成,仅供参考
副本定义
- 深入了解
- 翻译
- 解释
- 总结
Apache Kafka的副本机制是保证系统高可用和消息高持久性的核心设计。该机制通过In-sync Replicas(ISR)和Unclean领导者选举(Unclean Leader Election)两个关键概念来实现。ISR是指与Leader同步的副本集合,通过replica.lag.time.max.ms参数值来动态调整副本的同步状态,确保数据一致性和系统稳定性。而Unclean领导者选举则是在ISR为空时选择新的Leader副本,开启该选项提升了高可用性但可能导致数据丢失,反之则维护了数据一致性但牺牲了高可用性。这两个概念的灵活运用使得Kafka能够根据实际业务场景选择C或A,即一致性或可用性。文章还提到了社区正在考虑是否允许Follower副本处理客户端消费者发来的请求,以改善云上数据的局部性。总的来说,本文深入解析了Apache Kafka的副本机制及其实现原理,为读者提供了深入了解Kafka技术内幕的机会。
《Kafka 核心技术与实战》,新⼈⾸单¥68
全部留言(89)
- 最新
- 精选
- 张三丰replica.lag.time.max.ms,感觉老师对这个参数的解释有歧义。 应该是如果leader发现flower超过这个参数所设置的时间没有向它发起fech请求(也就是复制请求),那么leader考虑将这个flower从ISR移除。 而不是连续落后这么长时间
作者回复: 嗯,是的。你的解释更精准:)
2021-01-16663 - Mick老师,LEO和HW这两个概念不理解,能不能详细说下,谢谢
作者回复: 一个分区有3个副本,一个leader,2个follower。producer向leader写了10条消息,follower1从leader处拷贝了5条消息,follower2从leader处拷贝了3条消息,那么leader副本的LEO就是10,HW=3;follower1副本的LEO是5。这样说清楚些吗
2019-08-02834 - 凯请问一下,producer生产消息ack=all的时候,消息是怎么保证到follower的,因为看到follower是异步拉取数据的,难道是看leader和follower上面的offset吗?
作者回复: 通过HW机制。leader处的HW要等所有follower LEO都越过了才会前移
2019-08-01434 - ideal sail老师,假设一个分区有5个副本,Broker的min.insync.replicas设置为2,生产者设置acks=all,这时是有2个副本同步了就可以,还是必须是5个副本都同步,他们是什么关系。
作者回复: Producer端认为消息已经成功提交的条件是:ISR中所有副本都已经保存了该消息,但producer并没有指定ISR中需要几个副本。这就是min.insync.replicas参数的作用。 正常情况下,如果5个副本都在ISR中,那么它们必须都同步才行,但如果4个副本不在ISR中了,不满足min.insync.replicas了,此时broker会抛出异常给producer,告诉producer这条消息无法正确保存
2019-12-16329 - 咸淡一首诗老师,“这个标准就是 Broker 端参数 replica.lag.time.max.ms 参数值。这个参数的含义是 Follower 副本能够落后 Leader 副本的最长时间间隔,当前默认值是 10 秒” 这句话中的最长时间间隔是怎么计算的,以什么时间为基准?
作者回复: follower从leader拿到消息后会更新一个名为_lastCaughtUpTimeMs的字段。每当要检查follower是否out of ISR时就会用当前时间减去这个字段值去和replica.lag.time.max.ms 比较
2020-04-07320 - 曹伟雄老师你好,有个问题请教一下,麻烦抽空看看,谢谢。 生产环境,因磁盘满了,所有broker宕机了,重启集群后,主题中的部分分区中,有1个副本被踢出ISR集合,只剩下leader副本了。 试了以下几种方法都没有自动加入进来: 1、等了3天后还是没有加入到ISR; 2、然后重启kafka集群; 3、用kafka-reassign-partitions.sh命令重新分配分区; 针对此情况,请问一下有什么办法让它自动加入进来? 或者手工处理加入进来也可以。 有什么命令可以查看follower落后多少吗? 麻烦老师给点建议或解决思路,谢谢。
作者回复: 试试到ZooKeeper中手动删除/controller节点。这通常都是因为Controller与ZooKeeper状态不同步导致的。 试试这个命令吧: rmr /controller 确保在业务低峰时刻执行这个命令
2019-12-16217 - 蛮野ack=all时候,生产者向leader发送完数据,而副本是异步拉取的,那生产者写入线程要一直阻塞等待吗
作者回复: 不会阻塞,你可以认为是不断轮询状态
2019-10-1112 - 李先生胡哥:分区选举leader,是通过抢占模式来选举的。如果不开启unclean.leader.election.enable,是只能isr集合中的broker才能竞争吗?这个竞争的过程能具体说下是如何实现的吗?
作者回复: 目前选举leader的算法很简单,一般是选择AR中第一个处在ISR集合的副本为leader。比如AR的副本顺序是[1,2,3],ISR是[2,3],那么副本2就是leader
2020-04-1339 - Cv生产者acks=all使用异步提交, 如果ISR副本迟迟不能完成从leader的同步, 那么10s过后, 生产者会收到提交失败的回调吗? 还是一直不会有回调
作者回复: 会的,回调中会包含对应的错误码
2020-03-1329 - LJK老师好,请问ISR中的副本一定可以保证和leader副本的一致性吗?如果有一种情况是某个ISR中副本与leader副本的lag在ISR判断的边界值,这时如果leader副本挂了的话,还是会有数据丢失是吗?谢谢老师
作者回复: ISR中的follower副本非常有可能与leader不一致的。如果leader挂了,其他follower又都没有保存该消息,那么该消息是可能丢失的。如果你要避免这种情况,设置producer端的acks=all吧
2019-09-2569