Kafka broker

1. zk中存储的kafka信息

/kafka/brokers/ids存储了在线的broker id。

/kafka/brokers/topics/xxx/partitions/n/state存储了Leader是谁以及isr队列

 /kafka/controller辅助Leader选举,每个broker都有一个controller,谁先在zk中注册上,谁就辅助Leader选举。

2. broker总体工作流程

1)每台broker启动后在zk中注册,即/kafka/borkers/ids

2)每台broker去抢占式注册controller,用于后面Leader选举

3)由注册的controller监听/kafka/borkers/ids节点变化

4)开始Leader选举,选举标准是以isr中存活为前提,以AR中排在前面的优先(AR是所有副本的集合,启动时会有一个固定的AR顺序,比如ar[1, 0, 2])

5)controller将选举出来的信息(Leader和isr信息)传到zk中,即/kafka/brokers/topics/xxx/partitions/n/state

6)其他broker的controller会从zk中同步相关信息

Kafka生产者发送数据到broker,数据在底层以Log方式(逻辑概念)存储,实际上是Segment(物理概念),一般1个Segment是1G,包含.log文件和.index文件,.index文件是索引,用于快速查询数据

7)如果Leader挂了,controller监听到节点变化,选举新的Leader,选举标准依然是以isr中存活为前提,以AR中排在前面的优先,最后更新Leader和isr队列信息

3.  新节点服役

新节点服役后,以前的topic所在的分区不会出现在新节点,即新节点不会分摊旧节点的存储压力。如果需要新节点参与进来,就需要进行一种类似于负载均衡的配置。先创建一个topic-to-move.json配置文件:

{"topics": [{"topic": "first"}],"version": 1
}

生成一个负载均衡的计划:

bin/kafka-reassign-repartitions.sh --bootstrap-server hadoop102:9092 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2,3" --generate

 上面一行是当前的分区分配,下面一行是建议的分区分配计划,创建副本存储计划increase-replication-factor.json,里面内容是上面得分建议计划。最后执行存储计划:

bin/kafka-reassign-repartitions.sh --bootstrap-server hadoop102:9092 --reassignment-json-file increase-replication-factor.json --execute

 

还可以验证计划:

bin/kafka-reassign-repartitions.sh --bootstrap-server hadoop102:9092 --reassignment-json-file increase-replication-factor.json --verify

查询这个topic的分区详情

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --topic first --describe

4.  退役旧节点

退役旧节点与服役新节点有一些类似,先创建一个topic-to-move.json配置文件,与服役新节点时一样,然后生成一个计划,只不过--broker-list 改为"0,1,2",接着执行计划,验证计划,都与服役新节点一样。

 最后在退役节点关闭kafka服务

bin/kafka-server-stop.sh

5.  Leader选举验证

创建四个分区四个副本的topic并查看:

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --topic atguigu2 --partitions 4 --replications-factor 4bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe  --topic atguigu2

 

把3号broker停掉,那么isr队列中没有3,并且4号分区的Leader变为2

再把2号干掉

 

再恢复3号,发现Leader未变,仅isr队列信息中新增了3号

 

再恢复2号

再干掉1号

 

这样就验证了第二节讲的选举标准: 以isr中存活为前提,以AR中排在前面的优先

6. Leader和Follower故障处理细节

LEO:Log End Offset,每个副本的最后一个offset+1

HW:high watermark,高水位线,所有副本中最小的LEO,消费者能够看到的最大的offset就是HW - 1

1)如果Follower挂了,该Follower会立即被踢出isr,isr中其他Leader和Follower正常接受/同步数据,待该Follower恢复后,会读取上次的HW,将自己高于HW的数据丢弃,从HW开始与Leader同步,等到该Follower的LEO大于等于该Partition的HW,则重新加入isr队列。

2)如果Leader挂了, Leader会立即被踢出isr,并且会选出一个新的Leader,其余的Follower会将高于HW的数据丢弃,然后与新的Leader进行同步。此时只能保证数据的一致性,不能保证数据不丢失。

7. 手动调整分区副本

如果服务器的存储能力不同,希望将数据更多的存储在空间大的服务器上,那么就不应该按照Kafka分区副本的默认均匀分配,而是需要手动调整。创建4个分区,两个副本,都存在0号和1号broker上面。

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --topic three --partitions 4 --replications-factor 2bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe  --topic three

 

 创建increase-replication-factor.json:

{"partitions": [{"topic": "three", "partitions": 0, "replicas": [0, 1]},{"topic": "three", "partitions": 1, "replicas": [0, 1]},{"topic": "three", "partitions": 2, "replicas": [1, 0]},{"topic": "three", "partitions": 3, "replicas": [1, 0]}],"version": 1
}

执行存储计划:

bin/kafka-reassign-repartitions.sh --bootstrap-server hadoop102:9092 --reassignment-json-file increase-replication-factor.json --execute

 最后查看

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe  --topic three

以上是减少副本,增加副本也是类似,先创建一个3个分区,1个副本的topic:

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --topic four --partitions 3 --replications-factor 1

创建increase-replication-factor.json:

