kafka_2.13-4.1.1集群安装

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:       []
相关推荐
HAPPY酷1 小时前
C++ 高性能消息服务器实战:融合线程、异步与回调的三大核心设计
java·服务器·c++
愿你天黑有灯下雨有伞1 小时前
Spring Boot 整合 Kafka:生产环境标准配置与最佳实践
java·kafka
宁酱醇1 小时前
ORACLE 练习1
java·开发语言
2501_941982051 小时前
Python开发:外部群消息自动回复
java·前端·数据库
qinaoaini1 小时前
Spring中Aware的用法以及实现
java·数据库·spring
康小庄2 小时前
Java自旋锁与读写锁
java·开发语言·spring boot·python·spring·intellij-idea
沙河板混2 小时前
@Mapper注解和@MapperScan注解
java·spring boot·spring
知识即是力量ol2 小时前
口语八股:MySQL 核心原理系列(一):索引篇
java·数据库·mysql·八股·索引·面试技巧
xifangge20252 小时前
[报错] SpringBoot 启动报错:Port 8080 was already in use 完美解决(Windows/Mac/Linux)
java·windows·spring boot·macos·错误解决