深入理解Kafka分区副本机制

news2024/11/16 9:56:56

1. Kafka集群

Kafka 使用 Zookeeper 来维护集群成员 (brokers) 的信息。每个 broker 都有一个唯一标识 `broker.id`,用于标识自己在集群中的身份,可以在配置文件 `server.properties` 中进行配置,或者由程序自动生成。下面是 Kafka brokers 集群自动创建的过程:

1)每一个 broker 启动的时候,它会在 Zookeeper 的 `/brokers/ids` 路径下创建一个 ` 临时节点 `,并将自己的 `broker.id` 写入,从而将自身注册到集群;

2)当有多个 broker 时,所有 broker 会竞争性地在 Zookeeper 上创建 `/controller` 节点,由于 Zookeeper 上的节点不会重复,所以必然只会有一个 broker 创建成功,此时该 broker 称为 controller broker。它除了具备其他 broker 的功能外,还负责管理主题分区及其副本的状态。

3)当 broker 出现宕机或者主动退出从而导致其持有的 Zookeeper 会话超时时,会触发注册在 Zookeeper 上的 watcher 事件,此时 Kafka 会进行相应的容错处理;如果宕机的是 controller broker 时,还会触发新的 controller 选举。

2. 副本机制

为了保证高可用,kafka 的分区是多副本的,如果一个副本丢失了,那么还可以从其他副本中获取分区数据。但是这要求对应副本的数据必须是完整的,这是 Kafka 数据一致性的基础,所以才需要使用 `controller broker` 来进行专门的管理。下面将详解介绍 Kafka 的副本机制。

2.1 分区和副本

Kafka 的主题被分为多个分区 ,分区是 Kafka 最基本的存储单位。每个分区可以有多个副本 (可以在创建主题时使用 ` replication-factor` 参数进行指定)。其中一个副本是首领副本 (Leader replica),所有的事件都直接发送给首领副本;其他副本是跟随者副本 (Follower replica),需要通过复制来保持与首领副本数据一致,当首领副本不可用时,其中一个跟随者副本将成为新首领。 

2.2 ISR机制

每个分区都有一个 ISR(in-sync Replica) 列表,用于维护所有同步的、可用的副本。首领副本必然是同步副本,而对于跟随者副本来说,它需要满足以下条件才能被认为是同步副本:

1)与 Zookeeper 之间有一个活跃的会话,即必须定时向 Zookeeper 发送心跳;

2) 在规定的时间内从首领副本那里低延迟地获取过消息。

如果副本不满足上面条件的话,就会被从 ISR 列表中移除,直到满足条件才会被再次加入。

这里给出一个主题创建的示例:使用 `--replication-factor` 指定副本系数为 3,创建成功后使用 `--describe ` 命令可以看到分区 0 的有 0,1,2 三个副本,且三个副本都在 ISR 列表中,其中 1 为master副本。

2.3 不完全的首领选举

对于副本机制,在 broker 级别有一个可选的配置参数 `unclean.leader.election.enable`,默认值为 fasle,代表禁止不完全的首领选举。这是针对当首领副本挂掉且 ISR 中没有其他可用副本时,是否允许某个不完全同步的副本成为首领副本,这可能会导致数据丢失或者数据不一致,在某些对数据一致性要求较高的场景 (如金融领域),这可能无法容忍的,所以其默认值为 false,如果你能够允许部分数据不一致的话,可以配置为 true。

2.4 最少同步副本

ISR 机制的另外一个相关参数是 `min.insync.replicas` , 可以在 broker 或者主题级别进行配置,代表 ISR 列表中至少要有几个可用副本。这里假设设置为 2,那么当可用副本数量小于该值时,就认为整个分区处于不可用状态。此时客户端再向分区写入数据时候就会抛出异常 

org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required

2.5 发送确认

Kafka 在生产者上有一个可选的参数 ack,该参数指定了必须要有多少个分区副本收到消息,生产者才会认为消息写入成功:

acks=0:消息发送出去就认为已经成功了,不会等待任何来自服务器的响应;

acks=1: 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应;

acks=all:只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。

3.数据请求

3.1 元数据请求机制

在所有副本中,只有领导副本才能进行消息的读写处理。由于不同分区的领导副本可能在不同的 broker 上,如果某个 broker 收到了一个分区请求,但是该分区的领导副本并不在该 broker 上,那么它就会向客户端返回一个 `Not a Leader for Partition` 的错误响应。 为了解决这个问题,Kafka 提供了元数据请求机制。

