# Kafka_深入探秘者(5):kafka 分区

news2024/11/14 11:38:24

Kafka_深入探秘者(5):kafka 分区

一、kafka 副本机制

1、Kafka 可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。另外,多个订阅者可以从一个或者多个分区中同时消费数据,以支撑海量数据处理能力。

2、由于 kafka 消息是以追加到分区中的,多个分区顺序写磁盘的总效率要比随机写内存还要高(引用 ApacheKafka-A High Throughput Distributed Messaging System 的观点),是 Kafka 高吞吐率的重要保证之一。

3、kafka 副本机制

  • 1)在由于 Producer 和 Consumer 都只会与 Leader 角色的分区副本相连,所以 kafka 需要以集群的组织形式提供主题下的消息高可用。kafka 支持主备复制,所以消息具备高可用和持久性。

  • 2)kafka 一个分区可以有多个副本,这些副本保存在不同的 broker 上。每个分区的副本中都会有一个作为 Leader。当一个 broker 失败时,Leader 在这台 broker 上的分区都会变得不可用,kafka 会自动移除 Leader,再其他副本中选一个作为新的 Leader。

  • 3)在通常情况下,增加分区可以提供 kafka 集群的吞吐量。然而,也应该意识到集群的总分区数或是单台服务器上的分区数过多,会增加不可用及延迟的风险。

kafka集群.png

二、kafka Leader 选举

1、Kafka 可以预见的是,如果某个分区的 Leader 挂了,那么其它跟随者将会进行选举产生一个新的 leader,之后所有的读写就会转移到这个新的 Leader 上,在 kafka 中,其不是采用常见的多数选举的方式进行副本的 Leader 选举,而是会在 Zookeeper 上针对每个 Topic 维护一个称为 ISR(in-syncreplica,已同步的副本)的集合,显然还有一些副本没有来得及同步。只有这个 ISR 列表里面的才有资格成为 leader (先使用ISR里面的第一个,如果不行依次类推,因为 ISR 里面的是同步副本,消息是最完整且各个节点都是一样的)。

2、kafka 通过 ISR,kafka 需要的冗余度较低,可以容忍的失败数比较高。假设某个 topic 有 f+1 个副本,kafka 可以容忍 f 个不可用,当然,如果全部 ISR 里面的副本都不可用,也可以选择其他可用的副本,只是存在数据的不一致。

3、Leader 选举随机示例图:

Leader选举随机示例图.png

三、kafka 分区重新分配 001

1、部署好的 Kafka 集群里面添加机器是最正常不过的需求,而且添加起来非常地方便,从已经部署好的 Kafka 节点中复制相应的配置文件,然后把里面的 brokerid 修改成全局唯一的,最后启动这个节点即可将它加入到现有 Kafka 集群中。

2、新添加的 Kafka 节点并不会自动地分配数据,所以无法分担集群的负载,除非我们新建一个 topic。 手动将部分分区移到新添加的 Kafka 节点上,Kafka 内部提供了相关的工具来重新分布某个 topic 的分区。

3、kafka 集群搭建:

3.1 拷贝三份 kafka_2.12-2.8.0 分别命名为:kafka-01, kafka-02, kafka-03

# 切换目录
cd /usr/local/kafka/

# 拷贝三份 kafka_2.12-2.8.0 分别命名为:kafka-01, kafka-02, kafka-03
cp -rf kafka_2.12-2.8.0 ./kafka-01 
cp -rf kafka_2.12-2.8.0 ./kafka-02
cp -rf kafka_2.12-2.8.0 ./kafka-03

3.2 修改 kafka-01 的配置文件 kafka/kafka-01/config/server.properties

broker.id=0, log.dirs=/usr/local/kafka/kafka-01/logs, port=9092


# 切换目录
cd /usr/local/kafka/

# 修改 kafka-01 的配置文件 kafka-01/config/server.properties
vim kafka-01/config/server.properties

