kafka集群是如何选择leader,你知道吗?

news2024/11/20 7:29:31

前言

kafka集群是由多个broker节点组成,这里面包含了许多的知识点,以下的这些问题你都知道吗?

  • 你知道topic的分区leader是怎么选举的吗?
  • 你知道zookeeper中存储了kafka的什么信息吗?起到什么做呢?
  • 你知道kafka消息文件是怎么存储的吗?
  • 如果kafkaleader节点或者follower节点发生故障,消息会丢失吗?如何保证消息的一致性和可靠性呢?

如果你对这些问题比较模糊的话,那么很有必要看看本文,去了解以下kafka的核心设计,本文主要基于kafka3.x版本讲解。

kafka broker核心机制

kafka集群整体架构

kafka集群是由多个kafka broker通过连同一个zookeeper组成,那么他们是如何协同工作对外提供服务的呢?zookeeper中又存储了什么信息呢?

  1. kafka broker启动后,会在zookeeper/brokers/ids路径下注册。
  2. 同时,其中一个broker会被选举为控制器(Kafka Controller)。选举规则也很简单,谁先注册到zookeeper中的/controller节点,谁就是控制器。Controller主要负责管理整个集群中所有分区和副本的状态
  3. Kafka Controller会进行Leader选择,比如上图中针对TopicA中的0号分区,选择broker0作为Leader, 然后会将选择的节点信息注册到zookeeper/brokers/topics路径下,记录谁是Leader,有哪些服务器可用。
  4. 被选举为Leadertopic分区提供对外的读写服务。为什么只有Leader节点提供读写服务,而不是设计成主从方式,Follower提供读服务呢?
  • 为了保证数据的一致性,因为消息同步延迟,可能导致消费者从不同节点读取导致不一致。
  • kafka设计目的是分布式日志系统,不是一个读多写少的场景,kafka的读写基本是对等的。
  • 主从方式的话带来设计上的复杂度。

kafka leader选举机制

那么问题来了,kafkatopic分区是如何选择leader的呢?为了更好的阐述,我们先来理解下面3个概念。

  • ISR:表示和 Leader 保持同步的 Follower 集合。如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR。该时间阈值由replica.lag.time.max.ms参数设定,默认 30sLeader 发生故障之后,就会从 ISR 中选举新的Leader
  • OSR:表示 Follower 与 Leader 副本同步时,延迟过多的副本。
  • AR: 指的是分区中的所有副本,所以AR = ISR + OSR

Kafka Controller选举Leader的规则:在isr队列中存活为前提,按照AR中排在前面的优先。例如ar[1,0,2]isr [1,0,2],那么leader就会按照1,0,2的顺序轮询。而AR中的这个顺序kafka会进行打散,分摊kafka broker的压力。

当运行中的控制器突然宕机或意外终止时,Kafka 通过监听zookeeper能够快速地感知到,并立即启用备用控制器来代替之前失败的控制器。这个过程就被称为 Failover,该过程是自动完成的,无需你手动干预。

开始的时候,Broker 0 是控制器。当 Broker 0 宕机后,ZooKeeper 通过`` Watch 机制感知到并删除了 /controller 临时节点。之后,所有存活的 Broker 开始竞选新的控制器身份。Broker 3最终赢得了选举,成功地在 ZooKeeper 上重建了 /controller 节点。之后,Broker 3 会从 ZooKeeper 中读取集群元数据信息,并初始化到自己的缓存中,后面就有Broker 3来接管选择Leader的功能了。

Leader 和 Follower 故障处理机制

如果topic分区的leaderfollower发生了故障,那么对于数据的一致性和可靠性会有什么样的影响呢?

  • LEO(Log End Offset):每个副本的最后一个offsetLEO就是最新的offset + 1。
  • HW(High Watermark):水位线,所有副本中最小的LEO ,消费者只能看到这个水位线左边的消息,从而保证数据的一致性。

上图所示,如果follower发生故障怎么办?

  • Follower发生故障后会被临时踢出ISR队列。
  • 这个期间LeaderFollower继续接收数据。
  • 待该Follower恢复后,Follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向Leader进行同步。
  • 等该FollowerLEO大于等于该PartitionHW,即Follower追上Leader之后,就可以重新加入ISR了。

