Kafka核心技术与实战
胡夕
人人贷计算平台部总监,Apache Kafka Contributor
立即订阅
8408 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么要学习Kafka?
免费
Kafka入门 (5讲)
01 | 消息引擎系统ABC
02 | 一篇文章带你快速搞定Kafka术语
03 | Kafka只是消息引擎系统吗?
04 | 我应该选择哪种Kafka?
05 | 聊聊Kafka的版本号
Kafka的基本使用 (3讲)
06 | Kafka线上集群部署方案怎么做?
07 | 最最最重要的集群参数配置(上)
08 | 最最最重要的集群参数配置(下)
客户端实践及原理剖析 (14讲)
09 | 生产者消息分区机制原理剖析
10 | 生产者压缩算法面面观
11 | 无消息丢失配置怎么实现?
12 | 客户端都有哪些不常见但是很高级的功能?
13 | Java生产者是如何管理TCP连接的?
14 | 幂等生产者和事务生产者是一回事吗?
15 | 消费者组到底是什么?
16 | 揭开神秘的“位移主题”面纱
17 | 消费者组重平衡能避免吗?
18 | Kafka中位移提交那些事儿
19 | CommitFailedException异常怎么处理?
20 | 多线程开发消费者实例
21 | Java 消费者是如何管理TCP连接的?
22 | 消费者组消费进度监控都怎么实现?
深入Kafka内核 (5讲)
23 | Kafka副本机制详解
24 | 请求是怎么被处理的?
25 | 消费者组重平衡全流程解析
26 | 你一定不能错过的Kafka控制器
27 | 关于高水位和Leader Epoch的讨论
管理与监控 (12讲)
28 | 主题管理知多少?
29 | Kafka动态配置了解下?
30 | 怎么重设消费者组位移?
31 | 常见工具脚本大汇总
32 | KafkaAdminClient:Kafka的运维利器
33 | Kafka认证机制用哪家?
34 | 云环境下的授权该怎么做?
35 | 跨集群备份解决方案MirrorMaker
36 | 你应该怎么监控Kafka?
37 | 主流的Kafka监控框架
38 | 调优Kafka,你做到了吗?
39 | 从0搭建基于Kafka的企业级实时日志流处理平台
高级Kafka应用之流处理 (3讲)
40 | Kafka Streams与其他流处理平台的差异在哪里?
41 | Kafka Streams DSL开发实例
42 | Kafka Streams在金融领域的应用
结束语 (1讲)
结束语 | 以梦为马,莫负韶华!
特别放送 (2讲)
加餐 | 搭建开发环境、阅读源码方法、经典学习资料大揭秘
用户故事 | 黄云:行百里者半九十
Kafka核心技术与实战
登录|注册

23 | Kafka副本机制详解

胡夕 2019-07-25
你好,我是胡夕。今天我要和你分享的主题是:Apache Kafka 的副本机制。
所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝。副本机制有什么好处呢?
提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。
提供高伸缩性。支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量。
改善数据局部性。允许将数据放入与用户地理位置相近的地方,从而降低系统延时。
这些优点都是在分布式系统教科书中最常被提及的,但是有些遗憾的是,对于 Apache Kafka 而言,目前只能享受到副本机制带来的第 1 个好处,也就是提供数据冗余实现高可用性和高持久性。我会在这一讲后面的内容中,详细解释 Kafka 没能提供第 2 点和第 3 点好处的原因。
不过即便如此,副本机制依然是 Kafka 设计架构的核心所在,它也是 Kafka 确保系统高可用和消息高持久性的重要基石。

副本定义