# 修改以下几个配置:

broker.id=0 
log.dirs=/usr/local/kafka/kafka-01/logs 
# listeners=PLAINTEXT://localhost:9092
host.name=localhost
port=9092

3.3 修改 kafka-02 的配置文件 kafka/kafka-02/config/server.properties

broker.id=1, log.dirs=/usr/local/kafka/kafka-02/logs, port=9093


# 切换目录
cd /usr/local/kafka/

# 修改 kafka-02 的配置文件 kafka-02/config/server.properties
vim kafka-02/config/server.properties

# 修改以下几个配置:

broker.id=1 
log.dirs=/usr/local/kafka/kafka-02/logs 
# listeners=PLAINTEXT://localhost:9093
host.name=localhost
port=9093

3.4 修改 kafka-03 的配置文件 kafka/kafka-03/config/server.properties

broker.id=2, log.dirs=/usr/local/kafka/kafka-03/logs, port=9094


# 切换目录
cd /usr/local/kafka/

# 修改 kafka-03 的配置文件 kafka-03/config/server.properties
vim kafka-03/config/server.properties

# 修改以下几个配置:

broker.id=2 
log.dirs=/usr/local/kafka/kafka-03/logs 
# listeners=PLAINTEXT://localhost:9094
host.name=localhost
port=9094

3.5 删除 kafka 三个节点 kafka-01, kafka-02, kafka-03 以前的日志文件。