如果leader发生故障怎么办?

  • Leader发生故障之后,会从ISR中选出一个新的Leader
  • 为保证多个副本之间的数据一致性,其余的Follower会先将各自的log文件高于HW的部分截掉,然后从新的Leader同步数据。

所以为了让kafka broker保证消息的可靠性和一致性,我们要做如下的配置:

  • 设置 生产者producer 的配置acks=all或者-1。leader 在返回确认或错误响应之前,会等待所有副本收到悄息,需要配合min.insync.replicas配置使用。这样就意味着leaderfollowerLEO对齐。
  • 设置topic 的配置replication.factor>=3副本大于3个,并且 min.insync.replicas>=2表示至少两个副本应答。
  • 设置broker配置unclean.leader.election.enable=false,默认也是false,表示不对落后leader很多的follower也就是非ISR队列中的副本选择为Leader, 这样可以避免数据丢失和数据 不一致,但是可用性会降低。

Leader Partition 负载平衡

正常情况下,Kafka本身会自动把Leader Partition均匀分散在各个机器上,来保证每台机器的读写吞吐量都是均匀的。但是如果某些broker宕机,会导致Leader Partition过于集中在其他少部分几台broker上,这会导致少数几台broker的读写请求压力过高,其他宕机的broker重启之后都是follower partition,读写请求很低,造成集群负载不均衡。那么该如何负载平衡呢?

  1. 自动负载均衡

通过broker配置设置自动负载均衡。

  • auto.leader.rebalance.enable:默认是 true。 自动 Leader Partition 平衡。生产环境中,leader 重选举的代价比较大,可能会带来性能影响,建议设置为 false 关闭。
  • leader.imbalance.per.broker.percentage:默认是 10%。每个 broker 允许的不平衡的 leader的比率。如果每个 broker 超过了这个值,控制器会触发 leader 的平衡。
  • leader.imbalance.check.interval.seconds:默认值 300 秒。检查 leader 负载是否平衡的间隔时间。
  1. 手动负载均衡
  • 对所有topic进行负载均衡
./bin/kafka-preferred-replica-election.sh --zookeeper hadoop16:2181,hadoop17:2181,hadoop18:2181/kafka08
  • 对指定topic负载均衡
cat topicPartitionList.json

{

 "partitions":

  [

    {"topic":"test.example","partition": "0"}

  ]

}
./bin/kafka-preferred-replica-election.sh --zookeeper hadoop16:2181,hadoop17:2181,hadoop18:2181/kafka08 --path-to-json-file topicPartitionList.json

kafka的存储机制

kafka消息最终会存储到磁盘文件中,那么是如何存储的呢?清理策略是什么呢?

一个topic分为多个partition,每个partition对应于一个log文件,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,每个partition分为多个segment。每个segment包括:“.index”文件、“.log”文件和.timeindex等文件,Producer生产的数据会被不断追加到该log文件末端。

上图中t1即为一个topic的名称,而“t1-0/t1-1”则表明这个目录是t1这个topic的哪个partition

kafka中的索引文件以稀疏索引(sparseindex)的方式构造消息的索引,如下图所示:

1.根据目标offset定位segment文件

2.找到小于等于目标offset的最大offset对应的索引项

3.定位到log文件

4.向下遍历找到目标Record

注意:index为稀疏索引,大约每往log文件写入4kb数据,会往index文件写入一条索引。通过参数log.index.interval.bytes控制,默认4kb

那kafka中磁盘文件保存多久呢?

kafka 中默认的日志保存时间为 7 天,可以通过调整如下参数修改保存时间。

  • log.retention.hours,最低优先级小时,默认 7 天。
  • log.retention.minutes,分钟。
  • log.retention.ms,最高优先级毫秒。
  • log.retention.check.interval.ms,负责设置检查周期,默认 5 分钟。

kafka broker重要参数

前面讲解了kafka broker中的核心机制,我们再来看下重要的配置参数。

