Kafka---复制

Kafka文档中,把自己描述成"一个分布式的,可分区的,可复制的提交日志服务"。其中非常重要的一部分就是副本机制---

Replication。它能提供数据冗余---即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。

所谓副本(Replica),本质就是一个只能追加写消息的提交日志。Kafka使用主题来组织数据,每个主题可以被分为若干个分区,每个分区有多个副本。这些副本都会保存在broker上。每个broker可以保存成百上千个不同主题和分区的副本,从而能够对抗部分 Broker 宕机带来的数据不可用。

分区分配

在创建主题时,Kafka首先会决定在broker间分配分区。假如你有6个broker,创建一个包含10个分区的topic,且复制系数为3。那么Kafka就会有30个分区副本。他们会分配给6个broker,却遵守下面的规则。

  • broker会平均的分布分区副本。上面的例子中,每个broke会平均分配到5个分区。
  • 确保每个分区的每个副本在不同的broker上。假如分区0的leader副本在broker上,那么可以吧follwer副本放在broker3和broker4上。但不能放在broker2上,也不能把2个副本放在同一个broker上。

接下来我们来看一张图,它展示的是一个有 3 台 Broker 的 Kafka 集群上的副本分布情况。从这张图中,我们可以看到,主题 1 分区 0 的 3 个副本分散在 3 台 Broker 上,其他主题分区的副本也都散落在不同的 Broker 上,从而实现数据冗余。

 

副本角色

  • 首领副本(Leader)
    • 每一个分区都有一个首领副本。为了保证一致性,所以生产者请求和消费者请求都会经过这个副本。
  • 跟随者副本(follower)
    • 首领以外的副本都是跟随者副本。跟随者副本不响应任何外接的请求(消费者和发送者的读写请求)。换句话来说说,所以的读写请求都在首领副本所在的broker中发生,更随着副本只负责在首领副本中异步拉去消息,从而实现跟随者副本和领导者副本的同步。

如果某个首领副本所在的broker挂了,zookeeper会感知到,开启新的一轮选举,会选一个最新的跟随者副本作为领导者副本。当之前的老领导者副本恢复了,会作为一个跟随者副本继续工作。

 

要注意上面所说的。为什么跟随者副本不响应任何对外的请求,这是有一定的原因的。

  • 方便实现“Read-your-writes
    • 当消费者api实现在Kafka中写入一条消息。消费者api可以快速的去消费。由于跟随者副本是异步同步的,如果想从跟随者副本中消费的话,会有一定的延时。
  • 方便实现单调读(Monotonic Read)
    • 什么是单调读呢?就是对于一个消费者用户而言,在多次消费消息时,它不会看到某条消息一会儿存在一会儿不存在。比如有2个副本去拉去领导者副本,由于是异步同步,存在了不能于领导者副本同步的存在。有可能就会看到一条消息第一次是存在的,第二次消费的时候它却不在了。这就不是单调读一致性。但是,如果所有的读请求都是由 Leader 来处理,那么 Kafka 就很容易实现单调读一致性。
    •  

同步副本In-sync Replicas(ISR)

Kafka的跟随者副本会不定期的异步同步领导者的信息,那必然会存在不能于Kafka领导者同步的风险,那么什么的情况才能算副本同步?可以看一下下面的图

 

图中有3个副本,其中Follower1 和Follower2 是跟随者副本,Leader是领导者副本。同一时刻,Follower1同步了6条消息,而Follower2只同步了3条消息,大家一眼都会觉得Follower2与Leader不同步。

其实这2个跟随者副本都与领导者副本同步。这个标准就是 Broker 端参数 replica.lag.time.max.ms 参数值。这个参数的含义是 Follower 副本能够落后 Leader 副本的最长时间间隔,当前默认值是 10 秒。这就是说,只要一个 Follower 副本落后 Leader 副本的时间不连续超过 10 秒,那么 Kafka 就认为该 Follower 副本与 Leader 是同步的,即使此时 Follower 副本中保存的消息明显少于 Leader 副本中的消息。

 我们在前面说过,Follower 副本唯一的工作就是不断地从 Leader 副本拉取消息,然后写入到自己的提交日志中。如果这个同步过程的速度持续慢于 Leader 副本的消息写入速度,那么在 replica.lag.time.max.ms 时间后,此 Follower 副本就会被认为是与 Leader 副本不同步的,因此不能再放入 ISR 中。此时,Kafka 会自动收缩 ISR 集合,将该副本“踢出”ISR。  值得注意的是,倘若该副本后面慢慢地追上了 Leader 的进度,那么它是能够重新被加回 ISR 的。这也表明,ISR 是一个动态调整的集合,而非静态不变的

摘自Kafka权威指南Kafka核心技术与实战

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值