从零开始的 Kafka 学习(二)| 集群启动

1. 相关概念

1.1 代理:Broker

使用Kafka前,我们都会启动Kafka服务进程,这里的Kafka服务进程我们一般会称之为Kafka Broker 或 Kafka Server。因为Kafka是分布式消息系统所以再实际的生产环境中,是需要多个服务进程形成集群提供消息服务的。所以每一个服务节点都是一个broker,而且在 Kafka 集群中,为了区分不同的服务节点,每一个 broker都应该有一个不重复的全局ID,称之为 broker.id,这个 ID 可以在 kafka 软件的配置文件 server.properties 中进行配置。

############################# Server Basics ######################

# The id of the broker. This must be set to a unique integer for each broker

# 集群ID

broker.id=0

咱们的 Kafka 集群中每一个节点都有自己的ID,整数且唯一。

主机kafka-broker1kafka-broker2kafka-broker3
broker.id123

1.2 控制器:Controller

Kafka是分布式消息传输系统,所以存在多个 Broker 服务节点,但是它的软件架构采用的是分布式系统中比较常见的主从(Master - Slave) 架构,也就说需要从多个 Broker 中找到一个用于管理整个 Kafka 集群的 Master 节点,这个节点,我们就称之为 Controller。它是 Apache Kafka 的核心组件非常重要。它的主要作用在 Apache ZooKeeper 的帮助下管理和协调控制整个 Kafka 集群。

在这里插入图片描述

如果在运行过程中,Controller 节点出现了故障,那么Kafka 会依托于 ZooKeeper选举其他的节点作为新的 Controller,让Kafka 集群实现高可用。

在这里插入图片描述

Kafka 集群中 Controler 的基本功能:

Broker 管理

监听 /brokers/ids 节点相关的变化:

  • Broker 输了增加或减少的变化
  • Broker 对应的数据变化

Topic 管理

  • 新增:监听 /brokers/ids 节点相关的变化
  • 修改:监听 /brokers/ids 节点相关的变化
  • 删除:监听 /admin/delete_topics 节点相关的变化

Partation 管理

  • 监听 /admin/reassign_partitions节点相关的变化
  • 监听 /isr_change_notification节点相关的变化
  • 监听 /preferred_replica_election节点相关的变化

数据服务

启动分区状态机和副本状态机

2. 启动ZooKeeper

Kafka 集群中含有多个服务节点,而分布式系统中经典的主从(Master-Slave)架构就要求从多个服务节点中找一个节点作为集群管理Master,Kafka 集群中的这个Master,我们称之为集群控制器 Controller。

在这里插入图片描述

如果此时Controller节点出现故障,它就不能再管理集群功能,那么其他的Slave节点该如何是好呢?

在这里插入图片描述

如果从剩余的两个Slave节点中选一个节点出来作为新的集群控制器是不是一个不错的方案,我们将这个选择的过程称之为:选举(elect)。方案是不错,但是问题就在于选哪一个Slave节点呢?不同的软件实现类似的选举功能都会有一些选举算法,而Kafka是依赖于ZooKeeper软件实现Broker节点选举功能。

在这里插入图片描述

ZooKeeper 如何实现 Kafka 的节点选举呢?这就要说到我们用到 ZooKeeper 的3个功能:

  • 一个是在 ZooKeeper软件中创建节点 Node,创建一个 Node时,我们会设定这个节点时持久化创建,还是临时创建,就是Node 一旦创建后会一直存在,而临时创建,是根据当前的客户端连接创建的临时节点 Node,一旦客户端连接断开,那么这个临时节点 Node 也会被自动删除,所以这样的节点称之为临时节点。
  • ZooKeeper 节点是不允许有重复的,所以多个客户端创建同一个节点,只能有一个创建成功。
  • 另外一个是客户端可以在 ZooKeeper 的节点上增加监听器,用于监听节点的状态变化,一旦监听的节点状态发生变化,那么监听器就会触发响应,实现待监听功能。

Kafka 是如何利用 ZooKeeper 实现 Controller 节点的选举的:

1)第一次启动Kafka 集群时,会同时启动多个 Broker 节点,每一个 Broker 节点就会连接 ZooKeeper,并尝试创建一个临时节点 /controller

2)因为 ZooKeeper 中一个系欸但不允许重复创建,所以多个 Broker 节点,最终只能有一个 Broker 节点可以创建成功,那么这个创建成功的 Broker 节点聚会自动作为 Kafka 集群控制节点,用于管理整个 Kafa 集群。

3)没有选举成功的其他 Slave 节点会创建 Node 监听器,用于监听 /controller 节点的状态变化。