首先来说下kafka服务端配置属性Update Mode的作用:

  • read-only。被标记为read-only 的参数和原来的参数行为一样,只有重启 Broker,才能令修改生效。
  • per-broker。被标记为 per-broker 的参数属于动态参数,修改它之后,无需重启就会在对应的 broker 上生效。
  • cluster-wide。被标记为 cluster-wide 的参数也属于动态参数,修改它之后,会在整个集群范围内生效,也就是说,对所有 broker 都生效。也可以为具体的 broker 修改cluster-wide 参数。

Broker重要参数

参数名称描述
replica.lag.time.max.msISR 中,如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR。该时间阈值,默认 30s。
auto.leader.rebalance.enable默认是 true。 自动 Leader Partition 平衡。
leader.imbalance.per.broker.percentage默认是 10%。每个 broker 允许的不平衡的 leader的比率。如果每个 broker 超过了这个值,控制器会触发 leader 的平衡。
leader.imbalance.check.interval.seconds默认值 300 秒。检查 leader 负载是否平衡的间隔时间。
log.segment.bytesKafka 中 log 日志是分成一块块存储的,此配置是指 log 日志划分 成块的大小,默认值 1G。
log.index.interval.bytes默认 4kb,kafka 里面每当写入了 4kb 大小的日志(.log),然后就往 index 文件里面记录一个索引。
log.retention.hoursKafka 中数据保存的时间,默认 7 天。
log.retention.minutesKafka 中数据保存的时间,分钟级别,默认关闭。
log.retention.msKafka 中数据保存的时间,毫秒级别,默认关闭。
log.retention.check.interval.ms检查数据是否保存超时的间隔,默认是 5 分钟。
log.retention.bytes默认等于-1,表示无穷大。超过设置的所有日志总大小,删除最早的 segment。
log.cleanup.policy默认是 delete,表示所有数据启用删除策略;如果设置值为 compact,表示所有数据启用压缩策略。
num.io.threads默认是 8。负责写磁盘的线程数。整个参数值要占总核数的 50%。
num.replica.fetchers副本拉取线程数,这个参数占总核数的 50%的 1/3
num.network.threads默认是 3。数据传输线程数,这个参数占总核数的50%的 2/3 。
log.flush.interval.messages强制页缓存刷写到磁盘的条数,默认是 long 的最大值,9223372036854775807。一般不建议修改,交给系统自己管理。
log.flush.interval.ms每隔多久,刷数据到磁盘,默认是 null。一般不建议修改,交给系统自己管理。

总结

Kafka集群的分区多副本架构是 Kafka 可靠性保证的核心,把消息写入多个副本可以使 Kafka 在发生崩溃时仍能保证消息的持久性。本文围绕这样的核心架构讲解了其中的一些核心机制,包括Leader的选举、消息的存储机制等等。 

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

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

相关文章

【精彩回顾】 用sCrypt在Bitcoin上构建智能合约

2023年3月24日,sCrypt在英国Exeter大学举办了关于智能合约的大学讲学。sCrypt首席执行官刘晓晖做了题为“用sCrypt在Bitcoin上构建智能合约”的演讲,并与到场的老师、学生进行了深入交流、互动。这次课程着重讲解了 BSV 智能合约的基础概念,以…

一图读懂「五度易链」企业创新服务解决方案,打造卓越营商环境!

“五度易链”紧密围绕园区企业及产业发展需求,基于数据积累和应用,创新企业服务机制,提升企业服务效能,以数字化手段为企业发展纾困解难,赋能企业高质量发展。并帮助园区在运营方面打破数据壁垒,实现数据监…

调度算法+等待/周转时间计算

周转时间 作业完成时刻 - 到达时刻 等待时间 开始时刻 - 到达时刻 平均时间就是用总时间除以作业个数 先来先服务调度算法(FCFS) 非抢占 优先级调度算法 系统总是调度优先级最高的那个进程运行。 优先级可以分为静态优先级和动态优先级。静态优先…

113. 路径总和ii

力扣题目链接(opens new window) 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树,以及目标和 sum 22, 在路径总和题目的基础上&…

新媒体运营的未来:ChatGPT的智能助手

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 新媒体运营是数字时代的…

Java括号匹配

目录 一、题目描述 二、题解 一、题目描述 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭…

LwIP笔记01:LwIP入门

