Kafka broker

news2024/11/16 11:27:16

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 4

bin/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 2

bin/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.coloradmin.cn/o/1542371.html

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

相关文章

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一,在第七节中讲解了如何简洁的进行web程序部署和运行,这只是它的功能之一。在本节中,我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

二十、软考-系统架构设计师笔记-真题解析-2020年真题

软考-系统架构设计师-2020年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.按照我国著作权法的权利保护期,( )受到永久保护。 A.发表权 B.修改权 C.复制权 D.发行权 解析: 答案: 2.假设某计算机的字长为32位&a…

爬虫入门系列-HTML基础语法

🌈个人主页:会编辑的果子君 💫个人格言:“成为自己未来的主人~” HTML基础语法 bs4解析比较简单,但是呢,首先你需要了解一丢丢的html知识,然后再去使用bs4去提取,逻辑和编写难度就会非常简…

Git的原理和使用(四)

目录 远程操作 理解分布式版本控制系统 远程仓库 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置Git 忽略特殊文件 为命令配置别名 标签管理 理解标签 创建标签 操作标签 远程操作 理解分布式版本控制系统 1、每个人的电脑上都是一个完整的版本库…

BUG未解之谜01-指针引用之谜

在leetcode里面刷题出现的问题,当我在sortedArrayToBST里面给root赋予初始值NULL之后,问题得到解决! 理论上root是未初始化的变量,然后我进入insert函数之后,root引用的内容也是未知值,因此无法给原来的二叉…

如何使用半群、群论及格理论研究人机协同

在数学中,半群、群论和格理论都是重要的代数结构和数学分支,它们分别研究了不同类型的代数系统和结构。简单介绍一下它们的基本概念: 1、半群(Semigroup): 半群是一个集合,配备了一个二元运算&a…

Linux:文件增删 文件压缩指令

Linux:文件增删 & 文件压缩指令 文件增删touch指令mkdir指令cp指令rm指令rmdir指令 文件压缩zip & unzip 指令tar指令 文件增删 touch指令 功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新…

UG NX二次开发(C#)-通过曲线组生成NURBS曲面

文章目录 1、前言2、UG NX中通过曲线组生成NURBS曲面的操作3、采用NXOpen C#方法的源代码1、前言 在UG NX中,曲线、曲面的操作使用比较多,对于创建NURBS曲面,可以通过曲线组来生成,本文以NXOpen C#的方法实现通过曲线组生成NURBS曲面的功能。对于UG NX二次开发感兴趣或者有…

【JAVA】通过JAVA实现用户界面的登录

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-wyCvaz0EBNwHcwsi {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

代码学习记录25---回溯算法最后一天

随想录日记part25【很难】 t i m e : time: time: 2024.03.21 主要内容:回溯算法在之前的学习中已经熟练掌握,今天对其进行挑战并进行总结:1:重新安排行程 ;2.N皇后 ;3.解…

SpringJPA 做分页条件查询

前言: 相信小伙伴们的项目很多都用到SpringJPA框架的吧,对于单表的增删改查利用jpa是很方便的,但是对于条件查询并且分页 是不是很多小伙伴不经常写到. 今天我整理了一下在这里分享一下. 话不多说直接上代码: Controller: RestController public class ProductInstanceContr…

Java基础-正则表达式

文章目录 1.基本介绍2.正则底层实现1.matcher.find()完成的任务2.matcher.group(0)分析1.源代码2.解释(不分组)3.解释(分组) 3.总结 3.正则表达式语法1.基本介绍2.元字符的转义符号1.基本介绍2.代码实例 3.字符匹配符1.基本介绍2.…

洛谷day3

B2053 求一元二次方程 - 洛谷 掌握printf用法&#xff1b; #include <iostream> #include <cmath> using namespace std; double a,b,c; double delta; double x1,x2;int main() {cin>>a>>b>>c;delta b*b-4*a*c;if(delta>0){x1 (-bsqrt…

【前端寻宝之路】JavaScript初学之旅

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-azUa9yH16cRXQUxE {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

生产力工具|安装更新R软件(R、studio)

内容介绍&#xff1a; 安装R软件&#xff1a; 下载 R X64 3.5.1: 访问官方R网站 https://cran.r-project.org/。选择适合Windows版本的安装包。将安装包下载到您的计算机。 本地安装: 运行下载的“R-3.5.1-win.exe”文件。按照安装向导&#xff0c;选择安装路径&#xff0c;取消…

机器视觉定位点胶机系统工作原理分析

机器视觉&#xff0c;简而言之&#xff0c;即是通过机器来模拟人眼的视觉功能&#xff0c;执行测量与判断的任务。这一过程中&#xff0c;关键的角色是机器视觉产品&#xff0c;它们通常以CMOS或CCD的形式出现&#xff0c;负责将观察的目标转化为图像信号。这些信号随后被专用的…

Pinctrl子系统_05_Pincontroller构造过程情景分析

上一节我们了解了Pinctrl子系统主要的数据结构&#xff0c;要想更好的掌握Pinctrl子系统&#xff0c;还需要知道他的构造过程。 本节我们就来分析一下Pinctrl子系统的构造过程。 以内核面向对象的思想&#xff0c;设备树可以分为两部分&#xff0c;左边是Pinctrl子系统节点&a…

nodejs+vue高校师资管理系统python-flask-django-php

快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生活方式…

002- 用 AutoCoder 添加和修改代码

实际上 AutoCoder 最适合的场景是修改代码&#xff0c;因为它最原始的功能是把源码你指定的文档搜索引擎搜集到的资料和你的需求生成一个prompt给到大模型。 此外纠正大家一个观点&#xff0c; AutoCoder 不是一句话给你创建一个网站抑或一个大型的项目。我们是帮助研发或者产品…

移植 Zephyr 到 Art-Pi

背景 ​ 最近工作中接触到了 Zephyr&#xff0c;不由觉得 Zephyr 是个很强大、全面、优秀的实时操作系统&#xff0c;但同时是有一定的上手难度的&#xff0c;其复杂的构建系统让小编倒吸一口凉气。为了深入研究并完全掌控 Zephyr&#xff0c;小编决定把它移植到手头的开发板上…