首先集群中的每个 broker 都会缓存所有主题的分区副本信息,客户端会定期发送发送元数据请求,然后将获取的元数据进行缓存。定时刷新元数据的时间间隔可以通过为客户端配置 `metadata.max.age.ms` 来进行指定。有了元数据信息后,客户端就知道了领导副本所在的 broker,之后直接将读写请求发送给对应的 broker 即可。

如果在定时请求的时间间隔内发生的分区副本的选举,则意味着原来缓存的信息可能已经过时了,此时还有可能会收到 `Not a Leader for Partition` 的错误响应,这种情况下客户端会再次求发出元数据请求,然后刷新本地缓存,之后再去正确的 broker 上执行对应的操作,过程如下图:

3.2 数据可见性

需要注意的是,并不是所有保存在分区首领上的数据都可以被客户端读取到,为了保证数据一致性,只有被所有同步副本 (ISR 中所有副本) 都保存了的数据才能被客户端读取到。

3.3 零拷贝

Kafka 所有数据的写入和读取都是通过零拷贝来实现的。传统拷贝与零拷贝的区别如下:

3.3.1传统模式下的四次拷贝与四次上下文切换

以将磁盘文件通过网络发送为例。传统模式下,一般使用如下伪代码所示的方法先将文件数据读入内存,然后通过 Socket 将内存中的数据发送出去。

buffer = File.read
Socket.send(buffer)

这一过程实际上发生了四次数据拷贝。首先通过系统调用将文件数据读入到内核态 Buffer(DMA 拷贝),然后应用程序将内存态 Buffer 数据读入到用户态 Buffer(CPU 拷贝),接着用户程序通过 Socket 发送数据时将用户态 Buffer 数据拷贝到内核态 Buffer(CPU 拷贝),最后通过 DMA 拷贝将数据拷贝到 NIC Buffer。同时,还伴随着四次上下文切换,如下图所示:

3.3.2 sendfile和transferTo实现零拷贝

Linux 2.4+ 内核通过 `sendfile` 系统调用,提供了零拷贝。数据通过 DMA 拷贝到内核态 Buffer 后,直接通过 DMA 拷贝到 NIC Buffer,无需 CPU 拷贝。这也是零拷贝这一说法的来源。除了减少数据拷贝外,因为整个读文件到网络发送由一个 `sendfile` 调用完成,整个过程只有两次上下文切换,因此大大提高了性能。零拷贝过程如下图所示:

从具体实现来看,Kafka 的数据传输通过 TransportLayer 来完成,其子类 `PlaintextTransportLayer` 的 `transferFrom` 方法通过调用 Java NIO 中 FileChannel 的 `transferTo` 方法实现零拷贝,如下所示:

@Override
public long transferFrom(FileChannel fileChannel, long position, long count) throws IOException {
    return fileChannel.transferTo(position, count, socketChannel);
}

 `transferTo` 和 `transferFrom` 并不保证一定能使用零拷贝。实际上是否能使用零拷贝与操作系统相关,如果操作系统提供 `sendfile` 这样的零拷贝系统调用,则这两个方法会通过这样的系统调用充分利用零拷贝的优势,否则并不能通过这两个方法本身实现零拷贝。

4.物理存储

4.1 分区分配

在创建主题时,Kafka 会首先决定如何在 broker 间分配分区副本,它遵循以下原则:

1) 在所有 broker 上均匀地分配分区副本;

2)确保分区的每个副本分布在不同的 broker 上;

3) 如果使用了 `broker.rack` 参数为 broker 指定了机架信息,那么会尽可能的把每个分区的副本分配到不同机架的 broker 上,以避免一个机架不可用而导致整个分区不可用。

基于以上原因,如果你在一个单节点上创建一个 3 副本的主题,通常会抛出下面的异常:

Error while executing topic command : org.apache.kafka.common.errors.InvalidReplicationFactor   
Exception: Replication factor: 3 larger than available brokers: 1.

4.2 分区数据保留规则

保留数据是 Kafka 的一个基本特性, 但是 Kafka 不会一直保留数据,也不会等到所有消费者都读取了消息之后才删除消息。相反, Kafka 为每个主题配置了数据保留期限,规定数据被删除之前可以保留多长时间,或者清理数据之前可以保留的数据量大小。分别对应以下四个参数: 