4)一旦Controller 节点出现故障或挂掉了,那么对应的 ZooKeeper 客户端连接就会中断。ZooKeeper 中的 /controller 节点就会自动被删除,而其他那些 Slave 节点因为增加了监听器,所以当监听到 /controller 节点被删除后,就会马上向 ZooKeeper 发出创建 /controller 节点的请求,一旦创建成功,那么该Broker 就变成了新的 Controller 节点了。

现在我们能明白启动 Kafka 集群之前为什么要先启动 ZooKeeper 集群了吧。就说因为 ZooKeeper 可以协助 Kafka 进行集群管理。

3. 启动Kafka

ZooKeeper 已经启动好了,那我们现在可以启动多个 Kafka Broker节点构建 Kafka 集群了。构建的过程中,每一个 Broker 节点就是一个 Java 进程,而在这个进程中,有很多需要 提前准备好,并进行初始化的内部组件对象。

3.1 初始化 ZooKeeper

Kafka Broker 启动时,首先会创建 ZooKeeper 客户端(KafkaZkClinet),用于 ZooKeeper 进行交互。客户端对象创建完成后,会通过该客户端对象向 ZooKeeper 发送创建 Node 的请求,注意,这里创建的Node都是持久化Node。

在这里插入图片描述

节点类型说明
/admin/delete_topics持久化节点配置需要删除的topic,因为删除过程中,可能broker下线,或执行失败,那么就需要在broker重新上线后,根据当前节点继续删除操作,一旦topic所有的分区数据全部删除,那么当前节点的数据才会进行清理
/brokers/ids持久化节点服务节点ID标识,只要broker启动,那么就会在当前节点中增加子节点,brokerID不能重复
/brokers/topics持久化节点服务节点中的主题详细信息,包括分区,副本
/brokers/seqid持久化节点seqid主要用于自动生产brokerId
/config/changes持久化节点kafka的元数据发生变化时,会向该节点下创建子节点。并写入对应信息
/config/clients持久化节点客户端配置,默认为空
/config/brokers持久化节点服务节点相关配置,默认为空
/config/ips持久化节点IP配置,默认为空
/config/topics持久化节点主题配置,默认为空
/config/users持久化节点用户配置,默认为空
/consumers持久化节点消费者节点,用于记录消费者相关信息
/isr_change_notification持久化节点ISR列表发生变更时候的通知,在kafka当中由于存在ISR列表变更的情况发生,为了保证ISR列表更新的及时性,定义了isr_change_notification这个节点,主要用于通知Controller来及时将ISR列表进行变更。
/latest_producer_id_block持久化节点保存PID块,主要用于能够保证生产者的任意写入请求都能够得到响应。
/log_dir_event_notification持久化节点主要用于保存当broker当中某些数据路径出现异常时候,例如磁盘损坏,文件读写失败等异常时候,向ZooKeeper当中增加一个通知序号,Controller节点监听到这个节点的变化之后,就会做出对应的处理操作
/cluster/id持久化节点主要用于保存kafka集群的唯一id信息,每个kafka集群都会给分配要给唯一id,以及对应的版本号

3.2 初始化服务

Kafka Broker 中有很多的服务对象,用于实现内部管理和外部通信操作。

在这里插入图片描述

3.2.1 启动任务调度器

每一个Broker 在启动时都会创建内部调度器(KafkaScheduler) 并启动,用于完成节点内部的工作任务。底层就是Java中的定时任务线程池。

3.2.2 创建数据管理器

每一个 Broker 在启动时都会创建数据管理器(LogManager),用于接收到消息后,完成后续的数据创建,查询,清理等处理。

3.2.3 创建远程数据管理器

每一个 Broker 在启动时都会创建远程数据管理器(RemoteLogManager),用于和其他 Broker 节点进行数据状态同步。

3.2.4 创建副本管理器

每一个 Broker 在启动时都会创建副本管理器(ReplicaManager),用于对主题的副本进行处理。

3.2.5 创建 ZK 元数据缓存

每一个 Broker 在启动时会将 ZK 的关于 Kafka 的元数据进行缓存,创建元数据对象(ZKMetadataCache)

3.2.6 创建 Broker 通信对象

每一个 Broker 在启动时会创建 Broker 之间的通道管理器对象(BrokerToControllerChannelManager),用于管理Broker 和 Controller 之间的通信。

3.2.7 创建网络通信对象

每一个 Broker 在启动时会创建自己的网络通信对象(SockerServer),用于和其他 Broker 之间的通信,其中包含了 Java 用于 NIO 通信的 Channel、Selector 对象。

在这里插入图片描述

3.2.8 注册 Broker 节点

