kafka_2.13-4.1.1集群安装
本文详细介绍了kafka_2.13-4.1.1集群的安装方法,具备生产级别的参考性。操作系统是
CentOS8
1、环境准备
1.1、机器列表
| 序号 | IP | 节点 | 备注 |
|---|---|---|---|
| 1 | 192.168.31.128 | 0 | kafka节点1 |
| 2 | 192.168.31.130 | 1 | kafka节点2 |
| 3 | 192.168.31.131 | 2 | kafka节点3 |
1.2、关闭防火墙
依次在三台机器上关闭防火墙,如下命令:
shell
# root用户执行 关闭防火墙命令
systemctl stop firewalld
1.3、上传JDK
下载地址:https://github.com/corretto/corretto-21/releases
在三台机器上依次执行
root用户将amazon-corretto-21.0.6.7.1-linux-x64.tar.gz上传至/opt目录下面
shell
# root用户执行
cd /opt
# 执行解压命令
tar -zxvf amazon-corretto-21.0.6.7.1-linux-x64.tar.gz
# 软连
ln -s amazon-corretto-21.0.6.7.1-linux-x64 jdk
1.4、创建kafka用户并配置环境变量
用root用户在三台机器上依次执行
创建用户并设置密码
shell
# root用户执行 创建用户组
groupadd pay
# 创建用户
useradd -g pay kafka
# 配置用户密码, 输入下面的命令后,连续输入两次密码即可
passwd kafka
配置java环境变量
用kafka用户在三台机器上依次执行
shell
# 编辑.bash_profile 文件
vi ~/.bash_profile
# 添加JAVA_HOME这个变量
JAVA_HOME=/opt/jdk
# 并在PATH后面追加:$JAVA_HOME/bin
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin
# 刷新环境变量
source .bash_profile
# 验证一下, 执行java -version命令
java -version
# 输出如下的结果,表示配置成功
openjdk version "21.0.6" 2025-01-21 LTS
OpenJDK Runtime Environment Corretto-21.0.6.7.1 (build 21.0.6+7-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.6.7.1 (build 21.0.6+7-LTS, mixed mode, sharing)
1.5、创建目录并配置权限
在三台机器上依次执行
shell
# 使用root用户执行 创建目录
sudo mkdir -p /data/kafka-logs
sudo mkdir -p /data/kafka/logs
# 设置目录归属权限
sudo chown -R kafka:pay /data/kafka-logs
sudo chown -R kafka:pay /data/kafka/logs
# 可选-用kafka用户验证一下
touch /data/kafka-logs/test.log
# 执行ls -al 显示如下:表示成功
ls -al /data/kafka-logs/test.log
-rw-r--r-- 1 kafka pay 0 Feb 12 17:14 /data/kafka-logs/test.log
2、安装kafka
2.1、安装kafka
下载地址:https://kafka.apache.org/community/downloads/
将下载下来的kafka_2.13-4.1.1.tgz压缩包使用kafka用户依次上传到三台服务器上
shell
# 解压缩
tar -zxvf kafka_2.13-4.1.1.tgz
# 将目录重命名一下
mv kafka_2.13-4.1.1 kafka
2.2、配置Kafka
2.2.1、备份server.properties文件
在三台机器上分别执行
shell
cd ~/kafka/config
mv server.properties server.properties.bak
2.2.2、节点0
properties
############################
# ===== KRaft 模式配置 =====
############################
# 节点角色
# 当前节点同时作为 Broker + Controller(KRaft 集群模式)
process.roles=broker,controller
# 当前节点 ID(必须唯一)
# 三台机器分别配置 0 / 1 / 2
node.id=0
# 是否自动创建 Topic
# 生产环境建议关闭:true-开启 false-关闭
auto.create.topics.enable=false
# KRaft 控制器投票节点列表
# 格式:nodeId@host:controllerPort
# 三台机器全部写上
controller.quorum.voters=0@192.168.31.128:9093,1@192.168.31.130:9093,2@192.168.31.131:9093
############################
# ===== 监听器配置 =====
############################
# Kafka 监听地址
# PLAINTEXT:客户端连接 Broker 使用
# CONTROLLER:KRaft 内部控制器通信使用
listeners=PLAINTEXT://192.168.31.128:9092,CONTROLLER://192.168.31.128:9093
# Broker 之间通信使用的 listener 名称
inter.broker.listener.name=PLAINTEXT
# 对外发布的地址(客户端真正连接的地址)
# 如果有 NAT 或负载均衡必须写成外部可访问地址
advertised.listeners=PLAINTEXT://192.168.31.128:9092
# 指定 Controller 使用的 listener
controller.listener.names=CONTROLLER
# listener 与安全协议映射
# 当前全部使用 PLAINTEXT(生产环境建议使用 SASL_SSL)
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
############################
# ===== 线程配置 =====
############################
# 网络线程数
# 负责处理网络请求
# 4 核 CPU 建议 3 左右
num.network.threads=3
# IO 线程数
# 负责磁盘读写
# 4 核 CPU 建议 8~12
num.io.threads=8
# Broker 数据恢复线程数
# 数据目录恢复使用
# 2 核建议 1~2
num.recovery.threads.per.data.dir=2
############################
# ===== Socket 缓冲区配置 =====
############################
# 发送缓冲区大小
socket.send.buffer.bytes=102400
# 接收缓冲区大小
socket.receive.buffer.bytes=102400
# 单条请求最大大小(100MB)
# 防止消息过大
socket.request.max.bytes=104857600
############################
# ===== 日志存储配置 =====
############################
# Kafka 日志存储目录
# 生产环境建议单独挂载数据盘
log.dirs=/data/kafka-logs
# 默认 Topic 分区数
# 生产环境建议根据吞吐设置
# 例如 8 分区
num.partitions=8
# 单个日志段大小 1GB
log.segment.bytes=1073741824
# 日志保留时间
# 72 小时 = 3 天
log.retention.hours=72
# 日志清理检查间隔(5 分钟)
log.retention.check.interval.ms=300000
############################
# ===== 内部 Topic 配置 =====
############################
# offsets 内部 Topic 副本数
# 必须 >= 3 才能保证高可用
offsets.topic.replication.factor=3
# 事务状态 Topic 副本数
transaction.state.log.replication.factor=3
# 事务状态 Topic 最小 ISR
# 3 副本建议最小 2
transaction.state.log.min.isr=2
# 默认副本数
default.replication.factor=3
2.2.3、节点1
properties
############################
# ===== KRaft 模式配置 =====
############################
# 节点角色
# 当前节点同时作为 Broker + Controller(KRaft 集群模式)
process.roles=broker,controller
# 当前节点 ID(必须唯一)
# 三台机器分别配置 0 / 1 / 2
node.id=1
# 是否自动创建 Topic
# 生产环境建议关闭:true-开启 false-关闭
auto.create.topics.enable=false
# KRaft 控制器投票节点列表
# 格式:nodeId@host:controllerPort
# 三台机器全部写上
controller.quorum.voters=0@192.168.31.128:9093,1@192.168.31.130:9093,2@192.168.31.131:9093
############################
# ===== 监听器配置 =====
############################
# Kafka 监听地址
# PLAINTEXT:客户端连接 Broker 使用
# CONTROLLER:KRaft 内部控制器通信使用
listeners=PLAINTEXT://192.168.31.130:9092,CONTROLLER://192.168.31.130:9093
# Broker 之间通信使用的 listener 名称
inter.broker.listener.name=PLAINTEXT
# 对外发布的地址(客户端真正连接的地址)
# 如果有 NAT 或负载均衡必须写成外部可访问地址
advertised.listeners=PLAINTEXT://192.168.31.130:9092
# 指定 Controller 使用的 listener
controller.listener.names=CONTROLLER
# listener 与安全协议映射
# 当前全部使用 PLAINTEXT(生产环境建议使用 SASL_SSL)
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
############################
# ===== 线程配置 =====
############################
# 网络线程数
# 负责处理网络请求
# 4 核 CPU 建议 3 左右
num.network.threads=3
# IO 线程数
# 负责磁盘读写
# 4 核 CPU 建议 8~12
num.io.threads=8
# Broker 数据恢复线程数
# 数据目录恢复使用
# 2 核建议 1~2
num.recovery.threads.per.data.dir=2
############################
# ===== Socket 缓冲区配置 =====
############################
# 发送缓冲区大小
socket.send.buffer.bytes=102400
# 接收缓冲区大小
socket.receive.buffer.bytes=102400
# 单条请求最大大小(100MB)
# 防止消息过大
socket.request.max.bytes=104857600
############################
# ===== 日志存储配置 =====
############################
# Kafka 日志存储目录
# 生产环境建议单独挂载数据盘
log.dirs=/data/kafka-logs
# 默认 Topic 分区数
# 生产环境建议根据吞吐设置
# 例如 8 分区
num.partitions=8
# 单个日志段大小 1GB
log.segment.bytes=1073741824
# 日志保留时间
# 72 小时 = 3 天
log.retention.hours=72
# 日志清理检查间隔(5 分钟)
log.retention.check.interval.ms=300000
############################
# ===== 内部 Topic 配置 =====
############################
# offsets 内部 Topic 副本数
# 必须 >= 3 才能保证高可用
offsets.topic.replication.factor=3
# 事务状态 Topic 副本数
transaction.state.log.replication.factor=3
# 事务状态 Topic 最小 ISR
# 3 副本建议最小 2
transaction.state.log.min.isr=2
# 默认副本数
default.replication.factor=3
2.2.4、节点2
properties
############################
# ===== KRaft 模式配置 =====
############################
# 节点角色
# 当前节点同时作为 Broker + Controller(KRaft 集群模式)
process.roles=broker,controller
# 当前节点 ID(必须唯一)
# 三台机器分别配置 0 / 1 / 2
node.id=2
# 是否自动创建 Topic
# 生产环境建议关闭:true-开启 false-关闭
auto.create.topics.enable=false
# KRaft 控制器投票节点列表
# 格式:nodeId@host:controllerPort
# 三台机器全部写上
controller.quorum.voters=0@192.168.31.128:9093,1@192.168.31.130:9093,2@192.168.31.131:9093
############################
# ===== 监听器配置 =====
############################
# Kafka 监听地址
# PLAINTEXT:客户端连接 Broker 使用
# CONTROLLER:KRaft 内部控制器通信使用
listeners=PLAINTEXT://192.168.31.131:9092,CONTROLLER://192.168.31.131:9093
# Broker 之间通信使用的 listener 名称
inter.broker.listener.name=PLAINTEXT
# 对外发布的地址(客户端真正连接的地址)
# 如果有 NAT 或负载均衡必须写成外部可访问地址
advertised.listeners=PLAINTEXT://192.168.31.131:9092
# 指定 Controller 使用的 listener
controller.listener.names=CONTROLLER
# listener 与安全协议映射
# 当前全部使用 PLAINTEXT(生产环境建议使用 SASL_SSL)
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
############################
# ===== 线程配置 =====
############################
# 网络线程数
# 负责处理网络请求
# 4 核 CPU 建议 3 左右
num.network.threads=3
# IO 线程数
# 负责磁盘读写
# 4 核 CPU 建议 8~12
num.io.threads=8
# Broker 数据恢复线程数
# 数据目录恢复使用
# 2 核建议 1~2
num.recovery.threads.per.data.dir=2
############################
# ===== Socket 缓冲区配置 =====
############################
# 发送缓冲区大小
socket.send.buffer.bytes=102400
# 接收缓冲区大小
socket.receive.buffer.bytes=102400
# 单条请求最大大小(100MB)
# 防止消息过大
socket.request.max.bytes=104857600
############################
# ===== 日志存储配置 =====
############################
# Kafka 日志存储目录
# 生产环境建议单独挂载数据盘
log.dirs=/data/kafka-logs
# 默认 Topic 分区数
# 生产环境建议根据吞吐设置
# 例如 8 分区
num.partitions=8
# 单个日志段大小 1GB
log.segment.bytes=1073741824
# 日志保留时间
# 72 小时 = 3 天
log.retention.hours=72
# 日志清理检查间隔(5 分钟)
log.retention.check.interval.ms=300000
############################
# ===== 内部 Topic 配置 =====
############################
# offsets 内部 Topic 副本数
# 必须 >= 3 才能保证高可用
offsets.topic.replication.factor=3
# 事务状态 Topic 副本数
transaction.state.log.replication.factor=3
# 事务状态 Topic 最小 ISR
# 3 副本建议最小 2
transaction.state.log.min.isr=2
# 默认副本数
default.replication.factor=3
2.2.5、调整kafka-server-start.sh启动脚本
在三台机器上调整kafka-server-start.sh启动脚本,主要优化JVM的相关参数
脚本目录:~/kafka/bin/kafka-server-start.sh
-
修改
KAFKA_HEAP_OPTS的值为:-Xmx4G -Xms4G -
在
EXTRA_ARGS前面添加:shell# 配置额外的 JVM 性能选项 export KAFKA_JVM_PERFORMANCE_OPTS=" -server -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/kafka/heapdump -Xlog:gc*,gc+heap=info:file=/data/kafka/logs/gc.log:time,uptime:filecount=10,filesize=100M -Djava.awt.headless=true "
2.2.6、生成clusterId 并format
生成clusterId
(只需要执行一次)三台机器上任意一台,执行如下:
shell
# 切换目录
cd ~/kafka/bin
# 执行命令生成
./kafka-storage.sh random-uuid
# 例如生成:
i5m57ZWrTLSWREh1kDMmwg
format
三台机器必须使用同一个clusterId
shell
# 切换目录
cd ~/kafka
# 执行format
./bin/kafka-storage.sh format -t i5m57ZWrTLSWREh1kDMmwg -c config/server.properties
# 执行完成输出如下示例:
Formatting metadata directory /data/kafka-logs with metadata.version 4.1-IV1.
3、启动kafka并验证
3.1、启动
依次在三台机器上执行
shell
cd kafka
./bin/kafka-server-start.sh -daemon config/server.properties
3.2、验证
shell
cd kafka
./bin/kafka-metadata-quorum.sh --bootstrap-server 192.168.31.128:9092 describe --status
# 输出如下,表示集群启动成功:
ClusterId: i5m57ZWrTLSWREh1kDMmwg
LeaderId: 0
LeaderEpoch: 1
HighWatermark: 137
MaxFollowerLag: 0
MaxFollowerLagTimeMs: 0
CurrentVoters: [{"id": 0, "endpoints": ["CONTROLLER://192.168.31.128:9093"]}, {"id": 1, "endpoints": ["CONTROLLER://192.168.31.130:9093"]}, {"id": 2, "endpoints": ["CONTROLLER://192.168.31.131:9093"]}]
CurrentObservers: []