1. LwIP简介 小型开源的TCP/IP协议栈交换机、路由器、光纤收发器、云台接入、无线网关、远程模块、工业控制器、网络摄像头 TCP/IP模型 (1)应用层:HTTP、MQTT、NTP、FTP、...... (2)传输层:TCP、UDP &…

【kubernetes】【基础资源使用】kubernetes中的Deployment使用

1 Why need Deployment? K8S中Pod是用户管理工作负载的基本单位,Pod通常通过Service进行暴露,因此,通常需要管理一组Pod,RC和RS主要就实现了一组Pod的管理工作,其中,RC和RS的区别在于,RS提供更…

如何使用pycharm连接Mysql数据库!!!

1、Mysql的安装: MySQL针对不同的用户提供了2中不同的版本: MySQL Community Server:社区版。由MySQL开源社区开发者和爱好者提供技术支持,对开发者开放源代码并提供免费下载。MySQL Enterprise Server:企业版。包括最…

新手程序员怎么接单?

程序员如何在自己年富力强的时候,最大化发挥自己的能力?将超能力转化为“钞能力”? 有人还在苦哈哈当老黄牛,一身使不完的牛劲,有人已经另辟蹊径,开创了自己的一片致富小天地。 接单找兼职,就…

MyBatis-Plus多数据源——如何在一个项目中使用多个MySQL数据库

前言 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 本系列博客结合实际应用场景,阐述MyBatis-Plus实际…

小程序中如何同步公众号的文章

小程序为了更好的服务客户,有时候需要显示公众号的文章,用于更具体介绍产品、关注公众号和会员服务等。下面就将具体介绍:小程序中如何同步显示公众号的文章。 1. 关联公众号。在管理员后台->会员管理->通知处,关联服务号。…

【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作

文章目录 HDFS目录与文件的创建删除与查询操作一、实验目标二、实验要求三、实验内容四、实验步骤附:系列文章 HDFS目录与文件的创建删除与查询操作 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS目录与文件的创建方法和文件写入到HDFS文件的方法…

软件测试工作步骤详情

软件测试步骤按照研发阶段一般分为5个部分:单元测试、集成测试、确认测试、系统测试、验收测试,下面将不同阶段需要的一些工作内容做一下梳理希望可以帮助到大家。 一、单元测试的内容:(白盒为主,黑盒为辅)…

业务安全情报23期 | 国庆前夕,又成功狙击一个倒卖机票的不法团伙

中秋国庆临近,热门航线机票预定量暴增。顶象防御云业务安全情报中心,监测到一个不法团伙进行虚假占座攻击,倒卖热门航班机票。在顶象协助下,该航空公司有效阻截多日的攻击,保障乘客购票利益。 热门航班遭到“倒票”攻击…

IPV6知识总结

目录 一、IPV6与IPV4相比改进之处1. “无限“的地址空间2. 层次化的地址结构3. 即插即用4. 简化了报头头部5.保证端到端网络的完整性6.安全性增强7.增强QoS特性 二、IPV6的规则IPV6地址主要分为了三类:单播地址,组播地址,任播地址单播地址组播…

基于低代码平台少量编码完成软件开发

一、低代码平台是什么 低代码平台简单来说就是只需要少量代码、甚至无需代码即可完成系统开发。 过去开发一套系统都需要软件工程师通过代码进行开发,所以任何一个系统的开发都需要大量的软件工程师资源,使得很多企业谈到系统开发就想到了高额的成本投入…

【MySQL数据库】基本命令操作及语句总结

目录 前言 一、数据库连接 二、创建数据库 2.1 创建数据库 2.2 删除数据库 2.3 查看数据库 2.4 使用数据库 三、创建数据表 3.1 创建数据表 3.2 删除数据表 3.3 插入语句 3.4 查看数据表 四、数据库操作 4.1 显示列 4.2 显示索引 4.3 修改表名 4.4 修改数据类…

CPK分析工具页面设计源码

效果图: 父组件 <template><div class="app-container home"><!-- <el-divider />--><el-rowtype="flex"justify="space-around"class="row-bg"style="margin-bottom: 10px"><el-col…

uni-app 之 Toast 消息提示

uni-app 之 Toast 消息提示 image.png <template> <view class"content"> <u-button click"showToast">Toast 消息提示 </u-button><u-toast ref"uToast"></u-toast></view></template> <…