- `log.retention.bytes` :删除数据前允许的最大数据量;默认值-1,代表没有限制;

- `log.retention.ms`:保存数据文件的毫秒数,如果未设置,则使用 `log.retention.minutes` 中的值,默认为 null;

- `log.retention.minutes`:保留数据文件的分钟数,如果未设置,则使用 `log.retention.hours` 中的值,默认为 null;

- `log.retention.hours`:保留数据文件的小时数,默认值为 168,也就是一周。

因为在一个大文件里查找和删除消息是很费时的,也很容易出错,所以 Kafka 把分区分成若干个片段,当前正在写入数据的片段叫作活跃片段。活动片段永远不会被删除。如果按照默认值保留数据一周,而且每天使用一个新片段,那么你就会看到,在每天使用一个新片段的同时会删除一个最老的片段,所以大部分时间该分区会有 7 个片段存在。 

4.3 文件格式

通常保存在磁盘上的数据格式与生产者发送过来消息格式是一样的。 如果生产者发送的是压缩过的消息,那么同一个批次的消息会被压缩在一起,被当作“包装消息”进行发送 (格式如下所示) ,然后保存到磁盘上。之后消费者读取后再自己解压这个包装消息,获取每条消息的具体信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1084759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑出现msvcr120.dll文件缺少怎么办-缺少msvcr120.dll文件修复方法

电脑出现 msvcr120.dll 丢失的情况,通常是由于系统文件损坏、软件冲突、病毒感染等原因引起的。为了解决这个问题,这里提供了 6 种修复方法,以及关于 msvcr120.dll 文件的详细介绍和丢失原因。 6 种修复方法:第一:利用…

重庆建筑模板厂家有哪些?

重庆地区的建筑施工企业在寻找可靠的建筑模板供应商时,广西贵港市能强优品木业是一个备受推崇的选择。作为建筑模板生产的优秀供应商之一,能强优品木业不仅能提供高质量的建筑模板,还可提供整车物流包运输,并将货物发货至重庆各地…

《持续交付:发布可靠软件的系统方法》- 读书笔记(一)

持续交付:发布可靠软件的系统方法(一) 第一章 软件交付的问题1.1 引言1.2 一些常见的发布反模式1.2.1 反模式:手工部署软件1.2.2 反模式:开发完成之后才向类生产环境部署1.2.3 反模式:生产环境的手工配置管…

### Cause: dm.jdbc.driver.DMException: 第 9 行, 第 85 列[is]附近出现错误: 语法分析出错

问题出现 (case when pcf.CONTRACTS_DURATION_UNITS || pcf.CONTRACTS_DURATION_UNITS is null then null else M end)contractsDurationUnits,(case when pcf.CONTRACTS_DURATION_UNITS_NAME || pcf.CONTRACTS_DURATION_UNITS_NAME is null then null else 月 end)contrac…

如何公网远程访问本地群晖NAS File Station文件夹

公网环境下如何内网穿透读写群晖NAS文件? File Station 是 群晖Synology NAS 的集中化文件管理工具。我们可以在局域网内登陆nas web界面通过 File Station管理群晖nas中的文件,如果我们在户外,有读写家中群晖nas中文件的需求怎么办&#xf…

表单类组件封装v-model简化代码

表单类组件封装&v-model简化代码 创建 工程: H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day04\准备代码\11-封装表单类组件 vue --ver…

Jetson Orin NX 开发指南(7): EGO-Swarm 的编译与运行

一、前言 EGO-Planner 浙江大学 FAST-LAB 实验室的开源轨迹规划算法是,受到 IEEE Spectrum 等知名科技媒体的报道,其理论技术较为前沿,是一种不依赖于ESDF,基于B样条的规划算法,并且规划成功率、算法消耗时间、代价数…

vsCode 忽略 文件上传

1 无 .gitignore 文件时,在项目文件右键,Git Bash 进入命令行 输入 touch .gitignore 生成gitignore文件 2 、在文件.gitignore里输入 node_modules/ dist/ 来自于:vscode git提交代码忽略node_modules_老妖zZ的博客-CSDN博客

js获取当前时间

// 格式化日对象 (获取当前时间) export function timeFormat() {var date new Date();var sign2 ":";var year date.getFullYear(); // 年var month date.getMonth() 1; // 月var day date.getDate(); // 日var hour date.getHours(); // 时var minutes dat…