在讨论具体的副本机制之前,我们先花一点时间明确一下副本的含义。
我们之前谈到过,Kafka 是有主题概念的,而每个主题又进一步划分成若干个分区。副本的概念实际上是在分区层级下定义的,每个分区配置有若干个副本。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(45)

  • 趙衍
    老师讲的很好,我做一些补充吧。

    Kafka在启动的时候会开启两个任务,一个任务用来定期地检查是否需要缩减或者扩大ISR集合,这个周期是replica.lag.time.max.ms的一半,默认5000ms。当检测到ISR集合中有失效副本时,就会收缩ISR集合,当检查到有Follower的HighWatermark追赶上Leader时,就会扩充ISR。

    除此之外,当ISR集合发生变更的时候还会将变更后的记录缓存到isrChangeSet中,另外一个任务会周期性地检查这个Set,如果发现这个Set中有ISR集合的变更记录,那么它会在zk中持久化一个节点。然后因为Controllr在这个节点的路径上注册了一个Watcher,所以它就能够感知到ISR的变化,并向它所管理的broker发送更新元数据的请求。最后删除该路径下已经处理过的节点。

    此外,在0.9X版本之前,Kafka中还有另外一个参数replica.lag.max.messages,它也是用来判定失效副本的,当一个副本滞后leader副本的消息数超过这个参数的大小时,则判定它处于同步失效的状态。它与replica.lag.time.max.ms参数判定出的失效副本取并集组成一个失效副本集合。

    不过这个参数本身很难给出一个合适的值。以默认的值4000为例,对于消息流入速度很低的主题(比如TPS为10),这个参数就没什么用;对于消息流入速度很高的主题(比如TPS为2000),这个参数的取值又会引入ISR的频繁变动。所以从0.9x版本开始,Kafka就彻底移除了这一个参数。
    2019-07-27
    1
    45
  • 请问一下,producer生产消息ack=all的时候,消息是怎么保证到follower的,因为看到follower是异步拉取数据的,难道是看leader和follower上面的offset吗?

    作者回复: 通过HW机制。leader处的HW要等所有follower LEO都越过了才会前移

    2019-08-01
    1
    8
  • 张学磊
    个人觉得只所以使用消息队列进行异步处理就不会太关心消息处理的及时性,那当允许Follower副本对外提供读请求时,第一消费者可以降低读取消息的频率,给予Follower副本一定同步的时间,第二消费者在读取消息是优先读取Follower副本中的信息,如果读取不到再转到Leader副本中进行读取。
    2019-07-27
    1
  • 公号-代码荣耀
    本章原理和过程讲得很清楚。👍
    2019-07-25
    1
  • 刘彬
    老师好,想请教您两个问题,如下:
    如果某个follower副本同步持续慢于leader副本写入速度,repkica.lag.time.max.ms 是对于二者的同步时间做的判断,我理解就是如果一直检查10s follower都赶不上leader副本的进度!
    但是,这个同步进度是用哪一块进行判别的呢?是通过index值吗?
    另外,如果某个follower不在ISR中了,kafka如果维持副本数均衡呢?比如设置了副本数为3,其中一个副本不在ISR集合中了,那么就一直少了一个副本吗?前提是这个副本一直没有跟上leader的同步进度!
    谢谢!

    作者回复: 1. 通过比较follower和leader的最新消息位移或末端消息位移(Log End Offset, LEO)
    2. 嗯,就一直少一个副本了

    2019-07-25
    1
    1
  • 洪东楗
    您好,老师,自己实验中有个问题想请教下,broker有三台,topic有1分区3副本,min.insync.replicas设置为2的时候,消息都发送成功了,但是消费者没消费到数据,把min.insync.replicas设置为1,消费者就消费到数据了,希望您能帮忙解答下

    作者回复: 你是如何确定消息发送成功了呢?可以使用KafkaConsumer.endOffsets验证下消息确实写入成功了,

    2019-11-27
  • man1s
    打破follower 不可读是指让leader 写,某一个follower读吗?同一个分区应该不能同时读多个副本吧,同时读多个副本offset的维护想想就可怕

    作者回复: 有兴趣看看KIP-392的设计吧(https://cwiki.apache.org/confluence/display/KAFKA/KIP-392%3A+Allow+consumers+to+fetch+from+closest+replica)

    2019-11-26
  • 注定非凡
    1 副本机制的定义:所谓副本机制(Replication),也可以称之为备份机制,通常是指分布式在多台网络互连的机器上保存有相同的数据拷贝。
    2 副本机制的价值:A :提供数据冗余 B :提供高伸缩性 C :改善数据局部性
    但 Kafka的副本机制,只实现了提供数据冗余的价值。

    3 副本定义:
    A :Kafka有主题的概念,每个主题又分为若干个分区。副本的概念是在分区层级下定义的,每个分区配置有若干个副本。
    B :所谓副本(Replica),本质是一个只能追加写消息的提交日志。
       根据Kafka副本机制的定义,同一个分区下的所有副本保存有相同的消息序列,这些副本分散保存在不同的Broker上,从而能够对抗部分Broker宕机带来的数据不可用。

    4 副本角色:
    A :为解决分区下多个副本的内容一致性问题,常用方案就是采用基于领导者的副本机制。
    B :在kafka中,副本分两类:领导者副本和追随者副本。每个分区在创建时都选举一个副本,称为领导者副本,其余的副本自动成为追随者副本。
    C :Kafka的副本机制比其他分布式系统严格。Kafka的追随者副本不对外提供服务。所有的请求都要由领导者副本处理。追随者副本唯一的任务就是从领导者副本异步拉取消息,并写入到自己的提交日志中,从而实现与领导者副本的同步。
    D :当领导者副本所在Broker宕机了,Kafka依托于Zookeeper提供的监控功能能够实时感知到,并立即开启新一轮的领导者选举,从追随者副本中选一个新的领导者。当老的Leader副本重启回来后,只能作为追随者副本加入到集群中。

    4 Kafka副本机制的优点:
    A :方便实现“Read-your-writes”
    (1)含义:当使用生产者API向Kafka成功写入消息后,马上使用消息者API去读取刚才生产的消息。
    (2)如果允许追随者副本对外提供服务,由于副本同步是异步的,就可能因为数据同步时间差,从而使客户端看不到最新写入的消息。
    B :方便实现单调读(Monotonic Reads)
    (1)单调读:对于一个消费者用户而言,在多处消息消息时,他不会看到某条消息一会存在,一会不存在。
    (2)如果允许追随者副本提供读服务,由于消息是异步的,则多个追随者副本的状态可能不一致。若客户端每次命中的副本不同,就可能出现一条消息一会看到,一会看不到。

    5 In-sync Replicas(ISR)同步副本
    A :追随者副本定期的异步拉取领导者副本中的数据,这存在不能和Leader实时同步的风险。
    B :Kafka引入了In-sync Replicas。ISR中的副本都是于Leader同步的副本,相反,不在ISR中的追随者副本就是被认为是与Leader不同步的。
    C :Leader 副本天然就在ISR中,即ISR不只是追随者副本集合,他必然包括Leader副本。甚至某些情况下,ISR只有Leade这一个副本。
    D :follower副本是否与leader同步的判断标准取决于Broker端参数 replica.lag.time.max.ms参数值。默认为10秒,只要一个Follower副本落后Leader副本的时间不连续超过10秒,那么Kafka就认为该Follower副本与leader是同步的,即使此时Follower副本中保存的消息明显小于Leader副本中的消息。
    E :如果同步过程持续慢于Leader副本消息的写入速度,那么replica.lag.time.max.ms时间后,此Follower副本就会被认为是与Leader副本不同步的,因此不能再放入ISR中。此时,kafka会自动收缩ISR的进度,将该副本“踢出”ISR。ISR是一个动态调整的集合,而非静态不变的。

    6 Unclean 领导者选举(Unclean Leader Election)
    A :ISR是可以动态调整的,所以会出现ISR为空的情况,由于Leader副本天然就在ISR中,如果ISR为空了,这说明Leader副本也挂掉了,Kafka需要重新选举一个新的Leader。
    B :Kafka把所有不在ISR中的存活副本都会称为非同步副本。通常,非同步副本落后Leader太多,如果让这些副本做为新的Leader,就可能出现数据的丢失。在kafka中,选举这种副本的过程称为Unclean领导者选举。
    C :Broker端参数unclean.leader.election.enable 控制是否允许Unclean领导者选举。开启Unclean领导者选举可能会造成数据丢失,但它使得分区Leader副本一直存在,不至于停止对外提供服务,因此提升了高可用性。禁止Unclean领导者选举的好处是在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。
    2019-11-07
  • 13761642169
    配置是 unclean.leader.election.enable=false
    1个分区有2个副本,r1 和 r2,isr 中只有 r1,r1 所在机器崩溃后,并且日志数据也丢失了,这种情况怎样操作让分区恢复服务?

    作者回复: 只能把r2启动起来了,而且有可能出现数据丢失。因为Kafka承诺不丢消息也是有条件的

    2019-10-18
  • 修愿三秋
    老师你好,acks=all是保证isr列表中的副本同步,如果长时间的大吞吐量,致使isr中只剩下leader,那acks=all实际起到的效果就是只同步leader一个副本,如果此时leader挂掉,那是不是会丢数据?

    作者回复: 也不算丢数据,默认配置下如果ISR为空了,这个分区就不可用了,producer也无法向这个分区发送任何消息了。对于这种情况,Kafka不认为是丢数据

    2019-10-14
  • 云师兄
    ack=all时候,生产者向leader发送完数据,而副本是异步拉取的,那生产者写入线程要一直阻塞等待吗

    作者回复: 不会阻塞,你可以认为是不断轮询状态

    2019-10-11
  • Tim
    老师好,请教2个问题,感谢老师:
    1、它要比较的是Follower 副本落后 Leader 副本的时间是否超过10秒,那这个10s这个时间单位和LEO/HW这种度量单位是如何比较的呢?
    2、老师,follow副本是何时fetch一次leader的呢,多久fetch一次呢?有配置么?

    作者回复: 1. 比较follower LEO赶上leader LEO时的时间差是否超过了10s
    2. 不停地fetch,然后处理,之后再fetch。具体间隔没法配置

    2019-09-29
  • 大牛凯
    老师好,请问ISR中的副本一定可以保证和leader副本的一致性吗?如果有一种情况是某个ISR中副本与leader副本的lag在ISR判断的边界值,这时如果leader副本挂了的话,还是会有数据丢失是吗?谢谢老师

    作者回复: ISR中的follower副本非常有可能与leader不一致的。如果leader挂了,其他follower又都没有保存该消息,那么该消息是可能丢失的。如果你要避免这种情况,设置producer端的acks=all吧

    2019-09-25
  • jc9090kkk
    感谢老师的分享,对于这一章节的内容有两个疑问,希望老师能抽时间回复下:
    1.follower落后leader超过特定的时间,也就是超过replica.lag.time.max.ms的值,就会被踢出isr集合,那么这个时间差是如何算出来的,是通过LEO和HW计算出来的么?具体的计算细节能否简单介绍下?如果是落后特定的某个数据量阈值很容易理解,但是换成落后多少秒让我有点难以理解?
    2.ISR集合是动态的,如果后面发现被踢出的follower又追上leader,还会重新回归到ISR集合,这个里面有个矛盾的点,把落后的follower踢出去后,我个人的理解,这个follower不就变成僵尸副本了吗?因为它不是任何一个leader的follower了呀,哪里还有机会继续从leader那同步数据,然后再重新回归到ISR集合中去呢?麻烦老师解答下,谢谢

    作者回复: 1. 计算follower的LEO落后leader LEO的时间
    2. follower被踢出ISR不代表它有问题了,至少不表示它挂了,可能只是阶段性的落后leader。当追上后还是可以将其重新加入到ISR中的

    2019-09-23
  • miwucc
    ISR中进行选组也可能有10s的消息丢失?

    作者回复: 不会啊。

    2019-09-16
  • 樱花落花
    老师,ack=all,是保证ISR中的follower同步还是所有的follower同步,还有消费者是只能消费到ISR中的HW处的offset么?

    作者回复: acks=all保证ISR中的所有副本都要同步

    2019-09-10
  • giantbroom
    请教2个问题:
    1. 之前介绍过副本的ack设置,0,1和all,以及设置最大写入副本的数量(具体参数名忘了)。这些设置(ack为1或all)跟unclean.leader.election.enable在语义上是不是互斥的?
    2. 在设置ack为1或all的情况下,如果发生网络分区,使得ack的条件不满足,kafka会怎么处理?
    3. 在默认设置下,kafka是AP还是CP?

    作者回复: 1. 不是互斥的
    2. 目前一旦出现partitioning,Kafka无法正常工作
    3. 默认情况下是CP,即先保证一致性。不过还是那句话,CAP理论研究学习可以,用于指导分布式系统实践非常不合适。

    2019-09-04
  • Algoric
    老师,请问下leader副本所在broker挂掉,重新恢复后上线,成为follower,后面会因为与AR中的优先副本的指定不一致,重新被选为leader副本?

    作者回复: 只能说有可能,因为你可以手动触发Preferred Leader选举,Kafka默认也会定期触发

    2019-09-04
  • Geek_edc612
    kafak不会像hdfs那样自己再找个分区备份损坏磁盘副本吗?

    作者回复: 目前不会。。。

    2019-08-22
    2
  • Geek_edc612
    老师好,磁盘损坏,会造成broker宕机吗?
    2019-08-22
收起评论
45
返回
顶部