Kafka副本与ISR设计(I)

Stella981
• 阅读 453

在Kafka中一个分区日志其实就是一个备份日志,kafka利用多个相同备份日志来提高系统的可用性。这些备份日志其实就是所谓的副本。

Kafka的副本具有leader副本和follower副本之分,leader副本为客户端提供读写请求,follower副本只是用于被动地从leader副本中同步数据,对外不提供读写服务。

Kafka的所有节点所有副本假设都在正常运行,那么leader副本会一直不变,但是所谓世界上没有绝对稳定的系统,一旦kafa的leader副本节点出现了问题,那么follower副本需要竞争上岗成为leader副本,但是并不是所有的follower副本都有资格竞争上岗,很明显假设一个follower落后的数据远远少于leader副本,它是没有资格的。因此Kafka内部维护了一组具有资格的follower副本,他们统称ISR。

ISR中的副本会被剔除,也会有新增。

关键的概念点

下图主要讲述了Kafka日志中重要概念,下图的相关概念事关生产、消息消费、ISR以及副本同步机制。Kafka副本与ISR设计(I)

  • 首条消息位移(offset):保存了该副本中所含的第一条消息的offset

  • 日志高水印值(HW):leader副本的HW决定了消费者所能消费的消息范围,低于等于HW的消息均可被消费者消费

  • 结束位移(LEO):LEO总是指向下一条消息写入的位置,处在leader的HW和LEO之间的消息表示还未完全备份。只有所有处于ISR中副本都更新了自己LEO以后,leader的HW才会右移表示写入消息成功。

ISR

ISR其实就是Kafka内部维护的具有竞争上岗的一组与leader同步follower的副本集合。

follower副本与leader副本不同步的原因:

  • 同步数据请求速度追不上:follower副本在一段时间无法追上leader副本端的消息接收速度。比如follower副本的网络I/O阻塞,这会导致follower副本同步leader副本的速度大大降低

  • 进程卡住:follower副本一段时间无法向leader发出请求,比如follower频繁的进行GC

  • 新创建的副本:用户主动增加副本数,新创建的副本在启动后会追赶leader的进度,这段时间新增的follower副本通常与leader副本是不同步的

replica.lag.max.messages

该参数用来检测同步数据请求速度追不上的问题,如果ISR中的副本消息数落后于leader副本的消息数超过了该参数的设置,将会被踢出ISR。

这个参数在kafka0.9.0.9版本之后被移除,为什么被移除呢?

肯定是有他的弊端的。考虑以下这个情况,kafka在的生产者的生产速率不是平稳的,会有高峰会有低峰,在高峰的时候,由于消息大量聚集产生,导致ISR中的消息与Leader的消息差超过了该数值,因此ISR中的副本将会被踢出。

但随着生产消息速率的稳定和下降,并且此时follower副本也在全力追赶leader副本,当follower副本重新追上leader副本时,又会重新加入ISR。

replica.lag.max.ms

该参数用来检测另两种情况:如果在该时间内,follower副本无法向leader副本请求数据,那么将会被踢出ISR。

由于在新的版本中移除了replica.lag.max.messages参数的设置,因此replica.lag.max.ms也用于同步数据请求速度追不上问题的检测,但用在次问题的检测上时,检测机制是只要follower副本落后于leader的时间不持续性超过该参数即视为同步,如果持续性超过该参数即视为不同步。

本文分享自微信公众号 - shysh95(shysh95)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
MongoDB 删除,添加副本集,并修改副本集IP等信息
MongoDB删除,添加副本集,并修改副本集IP等信息添加副本,在登录到主节点下输入rs.add("ip:port");删除副本rs.remove("ip:port");新增仲裁节点rs.addArb("ip:port");修改副本host:shard1:PRIMARYcfgrs.c
可莉 可莉
2年前
10 道 Kafka 基础面试,不看答案你会几道题
写在前面这次给大家分享的是Kafka的10道面试题,就难度我觉得是比较基础的,但考的知识点还比较全面,可以用来考察自己掌握Kafka基础的程度。1\.Kafka是什么?Kafka起初是一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被定位为一个分布
Wesley13 Wesley13
2年前
MongoDB 副本集之入门篇
前言:mongodb因为高性能、高可用性、支持分片等特性,作为非关系型数据库被大家广泛使用。其高可用性主要是体现在mongodb的副本集上面(可以简单理解为一主多从的集群),本篇文章主要从副本集介绍、本地搭建副本集、副本集读写数据这三个方面来带大家认识下mongodb副本集。一、mongodb副本集介绍—
Stella981 Stella981
2年前
Kafka介绍
最近公司项目中做了一个两个oracle数据库数据进行数据实时同步的功能,由于数据量和环境的因素,开发人员采用了kafka做为消息中间件来转发数据,笔者就进行了kafka的学习,记录了下面的文档,望大家多多指教,共同学习进步。一、   Kafka介绍  Kafka是由Java和Scala编写的是一个分布式、高吞吐量、分区的、多副本的、多订阅者
Stella981 Stella981
2年前
K8s无状态控制器原理介绍
Pod控制器:  ReplicationController:早期K8s只有这一个控制器,但后来发现让这一个来完成所有任务,太复杂.因此被废弃.  ReplicaSet:它用于帮助用户创建指定数量的Pod副本,并确保Pod副本数量一直满足用户期望的副本数量。        副本数量"多退少补"等机制。【它可认为就是Repli
Stella981 Stella981
2年前
Kafka 原理详解
Kafka原理详解1kakfa基础概念说明Broker:消息服务器,就是我们部署的一个kafka服务Partition:消息的水平分区,一个Topic可以有多个分区,这样实现了消息的无限量存储Replica:消息的副本,即备份消息,存储在其他的broker上,当leader挂掉
Wesley13 Wesley13
2年前
MySQL8.0.19 禁用Binlog,保留副本上的提交顺序
作者:HemantDangi译:徐轶韬MySQL8.0.19引入了无Binlog副本(保留事务提交顺序),这意味着用户可以在不启用二进制日志的情况下部署异步副本,并保留相同的顺序提交事务。用户可以禁用Binlog(skiplogbin)和回放线程产生的日志(logslaveupdatesFALSE)进行的更改,同时保留相同提交
Stella981 Stella981
2年前
Kafka文件存储机制那些事
Kafka是什么Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。1.前言一个商
京东云开发者 京东云开发者
5个月前
Kafka基本原理、生产问题总结及性能优化实践 | 京东云技术团队
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统
京东云开发者 京东云开发者
4个月前
Kafka核心逻辑介绍 | 京东云技术团队
1、概念Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica)分布式消息系统(kafka2.8.0版本之后接触了对zk的依赖,使用自己的kRaft做集群管理,新增内部主体@metadata存储