consumer罢工,几千万条im聊天数据积压在MQ中,解决思路

最近遇到一个线上问题,consumer出问题了,导致几千万条im聊天数据积压在MQ中几个小时,从下午五点多,积压到晚上十二点多。 遇到这种事一种解决办法是,修复consumer,让它慢慢消费。这样搞的话展示不了实力。 …

【虹科干货】来抄作业!用Redis VSS,让大语言模型更懂你

好沮丧,大语言模型不懂我怎么办, 怎么也搜不到想要的答案(ㄒoㄒ) 当当当当,Redis VSS闪亮登场,不必微调模型, 也能轻松驾驭大语言,快速解答你的疑虑,满足你 的求知欲,你的AI好伙伴&a…

代码随想录算法训练营第六十二天 |503.下一个更大元素II、42. 接雨水

一、503.下一个更大元素II 题目链接/文章讲解:代码随想录 思考:关于单调栈的处理在题解739. 每日温度中已经出现过了,剩下的是如何处理循环数组 比较直白的方法是 将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最…

K8S:Rancher管理 Kubernetes 集群

文章目录 一.Rancher 简介1.Rancher概念2.Rancher 和 k8s 的区别 二.Rancher 安装及配置1.安装 rancher2.登录 Rancher 平台3.Rancher 管理已存在的 k8s 集群4.Rancher 部署监控系统5.使用 Rancher 仪表盘管理 k8s 集群 三.拓展1.Rancher和kubesphere相比较2.K3S和K8S相比较 一…

高德地图获取行政区域并且获取经纬度

我们的需求是获取行政图的切片图&#xff0c;需要四个角的经纬度代码如下 <!doctype html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

Acer宏碁掠夺者战斧700笔记本PH717-71原装出厂Win10系统1903工厂模式镜像

宏基原厂系统自带所有驱动、PREORTOR风扇键盘控制中心、Office办公软件、出厂主题壁纸、系统属性Acer宏基专属的LOGO标志、 Acer Care Center、Quick Access等预装程序 下载链接&#xff1a;https://pan.baidu.com/s/1s-I5vLihXBqdEmtd9MOZxQ?pwdnfku 所需要工具&#xff1a…

TSINGSEE青犀视频AI分析/边缘计算/AI算法·厨师帽检测功能——多场景高效运用

在餐饮厂房等场景中&#xff0c;为保障食品安全与卫生&#xff0c;后厨操作人员规范着装要求是必不可少的。由于后厨温度较高&#xff0c;环境较为恶劣&#xff0c;很多后厨人员为自身方便不按照规定佩戴厨师帽和着厨师服&#xff0c;为切实解决此问题&#xff0c;TSINGSEE青犀…

迅镭激光GI系列高功率激光切割机成功中标覆铜板龙头企业HZ公司

新材料被称为“发明之母”和“产业粮食”&#xff0c;是现代科技发展的基础&#xff0c;和信息技术、生物技术一起并称为最重要和最具发展潜力的三大领域&#xff0c;它是我国先进制造业发展的支撑和保障&#xff0c;对推动技术创新、促进制造业优化升级、保障国家安全等具有重…

选C4D还是Blender?新手设计师不容错过的全面比较

&#xfeff;近年来&#xff0c;随着3D设计行业的不断发展&#xff0c;可供设计师使用的软件也越来越多。设计师们在选择合适的3D软件时感到难以抉择。在3D建模和动画制作领域&#xff0c;Blender和Cinema 4D (简称C4D)都是备受赞誉的软件。那么&#xff0c;到底哪个软件更适合…

亚马逊美国站加拿大站儿童自行车合规标准是什么?如何办理?需要那些信息?

亚马逊美国站儿童自行车 儿童自行车是一种后轮完全由人力驱动&#xff0c;同时座椅高度不超过 25 英寸的两轮车&#xff0c;也可以是专为 12 岁或以下儿童设计或供其使用的自行车。 此政策不适用于仅根据个人订单要求制造&#xff0c;而未经过库存零件或生产零件装配流程的自…

接口性能测试方案

01 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始&#xff0c;到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点再可以细分&#xff0c;如对于一个 C/S 软件的响应时间可以细分为网络传输时间、应用服务器处理时间、数据库服务器处理时…