Kafka副本备份机制(LEO,HW,leader epoch)

Kafka 0.11版本之前水印副本备份机制

img

步骤:

  • 初始leader,follower参数都为0,其中leader中的remote LEO记录的是follower的LEO

  • 生产者发送消息m1到leader中,更新leader的LEO为1

  • follower fetch leader,follower写入日志,更新follwer的LEO为1

  • follower再次fetch leader,leader接受到以后,更新leader中的remote LEO为1,并更新HW(取leader中的LEO,remote LEO 最小值)为1,

    follower获取fetch返回信息,leader的HW为1,更新follower自身的HW为1。

更新HW,需要额外的一轮fetch rpc请求。

水印备份机制缺陷

数据丢失

img

数据不一致/离散

img

造成上述两个问题的根本原因在于HW值被用于衡量副本备份的成功与否,但HW值的更新是异步延迟的,特别是需要额外的FETCH请求处理流程才能更新,故这中间发生的任何崩溃都可能导致HW值的过期。鉴于这些原因,Kafka 0.11引入了leader epoch来取代HW值。

leader epoch

Kafka 引入了 leader epoch 机制,在每个副本日志目录下都创建一个 leader-epoch-checkpoint 文件,用于保存 leader 的 epoch 信息,如下,leader epoch 长这样:

img

它的格式为 (epoch offset),epoch指的是 leader 版本,它是一个单调递增的一个正整数值,每次 leader 变更,epoch 版本都会 +1,offset 是每一代 leader 写入的第一条消息的位移值,比如:

(0, 0)
(1, 300)

以上第二个版本是从位移300开始写入消息,意味着第一个版本写入了 0-299 的消息。

leader epoch工作机制

1)当副本成为 leader 时:

这时,如果此时生产者有新消息发送过来,会首先新的 leader epoch 以及 LEO 添加到 leader-epoch-checkpoint 文件中。

2)当副本变成 follower 时:

  1. 发送 LeaderEpochRequest 请求给 leader 副本,该请求包括了 follower 中最新的 epoch 版本;
  2. leader 返回给 follower 的相应中包含了一个 LastOffset,如果 follower last epoch = leader last epoch,则 LastOffset = leader LEO,否则取大于 follower last epoch 中最小的 leader epoch 的 start offset 值,举个例子:假设 follower last epoch = 1,此时 leader 有 (1, 20) (2, 80) (3, 120),则 LastOffset = 80;
  3. follower 拿到 LastOffset 之后,会对比当前 LEO 值是否大于 LastOffset,如果当前 LEO 大于 LastOffset,则从 LastOffset 截断日志;
  4. follower 开始发送 fetch 请求给 leader 保持消息同步。

解决数据丢失

img

解决数据不一致/离散

img

参考

Kafka水位(high watermark)与leader epoch的讨论

图解 Kafka 水印备份机制

Kafka ISR 副本同步机制

原文地址:http://www.cnblogs.com/hongdada/p/16918984.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性