当前位置: 首页 > news >正文

Kafka集群搭建的两种方式

目录

1. 依赖Zookeeper搭建集群

1. 下载Kafka二进制文件

2. 更改kafka配置

3. 启动Zookeeper集群和Kafka集群

4. 验证集群

1.创建主题

2. 检查主题是否存在

3. 创建生产者生产数据

4. 创建消费者消费数据

5. 检查Zookeeper中Kafka集群的元数据 

2. 不依赖Zookeeper搭建Kafka集群

1.下载Kafka二进制文件

2.更改Kafka配置

3. 生成meta.properties文件

 4. 启动kafka集群

5. 验证集群

1. 创建主题,并验证主题存在

2. 生产者生产数据

3. 消费者消费数据


1. 依赖Zookeeper搭建集群

在2.8.0版本以前,Kafka集群的搭建依赖于Zookeeper环境,需要将kafka集群节点ip及主题等Kafka相关的元数据存入Zookeeper服务中。所以搭建Kafka集群前,需要先搭建Zookeeper集群。

zookeeper多主机集群搭建icon-default.png?t=N7T8https://blog.csdn.net/dxh9231028/article/details/141052933?spm=1001.2014.3001.5501

1. 下载Kafka二进制文件

搭建完Zookeeper集群后,从Kafka官网下载Kafka二进制文件,这里我们下载最新的3.8.0版本。

然后创建/kafka文件夹,将文件传入该文件夹解压,并将解压后的文件改名为kafka 。

#解压文件
tar -xf ./kafka_2.13-3.8.0.tgz
#更改名字
mv ./kafka_2.13-3.8.0 ./kafka

这里我们搭建三个节点的Kafka集群,所以要再三个主机都进行如上操作。

2. 更改kafka配置

修改kafka/conf/server.properties文件中的如下配置

#集群中kafka节点的唯一id,其他的节点要配置别的id
broker.id=0 #Kafka启动时会向Zookeeper集群进行服务注册,这个配置项记录所有Zookeeper节点的ip和端口,只记录一个localhost也能成功启动,不过为了集群的高可用性,全部配置更好。
zookeeper.connect=ip1:2181,ip2:2181,ip3:2181 #Kafka监听的IP端口,由于现在的主题通常是多网卡环境,所以需要指定ip,早期版本好像可以使用0.0.0.0监听全部的ip,不过这个版本不可以,必须指定明确的ip。
listeners=PLAINTEXT://ip1:9092#kafka日志的存储位置,实际上是Kafka的全部数据,包括Kafka内部存储的消息,以及Kafka集群第一次启动时从Zookeeper中获取的集群元数据。
log.dirs=/path/to/kafka/logs

启动一个简单的集群,Kafka不需要太多的配置,不过实际生产环境中Kafka的部署需要考虑大量因素,需要大量的调整配置,运维难度较大。

3. 启动Zookeeper集群和Kafka集群

如果在Zookeeper集群搭建后已经启动了,这里就不需要在启动了,如果没有启动,不仅可以通过Zookeeper提供的zkServer.sh可执行文件启动,也可以通过Kafka的可执行文件启动。

#启动Zookeeper,如果之前没启动
bin/zookeeper-server-start.sh config/zookeeper.properties#启动kafka
bin/kafka-server-start.sh config/server.properties#后台启动Kafka,不占用当前终端
nohup bin/kafka-server-start.sh config/server.properties > kafka.out 2>&1 &

4. 验证集群

集群启动成功后,我们可以通过创建生产者,生产数据,并在另一个Kafka服务进行消费来验证集群创建是否成功。

1.创建主题

通过调用Kafka的bin目录下的kafka-topic.sh文件创建主题,命令如下。

./bin/kafka-topics.sh --create --topic test-topic --bootstrap-server 192.168.142.20:9092 --replication-factor 3 --partitions 3
#create代表当前执行的创建主题操作
#topic指定创建主题名称
#bootstrap-server指定从哪个kafka服务实例连接集群,可以指定多个,防止某个节点宕机造成指令执行失败。
#replication-factor指定当前主题要复制几份,分给其他Kafka服务实例,当前是三节点集群,我们创建三份,保证每个节点都有该主题数据。
#当复制份数少于集群节点数时会有部分节点没有该主题数据,不过不会影响kafka集群正常消费数据。

创建成功后结果如下图

2. 检查主题是否存在

依旧是调用Kafka-topic.sh文件,检查主题是否存在

./bin/kafka-topics.sh --list --bootstrap-server 192.168.142.21:9092
#list指的是当前是要执行查看主题列表操作
#bootstrap-server指定接入集群的kafka服务地址