Broker启动时,会通过 ZK 客户端对象向 ZK 注册当前的 Broker 节点ID,注册后,创建的 ZK节点为临时节点。如果当前 Broker 的 ZK 客户端断开和ZK的连接,注册的节点会被删除。

3.3 启动控制器

控制器(KafkaController)是每一个 Broker 启动时都会创建的核心对象,用于和ZK 之间建立连接并申请自己为整个 Kafka 集群的 Master 管理者。如果申请成功,那么会完成管理者的初始化操作,并建立和其他 Broker 之间的数据通道接收各种事件,进行封装后交给事件管理器,并定义了 process 方法,用于真正处理各类事件。

在这里插入图片描述

3.3.1 初始化通道管理器

创建通道管理器(ControllerChannelManager),该管理器维护了 Controlelr 和 集群所有Broker 节点之间的网络连接,并向 Broker 发送控制类请求及接受响应。

3.3.2 初始化事件管理器

创建事件管理器(ControllerEventManager)维护了 Controller 和集群所有Broker节点之间的网络连接,并向 Broker 发送控制类请求及接受响应。

3.3.3 初始化状态管理器

创建状态管理器(ControllerChangerHandler)可以监听 /controller 节点的操作,一旦节点创建(ControllerChange),删除(Reelect),数据发生变化(ControllerChange),那么监听后执行相应的处理。

3.3.4 启动控制器

控制器对象启动后,会向事件管理器发送 Startup 事件,事件处理现场接收到事件后会通过 ZK 客户端向 ZK 申请 /controller 节点,申请成功后,执行当前节点成为 Controller 的一系列操作。主要是注册各类 ZooKeeper 监听器、删除日志路径变更和 ISR 副本变更通知事件、启动 Controller 通道管理器,以及启动副本状态机和分区状态机。

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

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

相关文章

python如何随机产生一堆数字并输出

python随机产生一堆数字并输出的方法: 通过for循环语句多次执行for循环里面的“random.randint()”函数产生随机数。将产生的随机数赋值给变量,输出这个变量就可以了 执行结果如下:

vue3与react、 react hooks

一、Vue3新特性:setup、ref、reactive、computed、watch、watchEffect函数、生命周期钩子、自定义hooks函数、toRef和toRefs、shallowReactive 与 shallowRef、readonly 与 shallowReadonly、toRaw 与 markRaw、customRef、provide 与 inject、Fragment、Teleport、…

《基于WebGPU的下一代科学可视化——告别WebGL性能桎梏》

引言:科学可视化的算力革命 当WebGL在2011年首次亮相时,它开启了浏览器端3D渲染的新纪元。然而面对当今十亿级粒子模拟、实时物理仿真和深度学习可视化需求,WebGL的架构瓶颈日益凸显。WebGPU作为下一代Web图形标准,通过显存直存、…

宠物医疗对接DeepSeek详细方案

基于DeepSeek本地化部署技术与医疗场景优化实践 一、核心架构设计 1. 本地化部署与数据安全 私有化服务器部署:将DeepSeek模型部署在宠物医院本地服务器,所有诊疗数据(如宠物病历、影像报告)均存储于院内,避免云端传输风险数据加密机制:采用AES-256加密算法对医疗数据加…

K8s 1.27.1 实战系列(一)准备工作

一、主机规划与硬件要求 1、节点数量 至少需要 3 台服务器(1 台 Master 节点,2 台 Worker 节点)。本地测试可缩容:若仅用于测试,可缩减为 1 个 Master 和 1 个 Worker,但需注意稳定性风险。2、硬件配置 ​Master 节点:建议 2 核 CPU、8GB 内存、80GB 硬盘。​Worker 节…

2.PSCAD是什么软件?

PSCAD(Power Systems Computer Aided Design)是一款功能强大的电力系统仿真软件,广泛应用于电力系统的建模、仿真和分析。它结合了电磁暂态仿真引擎EMTDC(Electromagnetic Transients including DC),能够精…

Stable Diffusion模型Pony系列模型深度解析

Stable Diffusion模型Pony系列模型深度解析 一、技术架构与核心特性 基于SDXL的深度优化 Pony系列模型以SDXL为基础框架,通过针对二次元/动漫风格的微调,强化了在该领域的生成能力,同时保留了对写实场景的兼容性‌。其训练数据特别侧重于人…

FastGPT 引申:混合检索完整实例

文章目录 FastGPT 引申:混合检索完整实例1. 各检索方式的初始结果2. RRF合并过程3. 合并后的结果4. Rerank重排序后5. 最终RRF合并6. 内容总结 FastGPT 引申:混合检索完整实例 下边通过一个简单的例子说明不同检索方式的分值变化过程,假设我…