删除命令:rm -rf logs/*


# 切换目录
cd /usr/local/kafka/

# 删除 节点1:kafka-01 以前的日志文件
rm -rf kafka-01/logs/* 

# 删除 节点2:kafka-02 以前的日志文件
rm -rf kafka-02/logs/* 

# 删除 节点3:kafka-03 以前的日志文件
rm -rf kafka-03/logs/* 

3.6 启动 kafka 三个节点 kafka-01, kafka-02, kafka-03

启动命令:bin/kafka-server-start.sh config/server.properties


# 切换目录
cd /usr/local/kafka/

# 启动 节点1:kafka-01
kafka-01/bin/kafka-server-start.sh config/server.properties

# 启动 节点2:kafka-02 
kafka-02/bin/kafka-server-start.sh config/server.properties

# 启动 节点3:kafka-03 
kafka-03/bin/kafka-server-start.sh config/server.properties

四、kafka 分区重新分配 002

1、Kafka 创建一个有3个节点的集群(3个分区,3个副本)

创建命令:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic heima-par --partitions 3 --replication-factor 3


# 切换目录
cd /usr/local/kafka/

# 创建集群
kafka-01/bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic heima-par --partitions 3 --replication-factor 3

# 查看新创建的主题 heima-par 的详细信息
kafka-01/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima-par

2、为新创建的主题 heima-par 添加一个分区

添加分区命令:
bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic heima-par --partitions 4


# 切换目录
cd /usr/local/kafka/

# 创建集群
kafka-01/bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic heima-par --partitions 4

# 查看新创建的主题 heima-par 的详细信息
kafka-01/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima-par

3、添加一个 brokder 节点

添加 brokder 节点 命令:
cp -rf kafka-01 ./kafka-04


# 切换目录
cd /usr/local/kafka/

# 添加 brokder 节点
cp -rf kafka-01 ./kafka-04

4、修改 节点 kafka-04 的配置文件 kafka/kafka-04/config/server.properties

broker.id=3, log.dirs=/usr/local/kafka/kafka-04/logs, port=9095


# 切换目录
cd /usr/local/kafka/

# 修改 kafka-04 的配置文件 kafka-04/config/server.properties
vim kafka-04/config/server.properties

# 修改以下几个配置:

broker.id=3 
log.dirs=/usr/local/kafka/kafka-04/logs 
# listeners=PLAINTEXT://localhost:9095
host.name=localhost
port=9095

5、删除 kafka 4个节点 kafka-01, kafka-02, kafka-03, kafka-04 以前的日志文件。

删除命令:rm -rf logs/*


# 切换目录
cd /usr/local/kafka/

# 删除 节点1:kafka-01 以前的日志文件
rm -rf kafka-01/logs/* 

# 删除 节点2:kafka-02 以前的日志文件
rm -rf kafka-02/logs/* 

# 删除 节点3:kafka-03 以前的日志文件
rm -rf kafka-03/logs/* 

# 删除 节点4:kafka-04 以前的日志文件
rm -rf kafka-04/logs/* 

6 启动 kafka 4个节点 kafka-01, kafka-02, kafka-03, kafka-04

启动命令:bin/kafka-server-start.sh config/server.properties


# 切换目录
cd /usr/local/kafka/

# 启动 节点1:kafka-01
kafka-01/bin/kafka-server-start.sh config/server.properties

# 启动 节点2:kafka-02 
kafka-02/bin/kafka-server-start.sh config/server.properties

# 启动 节点3:kafka-03 
kafka-03/bin/kafka-server-start.sh config/server.properties

# 启动 节点4:kafka-04 
kafka-04/bin/kafka-server-start.sh config/server.properties

7、再次查看新创建的主题 heima-par 的详细信息,发现输出信息中新添加的节点4并没有分配之前主题的分区。


# 切换目录
cd /usr/local/kafka/

# 查看新创建的主题 heima-par 的详细信息
kafka-01/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima-par

五、kafka 分区重新分配 003

将原先分布在 broker 1-3 节点上的分区重新分布到 broker 1-4 节点上,需要借助 kafka-reassign-partitions.sh 工具生成 reassign plan ,

1、定义一个 reassign.json 文件,说明哪些 topic 需要重新分区,文件内容如下:


# 切换目录
cd /usr/local/kafka/

# 定义一个 reassign.json 文件
vim kafka-01/reassign.json

# 文件内容如下

{"topics":[{"topic":"heima-par")],
"version":1
}

2、使用 kafka-reassign-partitions.sh 工具生成 reassign plan

命令:
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file reassign.json --broker-list “0,1,2,3” --generate

命令参数说明:
-generate :表示指定类型参数。
–topics-to-move-json-file : 指定分区重份配对应的主题清单路径。


# 切换目录
cd /usr/local/kafka/

# 使用 kafka-reassign-partitions.sh 工具生成 reassign plan
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file reassign.json --broker-list "0,1,2,3" --generate

# 执行完命令会生成2个字符串。

3、重新分配 JSON 文件,创建 result.json 文件,保存 JSON 内容。

注意:第二步命令输出两个 json 字符串,第一个 JSON 内容为当前的分区副本分配情况,第二个为重新分配的候选方案,注意这里只是生成一份可行性的方案,并没有真正执行重分配的动作。

我们将第二个 JSON 内容保存到名为 result.json 文件里面(文件名不重要,文件格式也不一定要以json为结尾,只要保证内容是 json 即可),然后执行这些 reassign plan:


4、执行分配策略,并查看执行进度。

命令:
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file result.json --execute

命令参数说明:
–execute :执行命令。
–reassignment-json-file : 指定分区重分配 json 文件。


# 切换目录
cd /usr/local/kafka/

# 使用 kafka-reassign-partitions.sh 工具生成 reassign plan
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file result.json --execute

# 查看执行进度
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file result.json --verify

# 查看新创建的主题 heima-par 的详细信息
kafka-01/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima-par

六、kafka 分区分配策略

1、### 1、按照 Kafka 默认的消费逻辑设定,一个分区只能被同一个消费组 (ConsumerGroup) 内的一个消费者消费。假设目前某消费组内只有一个消费者 C0,订阅了一个 topic,这个 topic 包含 7 个分区,也就是说这个消费者 C0 订阅了 7 个分区,参考下图1

2、此时消费组内又加入了一个新的消费者 C1,按照既定的逻辑需要将原来消费者 C0 的部分分区分配给消费者 C1 消费,情形如图(2),消费者 C0 和 C1 各自负责消费所分配到的分区,相互之间并无实质性的干扰。

kafka分区分配策略1.png

3、RangeAssignor 策略的原理

RangeAssignor 策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。对于每一个 topic,RangeAssignor 策略会将消费组内所有订阅这个 topic 的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。

4、RoundRobinAssignor 策略的原理

RoundRobinAssignor 策略的原理是将消费组内所有消费者以及消费者所订阅的所有 topic 的 partition 按照字典序排序,然后通过轮询方式逐个将分区以此分配给每个消费者。RoundRobinAssignor 策略对应的 partition.assignment.strategy 参数值为: org.apache.kafka.clients.consumer.RoundRobinAssignor。

上一节关联链接请点击

# Kafka_深入探秘者(4):kafka 主题 topic

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

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

相关文章

Linux_生产消费模型_Block_Queue

目录 一、互斥锁 1.1 错误的抢票 1.1.1 类的成员函数与构造 1.1.2 start 函数 1.1.3 线程的回调函数 1.1.4 main 函数 1.1.5 结果 1.2 概念 1.3 相关系统调用 1.3.1 锁的创建 1.3.2 锁的初始化 1.3.2.1 动态初始化 1.3.2.2 静态初始化 1.3.3 锁的销毁 1.3.4…

如何在电脑上免费下载并安装 VMware Workstation Pro

下载 VMware 首先我们先来看一看免费下载VMware Workstation Pro 的具体步骤: 首先我们可以先进入 Broadcom 注册页面:https://profile.broadcom.com/web/registration,然后这时候就需要注册,我们可以使用电子邮件进行注册。 在…

B端系统:增删改查中的新建(增)页面如何设计体验更爽。

在B系统中,增删改查是最基本、最常用的功能之一。这四个操作对于系统的正常运行和数据管理至关重要。其中,新增(新建)页面的设计尤为关键,因为它直接影响着用户体验和系统功能的完整性。 一、新增(新建&…

springboot加载注入bean的方式

在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便。 springboto注入bean主要采用下图几种方式,分为本地服务工程注解声明的bean和外部依赖包中的bean。 一、 springboot装配本地服务工程…

Linux环境下安装MySQL5.7.20(源码安装)

📣📣📣 哈喽!大家好,本专栏主要发表mysql实战的文章,文章主要包括: 各版本数据库的安装、备份和恢复,性能优化等内容的学习。。 📣 ***如果需要观看配套视频的小伙伴们,请…

单体架构改造为微服务架构之痛点解析

1.微服务职责划分之痛 1.1 痛点描述 微服务的难点在于无法对一些特定职责进行清晰划分,比如某个特定职责应该归属于服务A还是服务B? 1.2 为服务划分原则的痛点 1.2.1 根据存放主要数据的服务所在进行划分 比如一个能根据商品ID找出商品信息的接口,把…

Redis持久化(RDB、AOF)详解

Redis持久化详解 一、Redis为什么需要持久化? Redis 是一个基于内存的数据库,拥有极高的读写性能,但是内存中的数据在断电或服务器重启时会全部丢失,因此需要一种持久化机制来将数据保存到硬盘上,以便在需要时进行恢复…

R语言数据分析案例34-基于ARIMA模型的武汉市房价趋势与预测研究

一、背景阐述 房地产行业对于国民经济和社会及居民的发展和生活具有很大的影响,而房价能够体现经济运转的好坏,因而房价的波动牵动着开发商和购房者的关注,城市房价预测是一个研究的热点问题,研究房价对民生问题具有重要意义。 …

【面试干货】Java中的++操作符与线程安全性

【面试干货】Java中的操作符与线程安全性 1、什么是线程安全性?2、 操作符的工作原理3、 操作符与线程安全性4、如何确保线程安全?5、 结论 💖The Begin💖点点关注,收藏不迷路💖 在Java编程中,操…

思维导图MindManager2024最新版,让你的思维飞起来!

亲爱的朋友们,今天我要跟大家分享一款我近期深度使用并彻底被种草的神器——MindManager2024最新版本的思维导图软件。作为一位对效率和创意有着极高追求的内容创作者,我几乎尝试过市面上所有的思维导图工具,而MindManager2024无疑是其中的佼…

跟着DW学习大语言模型-什么是知识库,如何构建知识库

建立一个高效的知识库对于个人和组织来说非常重要。无论是为了个人学习和成长,还是为了组织的持续创新和发展,一个完善的知识管理系统都是不可或缺的。那么,如何建立一个高效的知识库呢? 在建立知识库之前,首先需要确定…

【办公类-51-01】月评估数字生成01-平均数空值

期末需要制作月评估,每月给孩子的能力水平打分。 以前我是做在EXCEL里,手动打分,然后用公式计算1、2、3出现的个数,然后计算平均数,最后复制到Word里。 因为是手动计算,每次都要算很长时间,确保…

借助TheGraph 查询ENS信息

关于ENS (以太坊域名服务) ENS 全称是 Ethereum Name Service,它是一个建立在以太坊区块链上的去中心化域名系统。 ENS 在 Web3 领域发挥着重要作用,主要有以下几个方面: 可读性更好的地址: ENS 允许用户将复杂的以太坊地址(如 0x12345…) 映射为更简单易记的域名。这极大地提…

KUBIKOS - Animated Cube Mini BIRDS(卡通立方体鸟类)

软件包中添加了对通用渲染管线 (URP) 的支持! KUBIKOS - 动画立方体迷你鸟是17种不同的可爱低多边形移动友好鸟的集合!每只都有自己的动画集。 完美收藏你的游戏! +17种不同的动物! + 低多边形(400~900个三角形) + 操纵和动画! + 4096x4096 纹理图集 + Mecanim 准备就绪…

生命在于学习——Python人工智能原理(4.3)

三、Python的数据类型 3.1 python的基本数据类型 3.1.4 布尔值(bool) 在Python中,布尔值是表示真或假的数据类型,有两个取值,True和False,布尔值常用于控制流程、条件判断和逻辑运算,本质上来…

项目实训-接口测试(十八)

项目实训-后端接口测试(十八) 文章目录 项目实训-后端接口测试(十八)1.概述2.测试对象3.测试一4.测试二 1.概述 本篇博客将记录我在后端接口测试中的工作。 2.测试对象 3.测试一 这段代码是一个单元测试方法,用于验证…

idea 开发工具properties文件中的中文不显示

用idea打开一个项目,配置文件propertise中的中文都不展示,如图: 可修改idea配置让中文显示: 勾选箭头指向的框即可,点击应用保存,重新打开配置文件,显示正常

篮球联盟管理系统

管理员账户功能包括:系统首页,个人中心,管理员管理,球员管理,用户管理,球队管理,论坛管理,篮球资讯管理,基础数据管理 前台账户功能包括:系统首页&#xff0…

Cell2Sentence:为LLM传输生物语言

像GPT这样的LLM在自然语言任务上表现出了令人印象深刻的性能。这里介绍一种新的方法,通过将基因表达数据表示为文本,让这些预训练的模型直接适应生物背景,特别是单细胞转录组学。具体来说,Cell2Sentence将每个细胞的基因表达谱转换…

前端架构(含演进历程、设计内容、AI辅助设计、架构演进历程)

前端架构的演进历程 前端架构师的必要条件 全面的技术底蕴全局观(近期 远期)业务要有非常深刻的理解沟通协调能力和团队意识深刻理解前端架构的原则和模式 前端架构的设计内容 技术选型(库、工具、标准规范、性能、安全、扩展性 )设计模式及代码组织(模…