{"partitions": [{"topic": "four", "partitions": 0, "replicas": [0, 1, 2]},{"topic": "four", "partitions": 1, "replicas": [0, 1, 2]},{"topic": "four", "partitions": 2, "replicas": [0, 1, 2]}],"version": 1
}

执行计划:

bin/kafka-reassign-repartitions.sh --bootstrap-server hadoop102:9092 --reassignment-json-file increase-replication-factor.json --execute

8. Leader Partition自动平衡

在Leader选举验证小节中,如果2号和3号节点都挂了,然后又恢复,则Leader过于集中在0号和1号节点,而Kafka生产者和消费者都是只对Leader操作,所以0号和1号的压力会很大,造成负载不均衡。 未解决该问题,Kafka会自动再平衡,auto.leader.rebalance.enable默认设为true。

什么时机会触发再平衡呢?一个参考指标是broker的不平衡率,leader.imbalance.per.broker.percentage,默认是10%,另一个指标是负载检查的间隔时间,leader.imbalance.check.interval.seconds,默认是300秒。

不平衡率的计算:

实际生产环境中,不一定需要开启再平衡,因为上述例子中其实已经相对平衡了,但是根据规则,需要触发再平衡,因此会需要消耗大量资源。 

9. 文件存储机制

Topic是逻辑上的概念,而partition是物理上的概念,每个partition对应一个log文件,该log文件存储的就是Kafka生产者的数据。生产的数据不断地追加到log文件中,为防止log文件过大导致检索数据慢,Kafka采取了分片和索引的机制:每个partition分为多个segment,每个segment包括.index文件(偏移量索引文件)、.log文件(日志文件)、.timeindex文件(时间戳索引文件)。这些文件位于一个文件夹中,文件夹命名规则:topic名称+分区号。index和log文件的命名是以当前segment的第一条数据的offset来命名。

log文件和index文件详解:

 

10. 文件清除策略

Kafka数据默认保存7天,7天后数据自动删除或者压缩。可通过如下参数修改保存时间(从上到下优先级依次增高):

log.retention.hours

log.retention.minutes

log.retention.ms

默认检查数据是否超期的间隔时间是5分钟,可通过参数log.retention.check.interval.ms进行修改。

如果是删除数据,log.cleanup.policy=delete,基于时间删除是默认打开的,以segment中最大的时间戳作为该文件的时间戳。而基于空间大小进行删除是默认关闭的(log.retention.bytes=-1),即数据超过阈值,删除最早的数据。

如果是压缩数据,log.cleanup.policy=compact,此时对于相同key的不同value值,只保留最新的。(与之前的snappy压缩概念不同)

注意,压缩后的offset可能不是连续的,比如上图没有 offset 6,如果从offset 6开始消费,则会从7开始消费。

11. 高效读写

1)Kafka本身是分布式集群,采用分区,并行度高

2)读数据采用稀疏索引,可以快读定位数据

3)顺序写磁盘,数据以追加的方式写到log文件,这比随机写的速度要快很多,因为省去了大量的磁头寻址时间

4)采用页缓存和零拷贝技术

零拷贝:Kafka的数据加工处理操作交由Kafka生产者和消费者处理。Broker应用层不关心存储的数据,因此就不用走应用层,传输效率高。(传统数据复制方式:从磁盘中读取文件到内核缓冲区,内核读取缓冲区数据复制到用户缓冲区,用户缓冲区的数据复制到socket缓冲区,socket缓冲区数据发送到网卡,再到消费者)

页缓存:Kafka重度依赖Linux提供的页缓存功能。当上层有写操作时,操作系统只是将数据写入页缓存。当读操作发生时,从页缓存中读,如果找不到,再从磁盘中读。页缓存是把尽可能多的空闲内存当做磁盘内存来用。

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

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

相关文章

腾讯云服务器多少钱一年?价格表新鲜出炉(2024)

腾讯云服务器多少钱一年?61元一年起。2024年最新腾讯云服务器优惠价格表,腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

【研究僧总结】回顾第1095个创作日

目录 前言一. 机缘二. 日常三. 展望 前言 感觉刚过1024不久,现在又来个1095创作日 一. 机缘 研究僧一直在找平台做笔记,方便之后的回顾总结,也让各位网友见证你我的成长,相互学习 止不住的写文止不住的成长,大家共同…

Docker 之 数据卷

目录 1. 数据卷是什么 1.1 运行一个带有容器卷存储功能的容器实例 2.能干什么 3. 容器卷案例 3.1 宿主机vs容器之间映射添加容器卷 3.1.1 命令添加: 3.1.2 查看数据卷是否挂载成功 3.1.3 容器和宿主机之间数据共享 3.2 读写规则映射添加说明 3.2.1 读写&…

java系统部署到Linux

1、安装java 1.8JDK 卸载Open JDK 首先,我们先检查系统是否自带了 JDK。输入命令 java -verison批量删除 rpm -qa | grep java | xargs rpm -e --nodeps下载并安装JDK 我们在 user 目录下建立一个新的 java文件夹,用来存放 JDK文件。 jdk下载地址 …

