从零开始的 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.rhkb.cn/news/30936.html

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

相关文章

综合使用pandas、numpy、matplotlib、seaborn库做数据分析、挖掘、可视化项目

目录 1.结构化数据挖掘 1.1依赖库导入和数据读取 1.2各品牌机型及售价统计 1.3视频录制规格与价格关联性分析 2.结构化数据预处理 2.1筛选特征 2.2特征标签归一化及编码 1.结构化数据挖掘 1.1依赖库导入和数据读取 导入必要的依赖库,读取 csv 格式数据集转化为 Data…

蓝桥杯题型

蓝桥杯 蓝桥杯题型分类语法基础艺术与篮球(日期问题)时间显示(时间问题)跑步计划(日期问题)偶串(字符)最长子序列(字符)字母数(进制转换)6个0&…

Linux常见指令

Linux常见指令 1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令和rm指令7、man指令8、cp指令9、mv指令10、cat指令11、重定向12、more指令13、less指令14、head指令15、tail指令16、管道17、时间相关指令18、cal指令19、find指令20、grep指令21、zip/unzip指…

C++:入门详解(关于C与C++基本差别)

目录 一.C的第一个程序 二.命名空间(namespace) 1.命名空间的定义与使用: (1)命名空间里可以定义变量,函数,结构体等多种类型 (2)命名空间调用(&#xf…

智能机器人学习机WT3000A AI芯片方案-自然语音交互 打造沉浸式学习体验

一、概述 当AI浪潮席卷全球,教育领域也未能幸免。AI学习机,这个打着“个性化学习”、“精准提分”旗号的新兴产品,正以惊人的速度占领市场。从一线城市到偏远乡镇,从学龄前儿童到高考备考生,AI学习机的广告铺天盖地&am…

字符串相乘——力扣

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2", num2 "3" …

C/C++蓝桥杯算法真题打卡(Day3)

一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …

关于OceanBase与CDH适配的经验分享

CDH是Cloudera早期推出的一个开源平台版本&#xff0c;它实质上成为了Apache Hadoop生态系统内公认的安装与管理平台&#xff0c;专为企业级需求量身打造。CDH为用户提供了即装即用的企业级解决方案。通过整合Hadoop与另外十多项关键开源项目&#xff0c;Cloudera构建了一个功能…

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…

假设检验与置信区间在机器学习中的应用

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 &#x1f4da; 引言 在机器学…

鸿蒙Next-应用检测、安装以及企业内部商店的实现

一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…

Locker 是 Godot 的一个开源插件,它提供了一种快速且可扩展的方式来使用不同的策略保存和加载数据,并且具有开箱即用的 JSON 和加密功能。

一、软件介绍 文末提供下载 Locker 插件是在 Godot 4.3 中创建的框架&#xff0c;旨在简化在 Godot 项目中保存、加载和管理数据的过程。该插件的主要目标之一是对用户自定义开放&#xff0c;允许使用不同的用户定义策略来访问数据。并且具有开箱即用的 JSON 和加密功能。 二、…

(更新完)LPZero: Language Model Zero-cost Proxy Search from Zero

LPZero代码 摘要 神经架构搜索 (NAS) 有助于自动执行有效的神经网络搜索&#xff0c;同时需要大量的计算资源&#xff0c;尤其是对于语言模型。零样本 NAS 利用零成本 (ZC) 代理来估计模型性能&#xff0c;从而显着降低计算需求。然而&#xff0c;现有的 ZC 代理严重依赖于深…

Varlens(手机上的单反)Ver.1.9.3 高级版.apk

Varlens 是一款专业级手机摄影软件&#xff0c;旨在通过丰富的功能和高自由度参数调节&#xff0c;让手机拍摄效果媲美微单相机。以下是核心功能总结&#xff1a; 一、核心功能 专业拍摄模式 支持手动/自动/程序模式&#xff0c;可调节ISO、快门速度、EV、白平衡等参数27 提供…

Unity2017打包出来后的场景一片红

bug展示&#xff1a; 解决办法&#xff1a; Edit——Project Settings——Graphics——添加下面这俩Shader(用于UI展示)即可。

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…

html-表格标签

一、表格标签 1. 表格的主要作用 表格主要用于显示&#xff64;展示数据,因为它可以让数据显示的非常的规整,可读性非常好&#xff61;特别是后台展示数据 的时候,能够熟练运用表格就显得很重要&#xff61;一个清爽简约的表格能够把繁杂的数据表现得很有条理&#xff61; 总…

ROS2-话题学习

强烈推荐教程&#xff1a; 《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili 构建功能包 # create package demo_python_pkg ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 自己写的代码放在./demo_python_pkg/…

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…

Oracle RAC配置原理详解:构建高可用与高性能的数据库集群

在现代企业级应用中&#xff0c;数据库的高可用性和高性能是至关重要的。Oracle Real Application Clusters&#xff08;RAC&#xff09;是Oracle数据库提供的一种集群解决方案&#xff0c;能够将多个数据库实例部署在不同的服务器上&#xff0c;实现负载均衡和故障切换&#x…