这里我们通过第二台主机,连接第二个kafka节点获取主题列表,结果如下

3. 创建生产者生产数据

确定主题存在后,我们再用这台主机,和这个kafka节点服务创建生产者生产数据。

bin/kafka-console-producer.sh --topic test-topic --bootstrap-server 192.168.142.21:9092

 仔细阅读上面的配置解释,这里的配置就不解释了,应该很容易看懂,结果如下

可以看到执行完可执行文件后,会出现特殊的命令行,在这个命令行填写数据并回车,则可以向指定的主题消费数据,这里我生产了三条数据。

4. 创建消费者消费数据

这里我们再用第三台主机和第三个kafka节点服务来消费数据,通过可执行文件kafka-console-consumer.sh执行以下命令

bin/kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server 192.168.142.22:9092

结果如下

可以看到成功消费到生产者生产的数据

5. 检查Zookeeper中Kafka集群的元数据 

通过zkCli.sh执行如下命令连接zookeeper。

./zkCli.sh -server 192.168.142.20

连接后通过调用ls -R / 查看zookeeper中所有的节点信息,内容过长,这里无法截图,直接复制到代码块中,并且删除掉__consumer_offset节点下的所有子节点信息,方便大家查看。

从如下结果可以看到,除了/zookeeper节点外,其他节点均为kafka集群元数据信息,其中/brokers/ids节点由0,1,2三个子节点,分别记录了Kafka集群中每个节点的ip端口等信息,而/brokers/topics下保存了所有主题信息,其中可以看到除了我们创建的test-topic主题外,还有__consumer_offsets主题,这个主题中记录了所有消费者组和其负责的主题分区的对应关系,内容极多,这里为了方便大家观看结果,将其删除,想了解更多可以看我的另一篇文章

Kafka基本概念及消费流程icon-default.png?t=N7T8https://blog.csdn.net/dxh9231028/article/details/141270920?spm=1001.2014.3001.5501

/
/admin
/brokers
/cluster
/config
/consumers
/controller
/controller_epoch
/feature
/isr_change_notification
/latest_producer_id_block
/log_dir_event_notification
/zookeeper
/admin/delete_topics
/brokers/ids
/brokers/seqid
/brokers/topics
/brokers/ids/0
/brokers/ids/1
/brokers/ids/2
/brokers/topics/__consumer_offsets
/brokers/topics/test-topic
/brokers/topics/test-topic/partitions
/brokers/topics/test-topic/partitions/0
/brokers/topics/test-topic/partitions/1
/brokers/topics/test-topic/partitions/2
/brokers/topics/test-topic/partitions/0/state
/brokers/topics/test-topic/partitions/1/state
/brokers/topics/test-topic/partitions/2/state
/cluster/id
/config/brokers
/config/changes
/config/clients
/config/ips
/config/topics
/config/users
/config/topics/__consumer_offsets
/config/topics/test-topic
/zookeeper/config
/zookeeper/quota

2. 不依赖Zookeeper搭建Kafka集群

Kafka 从版本 2.8.0 开始,引入了新的 KRaft 模式,这使得 Kafka 可以在不依赖 ZooKeeper 的情况下部署集群。在传统的 Kafka 架构中,ZooKeeper 用于管理和协调 Kafka 集群中的元数据,例如主题、分区、副本状态等。KRaft 模式则将这些管理功能集成到 Kafka 自身的控制器节点中,消除了对 ZooKeeper 的依赖。

1.下载Kafka二进制文件

第一步仍然是下载解压文件,和之前一样

2.更改Kafka配置

Kafka默认配置是基于Zookeeper的,所以我们首先要删除Zookeeper相关的配置,通过vim命令中/zookeeper查找内容,注释或删除掉相关配置,然后删除掉broker.id,排除了zookeeper模式相关配置的影响后在进行如下配置(不删除可能也不影响启动,不过最好删除,防止其他不可预料的行为)。

#指定 Kafka 节点的角色,可以是broker、controller,或两者兼具。
process.roles=broker,controller#当前节点的唯一id
node.id=1#kafka集群中担任controller角色的kafka服务地址
controller.quorum.voters=1@192.168.142.30:9093,2@192.168.142.31:9093,3@192.168.142.32:9093#当前的节点中由controller角色,则需要配置一个name标识,必须大写
controller.listener.names=CONTROLLER#为上面设置的controller标识设置一个ip地址,这个地址也是controller.quorum.voters中配置的地址
listeners=PLAINTEXT://192.168.142.30:9092,CONTROLLER://192.168.142.30:9093#存储之前存储在Zookeeper中的元数据内容
metadata.log.dir=/var/lib/kafka/meta#配置初始化broker角色的kafka实例的超时时间,默认是30s,这里配置高一点,下面会说原因
initial.broker.registration.timeout.ms=240000