快速上手 Elasticsearch:Docker Compose 部署详解

最近面试竞争日益激烈,Elasticsearch作为一款广泛应用的中间件,几乎成为面试中必考的知识点。最近,AIGC也备受关注,而好多的AI项目中也采用了Elasticsearch作为向量数据库,因此我们迫切希望学习Elasticsearch。对于学习…

Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别?

Docker简介 前言 前端有必要学习Docker吗?有!!不仅要学Docker,还要学习Kubernetes (K8s),Jenkins 那问题来了,Docker,k8s,jenkins到底要先学习那个呢?当然是Docker 总结来说,先学习…

C++初阶:STL容器list的使用与初版自实现

目录 1. list的接口与使用1.1 默认成员函数1.2 迭代器与容量相关成员函数1.3 存储数据操作相关成员函数1.4 其他list操作成员函数 2. list的自实现2.1 list的自实现功能2.2 list的结点结构2.3 list的迭代器2.3 list的结构2.4 list迭代器的运算符重载2.5 list的成员函数 3. cons…

双指针(滑动窗口)-算法刷题

一.移动零(. - 力扣(LeetCode)) 算法思想 : 设置两个指针left,right,将数组分为三块[0,left]为不为0的元素,[left1,right-1]为0元素,[right,num.size()-1]为未扫描的区域&#xff0c…

第四百二十二回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容,本章回中将介绍自定义Action菜单.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

day3-QT

1>使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函。将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是…

JS操作元素的内容

对象.innerText 属性 对象.innerHTML 属性 <body><div classbox>文字</div><script>//首先获取元素const box document.querySelector(.box)console.log(box.innerText)</script> </body> 1.元素innerText属性 将文本内容添加到标签任…

【Redis知识点总结】(六)——主从同步、哨兵模式、集群

Redis知识点总结&#xff08;六&#xff09;——主从同步、哨兵模式、集群 主从同步哨兵集群 主从同步 redis的主从同步&#xff0c;一般是一个主节点&#xff0c;加上多个从节点。只有主节点可以接收写命令&#xff0c;主节点接收到的写命令&#xff0c;会同步给从节点&#…

Java-SSM小区物业管理系统

Java-SSM小区物业管理系统 1.服务承诺&#xff1a; 包安装运行&#xff0c;如有需要欢迎联系&#xff08;VX:yuanchengruanjian&#xff09;。 2.项目所用框架: 前端:JSP、layui等。 后端:SSM,即Spring、SpringMvc、Mybatis等。 3.项目功能点: 1.业主功能: a.登录/退出登录 …

【投资学】作业

第20题 20.某一看涨期权和某一看跌期权的标的股票均为XYZ&#xff0c;两者的执行价格均为每股50美元&#xff0c;期限均为6个月。若投资者以4美元的价格购入看涨期权&#xff0c;当股票价格分别是40美元&#xff0c;45美元&#xff0c;50美元&#xff0c;55美元&#xff0c;60…

git 模拟队内协作

push 与 pull 命令需要登录。 凭据管理器都得是对应用户的。一台电脑上需要切换&#xff0c;删除再连接。 目录 一、前提条件二、流程三、命令如下四、注意事项&#xff08;先看这个&#xff09; 一、前提条件 项目主人仓库公开仓库里有一个文件&#xff0c;例如&#xff1a;h…

零代码编程:用kimichat批量重命名txt文本文件

一个文件夹中有很多个txt文本文件&#xff0c;需要全部进行重命名。 可以在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个关于批量重命名txt文本文件的Python脚本&#xff0c;下面是具体步骤&#xff1a; D:\Best Seller Books 这个文件夹…

Java二阶知识点总结(七)SVN和Git

SVN 1、SVN和Git的区别 SVN是集中式的&#xff0c;也就是会有一个服务器保存所有代码&#xff0c;拉取代码的时候只能从这个服务器上拉取&#xff1b;Git是分布式的&#xff0c;也就是说每个人都保存有所有代码&#xff0c;如果要获取代码&#xff0c;可以从其他人手上获取SV…

mysql80-DBA数据库学习1

掌握能力 核心技能 核心技能 mysql部署 官网地址www.mysql.com 或者www.oracle.com https://dev.mysql.com/downloads/repo/yum/ Install the RPM you downloaded for your system, for example: yum install mysql80-community-release-{platform}-{version-number}.noarch…

STM32之HAL开发——系统定时器(SysTick)

系统定时器&#xff08;SysTick&#xff09;介绍 SysTick—系统定时器是属于 CM3 内核中的一个外设&#xff0c;内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器&#xff0c;计数器每计数一次的时间为 1/SYSCLK&#xff0c;一般我们设置系统时钟 SYSCLK等于 72M。当…

C语言动态内存的管理

前言 本篇博客就来探讨一下动态内存&#xff0c;说到内存&#xff0c;我们以前开辟空间大小都是固定的&#xff0c;不能调整这个空间大小&#xff0c;于是就有动态内存&#xff0c;可以让我们自己选择开辟多少空间&#xff0c;更加方便&#xff0c;让我们一起来看看动态内存的有…