【实战】kafka3.X kraft模式集群搭建

文章目录

前言

相信很多同学都用过Kafka2.0吧,其中需要zookepper集群来做元数据管理和集群选举,大大增加了运维成本,而且也很是影响Kafka性能。言归正传今天我们就分享一期Kafka3.x Kraft模式集群搭建,简直不要太爽。

kafka2.0与3.x对比

上图中黑色代表broker(消息代理服务),褐色/蓝色代表Controller(集群控制器服务)

左图(kafka2.0):一个集群所有节点都是broker角色,kafka从三个broker中选举出来一个Controller控制器,控制器将集群元数据信息(比如主题分类、消费进度等)保存到zookeeper,用于集群各节点之间分布式交互。
右图(kafka3.0):假设一个集群有四个broker,指定三个作为Conreoller角色(蓝色),从三个Controller中选举出来一个Controller作为主控制器(褐色),其他的2个备用。zookeeper不再被需要!相关的元数据信息以kafka日志的形式存在(即:以消息队列消息的形式存在)。

controller通信端口:9093, 作用与zk的2181端口类似 。

这样做的好处有以下几个:

  1. Kafka 不再依赖外部框架,而是能够独立运行;
  2. controller 管理集群时,不再需要从 zookeeper 中先读取数据,集群性能上升;
  3. 由于不依赖 zookeeper,集群扩展时不再受到 zookeeper 读写能力限制;

在搭建kafka3.0集群之前, 我们需要先做好kafka实例角色规划。(三个broker, 需要通过主动配置指定三个作为Controller, Controller需要奇数个, 这一点和zk是一样的)

主机名称 ip 角色 node.id
senfel-test 192.168.112.10 broker,controller 1
senfel-test2 192.168.112.130 broker,controller 2
senfel-test3 192.168.112.129 broker,controller 3

准备工作

JDK安装

kafka3.x不再支持JDK8,依然可用,建议安装JDK11或JDK17。

新建kafka持久化日志数据mkdir -p /data/kafka;并保证安装kafka的用户具有该目录的读写权限。

各个机器节点执行:

安装jdk(kafka3.x不再支持JDK8,目前暂时还可以用,建议安装JDK11或JDK17, 这里安装jdk11)

下载安装jdk省略

kafka安装

下载kafka

cd /

mkdir tools

cd tools

wget https://downloads.apache.org/kafka/3.5.2/kafka_2.12-3.5.2.tgz

tar -xf kafka_2.12-3.5.2.tgz

chown -R kafka:kafka kafka_2.12-3.5.2*

mkdir -p /data/kafka

chown -R kafka:kafka /data/kafka

服务器增加hosts

vim /etc/hosts,各个节点,添加如下内容:

192.168.112.10 data-vm1

192.168.112.130 data-vm2

192.168.112.129 data-vm3

修改Kraft协议配置文件

在kafka3.x版本中,使用Kraft协议代替zookeeper进行集群的Controller选举,所以要针对它进行配置。

vim /tools/kafka_2.12-3.5.2/config/kraft/server.properties

具体配置参数如下:

bash 复制代码
# data-vm1节点
node.id=1
process.roles=broker,controller
listeners=PLAINTEXT://data-vm1:9092,CONTROLLER://data-vm1:9093
advertised.listeners=PLAINTEXT://:9092
controller.quorum.voters=1@data-vm1:9093,2@data-vm2:9093,3@data-vm3:9093
log.dirs=/data/kafka/
num.partitions=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=3
bash 复制代码
# data-vm2节点
node.id=2
process.roles=broker,controller
listeners=PLAINTEXT://data-vm2:9092,CONTROLLER://data-vm2:9093
advertised.listeners=PLAINTEXT://:9092
controller.quorum.voters=1@data-vm1:9093,2@data-vm2:9093,3@data-vm3:9093
log.dirs=/data/kafka/
num.partitions=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=3
bash 复制代码
# data-vm3节点
node.id=3
process.roles=broker,controller
listeners=PLAINTEXT://data-vm3:9092,CONTROLLER://data-vm3:9093
advertised.listeners=PLAINTEXT://:9092
controller.quorum.voters=1@data-vm1:9093,2@data-vm2:9093,3@data-vm3:9093
log.dirs=/data/kafka/
num.partitions=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=3

node.id:这将作为集群中的节点 ID,唯一标识,按照我们事先规划好的(上文),在不同的服务器上这个值不同。其实就是kafka2.0中的broker.id,只是在3.0版本中kafka实例不再只担任broker角色,也有可能是controller角色,所以改名叫做node节点。

process.roles:一个节点可以充当broker或controller或两者兼而有之。按照我们事先规划好的(上文),在不同的服务器上这个值不同。多个角色用逗号分开。

listeners: broker将使用9092端口,而kraft controller控制器将使用9093端口。

advertised.listeners: 这里指定kafka通过代理暴漏的地址,如果都是局域网使用,就配置PLAINTEXT://:9092即可。

controller.quorum.voters:这个配置用于指定controller主控选举的投票节点,所有process.roles包含controller角色的规划节点都要参与,即:zimug1、zimug2、zimug3。其配置格式为:node.id1@host1:9093,node.id2@host2:9093

log.dirs:kafka 将存储数据的日志目录,在准备工作中创建好的目录。

num_partitions: 分区,一般根据broker数量进行确定

offset.topic.replication.factor: 副本数,一般根据broker数量进行确定

所有kafka节点都要按照上文中的节点规划进行配置,完成config/kraft/server.properties配置文件的修改。

格式化存储目录