在传统的zookeeper模式下,zookeeper担任着选举leader及各种集群元数据管理的工作,而在新版本的kraft模式下,controller角色的kafka服务实例接替了这一工作,代替zookeeper处理Leader选举以及元数据管理的工作,并将元数据存入metadata.log.dir配置的路径中。

3. 生成meta.properties文件

在传统的zookeeper模式下,kafka集群信息保存在zookeeper中,也就是说只要Kafka实例·将自己的信息注册在zookeeper中,它就是集群的一部分,区分不同集群的根据是不同的zookeeper集群。

而在kraft模式下,kafka并没有像redis或zookeeper那样,将集群中所有节点的ip地址配置到配置文件中,而是通过kafka-storage.sh可执行文件生成meta.properties文件,命令如下

bin/kafka-storage.sh format --config conf/server.properties --cluster-id 123
#config选项指定配置文件路径,获取配置文件中的nodeid
#cluster-id指定一个集群id

实际生产过程中,使用Kafka提供的bin/kafka-storage.sh random-uuid生成这两个id,bin/kafka-storage.sh random-uuid可以生成一个唯一id,用于nodeid或clusterid,这里我们定义简单的nodeid和clusterid用于测试Kafka集群搭建过程。

每个Kafka实例都要执行这个命令,生成一个meta.properties文件,文件内容如下:

#
#Sat Aug 17 02:55:59 PDT 2024
cluster.id=123
version=1
directory.id=AABGMd7o4oHy2t-qzVzhcQ
node.id=1

其中cluster.id就是集群标识,一个集群中的所有Kafka节点实例的meta.properties文件中的cluster.id必须相同,并且node.id必须不同。

Kafka没有像其他中间件那样将节点ip写在配置中,可能的原因是想增加可扩展性。如果将所有ip写在配置中,意味着如果我想新增一个节点则需要修改全部kafka实例的配置文件,而如果像Kafka这样,利用一个文件中的cluster-id选项区分是否是一个集群,这样当想要新增一个Kafka实例时,只需要让新增的Kafka实例生成的meta.properties中的集群id相同即可。

 4. 启动kafka集群

启动kafka集群命令和传统模式一样,都是通过kafka-server-start.sh可执行文件,启动Kafka服务。

bin/kafka-server-start.sh config/server.properties#后台启动
nohup bin/kafka-server-start.sh /path/to/kraft-server.properties > kafka.out 2>&1 &

不同的时,在传统模式下,集群的元数据的处理是靠已经启动的zookeeper,这是各个Kafka实例可以随时启动。而在kraft模式下,集群的元数据处理依赖于controller节点,所以在启动broker角色的Kafka实例之前,必须将controller全部启动完成,然后broker才会正常启动。

但如果节点既是controller,又是broker呢?那么此时这个节点的controller角色将会正常启动,不过由于controller没有全部启动,broker角色无法初始化成功,在这种情况下,该Kafka实例会不断地循环初始化,直到controller节点全部启动后,broker角色才会初始化成功。一旦brocker角色循环初始化的时间超过了超时时间(默认是30s),Kafka服务就会启动失败。

所以在配置项中我们新增一项initial.broker.registration.timeout.ms=240000,将broker初始化的超时时间设置为240s,让我们由充足的时间启动全部的controller角色的Kafka实例。

5. 验证集群

验证集群和之前一样,通过在不同主机和Kafka实例上操作生产者,消费者在主题中生产或消费信息

1. 创建主题,并验证主题存在

2. 生产者生产数据

3. 消费者消费数据

与之前不同的是,kraft模式下,集群相关元数据存储controller角色,在 metadata.log.dir 配置项配置的文件夹下,内容如下

具体内容是什么我也不知道,也没必要深究。

相关文章:

Kafka集群搭建的两种方式

目录 1. 依赖Zookeeper搭建集群 1. 下载Kafka二进制文件 2. 更改kafka配置 3. 启动Zookeeper集群和Kafka集群 4. 验证集群 1.创建主题 2. 检查主题是否存在 3. 创建生产者生产数据 4. 创建消费者消费数据 5. 检查Zookeeper中Kafka集群的元数据 2. 不依赖Zookeeper搭…...

两种变量初始化方法的区别

1. CarriageEntity carriageEntity new CarriageEntity()和 null的区别 1.1 CarriageEntity carriageEntity new CarriageEntity(); 初始化:这行代码创建了一个新的 CarriageEntity 对象,并将其引用赋值给 carriageEntity 变量。对象状态&#xff…...

