Kafka 分区管理

 分区是主题的子集,每个主题可以被分割成多个分区,一个分区有一个主副本(Leader)及一个或多个从(Follower)副本。分区允许将数据分布在多个broker上,这样可以提高数据的处理能力、并行性及可靠性。

每个分区在物理上是一个有序、不可变的消息序列,存储为一系列连续的、有序的日志文件。

1 分区管理

1.1 优选副本的选举

只有leader副本对外提供读写服务,而follower副本只负责在内部进行消息同步。忽略不同分区负载情况不同这一因素,broker上leader副本个数的多少决定了这个节点的负载高低。

创建主题时,该主题的分区及副本会尽可能均匀分布在集群的各个broker节点,leader副本也会均匀分布。随着时间推移,假如某个leader副本所在的broker宕机了,那么就会在集群的其他broker中重新选举leader,当该宕机的broker重新上线加入集群时,其只能成为一个follower。这样一来,leader的副本就变得不均衡。

1.1.1 优先副本

图 主题par3 的分区副本分配详情

分区的AR(Assigned Replicas)集合是在新区被创建时,Kafka根据配置来确定该分区的所有副本,并将这些副本组成AR集合。

上图中,分区0的AR集合为 [1,0,2],分区2的AR集合为[0,2,1]。

优选副本是指AR集合中的第一个副本。例如分区0的优选副本为1。AR集合在broker发生故障或重新上线时是不会改变的。

理想情况下,优选副本就是该分区的leader副本,而优选副本选举是指通过一定的方式促使优选副本选举为leader副本。

1.1.2 优选副本自动平衡

将broker端的参数auto.leader.rebalance.enable设置为true(默认值)。Kafka会启动一个定时任务,来自动执行优选副本选举动作。

生产环境建议关闭这个,因为其自动执行优选副本选举动作的时间无法自主掌控,如果在业务高峰期执行,那么会造成业务阻塞、超时等。

1.1.3 手动执行优选副本选举

bin/kafka-preferred-replica-election.sh --zookeeper localhost:2181

该脚本还提供了path-to-json-file 参数来小批量地对部分分区执行优选副本的选择操作。以下为该文件的示范内容。

{"partitions": [{"partition": 0,"topic": "par3"},{"partition": 1,"topic": "par3"}]
}
bin/kafka-preferred-replica-election.sh --zookeeper localhost:2181 --path-to-json-file par3.json

1.2 分区重分配

1)如果某分区是单副本,且所在节点突然宕机下线,那么这个分区就变得不可用,在节点恢复前,相应的数据就处于丢失状态。

2)某个节点有多个分区副本,如果该节点宕机,Kafka并不会将这些失效的分区副本自动迁移到集群中剩余的可用broker节点上。

3)当集群新增broker节点时,只有新建的主题分区才有可能被分配到这个节点上,之前的主题分区不会自动分配新增的节点。

4)当要对集群的一个节点进行有计划的下线时,为了保证分区及副本的合理分配,我们希望通过某种方式将该节点的分区副本迁移到其他的可用节点上。

为了解决这些问题,需要进行分区重分配。

1.2.1 分区副本重分配步骤

需求,主题par2 副本所在的一个broker(id为1)要下架,需要将其上的分区副本迁移出去。

图 主题par3 的分区副本分配详情

1)创建一个包含主题清单的JSON文件。

文件内容为要进行分区重分配的主题清单,文件名假定为par2-reassign.json,内容如下:

{"topics": [{"topic": "par2"}]
}

2)根据上面的JSON文件和指定要分配的broker节点列表。生成一份重分配方案。 

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --generate --topics-to-move-json-file par2-reassign.json --broker-list 0,2

图 生成的重分配方案

其中,Current partition replica assignment 为当前的分区副本分配方案。而Proposed partition reassignment configuration 为生成的新分配方案。

3)复制上面新分配方案,保存为new-par2.json,然后执行重分配脚本。

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --execute --reassignment-json-file new-par2.json

图 执行重分配脚本

最后查看par2的分区副本分配详情