生成一个唯一的集群ID(在一台kafka服务器上执行一次即可),这一个步骤是在安装kafka2.0版本的时候不存在的。

sudo /tools/kafka_2.12-3.5.2/bin/kafka-storage.sh random-uuid

MsBU_ZELT2G0E0oPFX6Gxw

使用生成的集群ID+配置文件格式化存储目录log.dirs,

所以这一步确认配置及路径确实存在,

并且kafka用户有访问权限(检查准备工作是否做对)

主机服务器执行命令:

sudo /tools/kafka_2.12-3.5.2/bin/kafka-storage.sh format

-t MsBU_ZELT2G0E0oPFX6Gxw

-c /tools/kafka_2.12-3.5.2/config/kraft/server.properties

格式化操作完成之后,log.dirs​目录下多出一个Meta.properties文件​,存储了当前的kafka节点的id(node.id),当前节点属于哪个集群(cluster.id)

root@senfel-test tools\]# cd /data/kafka/ \[root@senfel-test kafka\]# ll 总用量 8 -rw-r--r--. 1 root root 249 6月 4 15:46 bootstrap.checkpoint -rw-r--r--. 1 root root 86 6月 4 15:46 meta.properties \[root@senfel-test kafka\]# cat meta.properties #Tue Jun 04 15:46:15 CST 2024 cluster.id=MsBU_ZELT2G0E0oPFX6Gxw version=1 node.id=1 \[root@senfel-test kafka\]# senfel-test2: sudo /tools/kafka_2.12-3.5.2/bin/kafka-storage.sh format -t MsBU_ZELT2G0E0oPFX6Gxw -c /tools/kafka_2.12-3.5.2/config/kraft/server.properties \[root@senfel-test2 tools\]# cd /data/kafka/ \[root@senfel-test2 kafka\]# ll 总用量 8 -rw-r--r--. 1 root root 249 6月 4 15:49 bootstrap.checkpoint -rw-r--r--. 1 root root 86 6月 4 15:49 meta.properties \[root@senfel-test2 kafka\]# cat meta.properties #Tue Jun 04 15:49:55 CST 2024 cluster.id=N2TANgN1TDyZLAbpN36IxA version=1 node.id=2 \[root@senfel-test2 kafka\]# senfel-test3 sudo /tools/kafka_2.12-3.5.2/bin/kafka-storage.sh format -t MsBU_ZELT2G0E0oPFX6Gxw -c /tools/kafka_2.12-3.5.2/config/kraft/server.properties \[root@senfel-test3 /\]# cd /data/kafka/ \[root@senfel-test3 kafka\]# ll 总用量 8 -rw-r--r--. 1 root root 249 6月 4 15:52 bootstrap.checkpoint -rw-r--r--. 1 root root 86 6月 4 15:52 meta.properties \[root@senfel-test3 kafka\]# cat meta.properties #Tue Jun 04 15:52:11 CST 2024 cluster.id=KI0RD9FcQnaXNXeq49Gjuw version=1 node.id=3 \[root@senfel-test3 kafka\]# ### 启动集群 有防火墙记得放行: \[root@senfel-test bin\]# vim /etc/sysconfig/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 9092 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 9093 -j ACCEPT \[root@senfel-test bin\]# systemctl restart iptables 启动命令: /tools/kafka_2.12-3.5.2/bin/kafka-server-start.sh /tools/kafka_2.12-3.5.2/config/kraft/server.properties 后台运行: nohup /tools/kafka_2.12-3.5.2/bin/kafka-server-start.sh /tools/kafka_2.12-3.5.2/config/kraft/server.properties 2\>\&1 \& 脚本: vim kafka-start.sh ```bash #!/bin/bash kafkaServers='data-vm1 data-vm2 data-vm3' #启动所有的kafka for kafka in $kafkaServers do ssh -T $kafka </dev/null 2>&1 & EOF echo 从节点 $kafka 启动kafka3.0...[ done ] sleep 5 done ``` chmod +x kafka-start.sh sh kafka-start.sh ### 停止集群 一键停止kafka集群各节点的脚本,与启动脚本的使用方式及原理是一样的。 停止命令: sudo /tools/kafka_2.12-3.5.2/bin/kafka-server-stop.sh 执行脚本: ```bash #!/bin/bash kafkaServers='data-vm1 data-vm2 data-vm3' #停止所有的kafka for kafka in $kafkaServers do ssh -T $kafka <

相关推荐
简单的心12 小时前
window部署虚拟机VirtualBox来部署flink
大数据·windows·flink
碳基学AI3 小时前
北京大学DeepSeek内部研讨系列:AI在新媒体运营中的应用与挑战|122页PPT下载方法
大数据·人工智能·python·算法·ai·新媒体运营·产品运营
viperrrrrrrrrr73 小时前
大数据学习(105)-Hbase
大数据·学习·hbase
SeaTunnel4 小时前
【同步教程】基于Apache SeaTunnel从MySQL同步到MySQL——Demo方舟计划
大数据·人工智能·apache·etl
老友@6 小时前
Elasticsearch 全面解析
大数据·elasticsearch·搜索引擎
Gvemis⁹7 小时前
Spark Core(二)
大数据·分布式·spark
AWS官方合作商8 小时前
AWS Bedrock:开启企业级生成式AI的钥匙【深度解析】
大数据·人工智能·aws
Flink_China8 小时前
Lalamove基于Flink实时湖仓演进之路
大数据·flink
阿里云大数据AI技术9 小时前
DataWorks智能体Agent发布!基于MCP实现数据开发与治理自动化运行
大数据·mcp