群晖把硬盘共享给win10(虚拟机或物理机)的两种办法

1. 通过SMB共享 NAS地址:192.168.3.100 打开“此电脑”,在win10地址栏输入 \192.168.3.100\video,提示输入用户名、密码。在video文件夹右击,点击“映射网络驱动器” 在win10电脑上,复制文件到T盘上,在T盘…...

Java-Web面试题汇总

一、TCP 和 UDP 的区别 在网络通信中,TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是两种常见的协议,它们在多个方面存在显著差…...

数字化技术分别有哪些,数字化技术特点和优势是什么?

​随着企业数字化进程的加速,人工智能、工业互联网、低代码等底层技术正全面重塑企业运营生产体系,推动新的生产要素、研发范式和商业模式的建立。 这个变革过程不仅是对原有制造体系的颠覆,而且会影响各行各业的所有细分行业和产业链价值链…...

微服务CI/CD实践(一)环境准备及虚拟机创建

微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)gitlabs部署 微服务CI/CD实践(三)nexus3部署 微服务CI/CD实践(四)数据库,redis,n…...

【SpringBoot】优化慢启动应用的用户体验

通过深入分析SpringBoot中WebServer的启动流程,插入自定义的Loading页面展示逻辑,优化软件使用时的用户体验。 背景 Java本身的特点,再加上开发人员能力差,软件开发工程化程度低等等问题,经过一段时间的迭代之后&…...

String str=“i“ 与 String str=new String (“i“) 一样吗?

String str"i" 与 String strnew String ("i") String str"i" 这种形式声明了一个 String 对象,其中 "i" 字符串字面量直接赋值给 str。在 Java 中,字符串字面量会自动放入字符串常量池中,这是一个…...

【数据结构】二叉树链式结构的实现

前置声明:在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉…...

如何有效找到目标客户群体?

在激烈的市场竞争中,找到并锁定目标客户群体是企业成功的关键。以下是几种有效的策略,帮助您精准定位并吸引目标客户。 1. 明确市场定位与客户画像 首先,企业需要明确市场定位,并绘制详细的客户画像,包括年龄、性别、…...

机器学习-混淆矩阵

文章目录 一、混淆矩阵1.混淆矩阵简介2.混淆矩阵图列 二、混淆矩阵指标1. 准确率(Accuracy)2. 精确率(Precision)3. 召回率(Recall)4. F1分数(F1 Score) 三、总结 一、混淆矩阵 1.混…...

数据结构----栈

一丶概念 只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底 二丶特点 先进后出 FILO first in last out 后进先出 LIFO last in first out 三丶顺序栈 逻辑结构&…...

STL六大组件

STL(Standard Template Library,标准模板库)是C标准库的一部分,提供了丰富且高效的数据结构和算法。STL主要由6大组件构成,分别是容器、算法、迭代器、适配器、仿函数和空间配置器。 容器(Containers&#…...

【机器学习】CNN的数学基础

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 CNN的数学基础1. 引言2. 卷积运算2.1 连续卷积2.2 离散卷积2.3 互相关 3. 激活函…...

最小路径和[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[…...

【题库】——数组 小鱼比可爱

#include<bits/stdc.h> using namespace std; int main() {int n,m,i;cin>>n;int arr[n]; for(i0;i<n;i) {int count 0;cin>>arr[i];for(mi;m>0;m--){if(arr[i]>arr[m])count;} cout<<count<<" "; } return 0; }...

基于飞腾平台的Hbase的安装配置

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…...

【springboot】springboot接口参数全局解密,解决request内容修改后如何重新设置回去的问题

文章目录 核心思路spring&servelt基础核心接口类核心代码 body解密核心原理讲解get解密核心原理讲解get query请求讲解get pathVariables请求讲解 总结 本文不仅介绍了body内容修改后如何传递&#xff0c;也介绍了get请求 在修改内容后如何继续传递。 【原创作者 csdn: 孟秋…...

yml基本语法

YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种简洁且易读的数据序列化格式&#xff0c;常用于配置文件。Spring Boot 中的 application.yml 文件使用 YAML 来配置应用程序的属性。 YAML 基本语法 1. 键值对 基本的键值对表示形式为&#xff1a;key: value…...

橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码

源码名称&#xff1a;酷黑简洁大气体育直播自适应模板赛事直播门户网站 源码开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 带采集&#xff0c;可以挂着电脑上自动采集发布&#xff0c;无需人工操作&#xff01; 橙色简洁大气体育直播自适应模板赛事直播门户…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...