图 重分配后par2 的分区副本分配详情

1.2.2 修改副本因子

创建主题后,可以修改分区的个数,同样也可修改副本因子(副本数)。

上面分区副本重分配的第三步,修改new-par2.json文件来修改副本因子,然后执行重分配脚本。命名为par2-2.json。

{
"version": 1,
"partitions": [{"topic": "par2","partition": 1,"replicas": [2],"log_dirs": ["any"]},{"topic": "par2","partition": 0,"replicas": [0, 2],"log_dirs": ["any", "any"]
}]
}

图 修改副本因子后的par2 副本分配详情

2 分区数与吞吐性能

对生产者而言,每个分区的数据写入是完全可以并行化的;对消费者而言,Kafka只允许单个分区中的消息被一个消费者线程消费,一个消费组的消费并行度完全依赖于所消费的分区数。

如此看来,一个主题的分区数越多,吞吐性能越好。但实际并非如此。一旦分区数超过某个阈值,吞吐性能不升反降。

2.1 性能测试工具

Kafka 本身提供了用于生产者性能测试的kafka-producer-perf.test.sh和用于消费者性能测试的kafka-consumer-perf-test.sh。

2.1.1 生产者性能测试

bin/kafka-producer-perf-test.sh --topic par3 --num-records 100000 --record-size 1024 --throughput -1 --producer-props bootstrap.servers=localhost:9092 acks=1

向主题par3 发送10万条大小为1024B的消息,生产者对应的acks为1(分区中至少有1个副本收到这条消息,才算成功写入).

图 向生产者发送测试消息

2.1.2 消费者性能测试

bin/kafka-consumer-perf-test.sh --topic par3 --messages 100000 --broker-list localhost:9092

消费主题par3 的10万条消息。

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

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

相关文章

【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis

以人物为中心的主体到图像的高保真合成,CVPR2024 code:CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper:2311.10329 背景 研究问题:这篇文…

详解如何自定义 Android Dex VMP 保护壳

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 前言 Android Dex VMP(Virtual Machine Protection,虚拟机保护)壳是一种常见的应用保护技术,主要用于保护 And…

基于华为atlas的重车(满载)空车(空载)识别

该教程主要是想摸索出华为atlas的基于ACL的推理模式。最终实现通过煤矿磅道上方的摄像头,识别出车辆的重车(满载)、空车(空载)情况。本质上是一个简单的检测问题。 但是整体探索过程比较坎坷,Tianxiaomo的…

《零基础Go语言算法实战》【题目 2-25】goroutine 的执行权问题