在MATLAB环境中,对矩阵拼接(Matrix Concatenation)的测试

在MATLAB环境中,对矩阵拼接(Matrix Concatenation)的正确性与鲁棒性开展测试时,需要依据不同的拼接场景精心设计测试用例,全面验证矩阵维度、数据顺序、边界条件以及异常处理等关键方面。以下是详尽的测试方法与具体示…

OpenFeign 学习笔记

OpenFeign 学习笔记 一、基础入门 1.1 简介 OpenFeign 是基于声明式的 REST 客户端,用于简化服务间远程调用。(编程式 REST 客户端(RestTemplate)) 通过接口注解方式定义 HTTP 请求,自动实现服务调用。 …

“沂路畅通”便利服务平台:赋能同城物流,构建高效畅通的货运生态

“沂路畅通”便利服务平台:赋能同城物流,构建高效畅通的货运生态 随着城市化进程的加速,同城物流需求迅速增长,然而货运过程中仍然存在信息不对称、资源浪费、司机服务体验差等痛点。临沂呆马区块链网络科技有限公司(…

去除HTML有序列表(ol)编号的多种解决方案

以下是去除HTML有序列表(ol)编号的多种解决方案&#xff1a; <!DOCTYPE html> <html> <head> <style> /* 基础方案&#xff1a;完全移除编号 */ ol.no-number {list-style-type: none; /* 移除默认编号 */padding-left: 0; /* 移除默认缩进 */…

es如何进行refresh?

在 Elasticsearch 中,refresh 操作的作用是让最近写入的数据可以被搜索到。以下为你介绍几种常见的执行 refresh 操作的方式: 1. 使用 RESTful API 手动刷新 你可以通过向 Elasticsearch 发送 HTTP 请求来手动触发 refresh 操作。可以针对单个索引、多个索引或者所有索引进…

Leetcode 57: 插入区间

Leetcode 57: 插入区间 问题描述&#xff1a; 给定一个非重叠的区间集合 intervals&#xff08;按开始时间升序排列&#xff09;和一个新的区间 newInterval&#xff0c;将新的区间插入到区间集合中并合并重叠的部分&#xff0c;最后返回结果区间集合。 适合面试的解法&#x…

爬虫面试:关于爬虫破解验证码的13个经典面试题

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. ​什么是验证码(CAPTCHA)?它的作用是什么?2. ​常见的验证码类型有哪些?3. ​在爬虫开发中,遇到验证码时通常有哪些解决方案?4. ​如何使用第三方验证码识别服务?请举例说明。5. ​训练自己的验证码识别模型…

Kylin麒麟操作系统服务部署 | NFS服务部署

以下所使用的环境为&#xff1a; 虚拟化软件&#xff1a;VMware Workstation 17 Pro 麒麟系统版本&#xff1a;Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、 NFS服务概述 NFS&#xff08;Network File System&#xff09;&#xff0c;即网络文件系统。是一种使用于…

三参数水质在线分析仪:从源头保障饮用水安全

【TH-ZS03】饮用水安全是人类健康的重要保障&#xff0c;其质量直接关系到人们的生命健康。随着工业化、城市化的快速发展&#xff0c;水体污染问题日益严峻&#xff0c;饮用水安全面临着前所未有的挑战。为了从源头保障饮用水安全&#xff0c;科学、高效的水质监测手段必不可少…

PGlite:浏览器中运行的PostgreSQL

PGlite 是一款基于 WebAssembly&#xff08;WASM&#xff09;构建的轻量级 PostgreSQL 数据库引擎&#xff0c;旨在简化开发者在浏览器、Node.js、Bun 或 Deno 环境中运行 PostgreSQL。PGlite 无需复杂的安装或配置&#xff0c;特别适合开发测试、本地化应用及快速原型设计。 一…

【Spring AOP】_使用注解编写AOP程序

目录 1. 以增加方法执行时间为例使用AOP 1.1 引入AOP依赖 1.2 编写AOP程序 2. AOP的重要概念 3. AOP通知类型与通知方法标注 3.1 在通知方法前使用对应注解 3.2 使用Pointcut注解提取公共切点表达式 3.3 跨类使用切点 3.4 切面类排序 1. 以增加方法执行时间为例使用AO…

C# iText 抽取PDF页特定区域文本内容

开发中需要提取PDF文件某页某区域内的特定文本内容&#xff0c;对于文字转换而成的PDF文件&#xff0c;可以使用iText库&#xff0c;通过Rectangle划定PDF页中特定区域提取文字&#xff0c;思路是将这个Rectangle框定区域放到TextRegionEventFilter过滤器中&#xff0c;代码如下…