《零基础Go语言算法实战》 【题目 2-25】goroutine 的执行权问题 请说明以下这段代码为什么会卡死。 package main import ( "fmt" "runtime" ) func main() { var i byte go func() { for i 0; i < 255; i { } }() fmt.Println("start&quo…

IntelliJ IDEA中Maven项目的配置、创建与导入全攻略

大家好&#xff0c;我是袁庭新。 IntelliJ IDEA是当前最流行的Java IDE&#xff08;集成开发环境&#xff09;之一&#xff0c;也是业界公认最好用的Java开发工具之一。IntelliJ IDEA支持Maven的全部功能&#xff0c;通过它我们可以很轻松地实现创建Maven项目、导入Maven项目、…

【Rust】函数

目录 思维导图 1. 函数的基本概念 1.1 函数的定义 2. 参数的使用 2.1 单个参数的示例 2.2 多个参数的示例 3. 语句与表达式 3.1 语句与表达式的区别 3.2 示例 4. 带返回值的函数 4.1 返回值的示例 4.2 返回值与表达式 5. 错误处理 5.1 错误示例 思维导图 1. 函数…

Cython全教程2 多种定义方式

—— 本篇文章&#xff0c;主要讲述Cython中的四种定义关键字 全教程2 多种定义方式&#xff1a; 在Cython中&#xff0c;关于定义的关键字有四个&#xff0c;分别是&#xff1a; cdef、def、cpdef、DEF 一、cdef定义关键字 顾名思义&#xff0c;cdef关键字定义的是一个C函数…

Web开发(一)HTML5

Web开发&#xff08;一&#xff09;HTML5 写在前面 参考黑马程序员前端Web教程做的笔记&#xff0c;主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的HTML5部分。主要涉及到HTML的基础语法。 HTML基础 标签定义 HTML定义 HTML(HyperText Markup Lan…

Java-数据结构-栈与队列(常考面试题与单调栈)

在上一篇的学习中&#xff0c;我们学习了栈和队列的基本知识&#xff0c;以及它们对应都有哪些方法&#xff0c;在什么应用场景下如何使用&#xff0c;并且还对它们进行了模拟实现&#xff0c;而其实对于栈和队列的相关知识还远不止于此&#xff0c;而今天我们就对栈与队列进行…

Spring 项目 基于 Tomcat容器进行部署

文章目录 一、前置知识二、本地Idea运行Spring项目1. 将写好的 Spring 项目先打包成 war 包2. 查看项目工件&#xff08;Artifact&#xff09;是否存在3. 配置 Tomcat3.1 添加一个本地 Tomcat 容器3.2 将项目部署到 Tomcat 4. 运行项目 三、基于 Tomcat 部署及多实例部署1. Spr…

usbredir学习

文章目录 背景典型场景编译usbredirparserusbredirfilterusbredirparser/usbredirproto usbredirhostusbredirect/usbredirtestclient参考 背景 usbredir 是一种用于通过网络转发 USB 设备流量的网络协议。它也是一个软件包的名称&#xff0c;该软件包提供了一个解析库、一个 …

ESXI 安装教程(3) ---​vCenter Server 安装

不涉及复杂的操作此项可不安装 1.镜像加载到虚拟光盘 对应的网盘文件 2.打开文件路径 双击运行文件installer.exe 3.调整安装语言 4.点击安装 5. 6. 证书,有效问题导致此提示,非专业网络管理人员,不知道如何处理,此处点是即可 证书有效开始时间是安装时间8小时 证书有效结束…

极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…

【集成学习】Boosting算法详解

文章目录 1. 集成学习概述2. Boosting算法详解3. Gradient Boosting算法详解3.1 基本思想3.2 公式推导 4. Python实现 1. 集成学习概述 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型&#xf…

小米vela系统(基于开源nuttx内核)——如何使用信号量进行PV操作

如何使用信号量进行PV操作 前言信号量1. 信号量简介2. NuttX中信号量的创建与使用2.1 Nuttx信号量的初始化和销毁2.2 信号量的等待和发布 3. 信号量的实际应用&#xff1a;下载任务示例3.1 实际代码3.2 代码说明3.3 执行说明 4. 信号量的优势与应用场景5. 常见应用场景&#xf…

CMake学习笔记(2)

1. 嵌套的CMake 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&#xff0c;有一种化繁为简的方式就是给每个源码目录都添加一个CMakeLists.txt文件&#xff…

【C++】size_t究竟是什么?全面解析与深入拓展

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;一、什么是size_t&#xff1f;为什么需要size_t&#xff1f; &#x1f4af;二、size_t的特性与用途1. size_t是无符号类型示例&#xff1a; 2. size_t的跨平台适应性示例对…

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…

ssh2-sftp-client和ssh2配合使用js脚本快速部署项目到服务器

有时候因为服务器不能实现github或者gitlab的自动部署服务&#xff0c;所以就需要使用脚本来实现自动部署&#xff0c;可以省时省力&#xff0c;一劳永逸。这里就使用ssh2-sftp-client和ssh2来实现&#xff0c;即便是需要sudo权限&#xff0c;也是可以的。 1.先将本地打包后的…

深度解析Linux中的调试器gdb/cgdb的使用

Linux下我们编译好的代码&#xff0c;无法直接调试 gcc/g默认的工作模式是realse模式 程序要调试的话&#xff0c;必须是debug模式&#xff0c;也就是说编译的时候要加-g选项 gdb携带调试信息的exe 我们现在在文件夹里面创建一个文件lesson11 里面创建一个累加的代码&…