01.生产环境-02-kafka3.8 KRaft模式集群部署

Kafka 3.8 三节点生产环境配置优化(基于 KRaft 模式,8C/16G 内存)‌

以下是对您提供的配置的完善和优化建议,针对三节点集群(IP:172.16.0.73/74/75)和 16GB 内存环境:

环境规划

IP地址 OS 版本 目录 启动方式
172.16.0.73 ubuntu22.04 kafka_2.12-3.8.0 安装目录:/opt/module/kafka
数据目录:systemctl start(stop) kafka
172.16.0.74 同上 同上 同上
172.16.0.75 同上 同上 同上

生产环境部署步骤

官方网址

https://redpanda.com/guides/kafka-tutorial/kafka-without-zookeeper

部署流程

生成集群ID → 格式化存储 → 启动所有节点 → 验证元数据 → 功能测试

一、基础配置

1.1 下载kakfa安装包

wget https://archive.apache.org/dist/kafka/3.8.0/kafka_2.12-3.8.0.tgz

1.2 上传安装包

mkdir -p /opt/module
上传java  kafka 到/opt/module/

1.3 安装JDK8

mkdir /usr/java
tar xf jdk-8u181-linux-x64.tar.gz -C /usr/java/

1.4 配置环境变量

cat >/etc/profile.d/myenv.sh<

二、安装配置Kafka 集群

2.1 安装Kafka

所有节点安装kafka安装包

tar xf kafka_2.12-3.8.0.tgz -C /opt/module/
useradd -m -s /bin/bash kafka

mkdir -p  /datas/kafka
ln -sf /opt/module/kafka_2.12-3.8.0 /opt/module/kakfa

chown kafka -R /opt/module/kafka_2.12-3.8.0 /datas/kafka

2.2 配置kafka

172.16.0.73 节点配置

cat >/opt/module/kafka/config/kraft/server.properties<@:。

min.insync.replicas=2
# 最小同步副本数,用于保证数据的可靠性。

controller-election.enable=true
# 启用控制器选举,确保集群的稳定性。

############################# Socket Server Settings #############################

listeners=PLAINTEXT://172.16.0.73:9092,CONTROLLER://172.16.0.73:9093
# 监听地址,分别用于Broker和Controller通信。

inter.broker.listener.name=PLAINTEXT
# Broker间通信使用的监听器名称。

advertised.listeners=PLAINTEXT://172.16.0.73:9092
# 对外公布的监听地址,用于客户端连接

controller.listener.names=CONTROLLER
# Controller使用的监听器名称

listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
# 监听器与安全协议的映射

num.network.threads=8
# 处理网络请求的线程数。这个数值应该根据服务器的CPU核心数来调整。


num.io.threads=20
# 处理磁盘IO的线程数。这个数值也应该根据服务器的CPU核心数和磁盘性能来调整。

socket.send.buffer.bytes=204800
# 发送套接字缓冲区大小,默认为1024 * 1024 * 2即2MB。

socket.receive.buffer.bytes=204800
# 接收套接字缓冲区大小,默认为1024 * 1024 * 2即2MB。

socket.request.max.bytes=209755200
# 最大请求大小,默认为100 * 1024 * 1024 * 2即200MB。这里增加至128MB以支持更大的消息。


############################# Log Basics #############################

log.dirs=/datas/kafka
# 日志目录,确保有足够的磁盘空间。
# 建议挂载多块磁盘,例如:/data/kafka1,/data/kafka2

num.partitions=16
# 默认分区数,根据需求调整。

num.recovery.threads.per.data.dir=1
# 恢复线程数,根据磁盘性能调整。增加恢复线程数以加快启动和关闭时的日志恢复速度

############################# Internal Topic Settings  #############################

offsets.topic.replication.factor=3
# 偏移量主题复制因子,通常设置为集群大小。

transaction.state.log.replication.factor=3
# 事务状态日志复制因子,通常设置为集群大小。

transaction.state.log.min.isr=2
# 事务状态日志最小ISR,保证数据可靠性。

############################# Log Flush Policy #############################

log.flush.interval.messages=10000
# 消息刷盘间隔,默认为10000,表示每10000条消息刷盘一次。

log.flush.interval.ms=1000
# 时间刷盘间隔,默认为1000ms。这里保持默认值。

############################# Log Retention Policy #############################

log.retention.hours=168
# 日志保留时间 7 天,根据存储需求和法规要求调整。

log.segment.bytes=1073741824
# 日志段大小 1GB(默认值),根据性能和存储需求调整。

log.retention.check.interval.ms=300000
# 日志保留策略检查间隔,根据需求调整。

############################# Other Settings #############################

auto.create.topics.enable=true
# 是否自动创建主题,根据管理策略调整。

default.replication.factor=3
# 默认复制因子,根据集群大小调整。

replication.factor=3
# 复制因子,根据集群大小调整。

unclean.leader.election.enable=false
# 是否允许非ISR副本成为领导者,通常设置为false以保证数据一致性。

message.max.bytes=10485760
# 最大单消息大小 10MB,根据需求调整。

fetch.max.bytes=10485760
# 最大获取字节,根据网络和性能需求调整。

EOF

172.16.0.74 节点配置

参数修改

broker.id=2
listeners=PLAINTEXT://172.16.0.74:9092,CONTROLLER://172.16.0.74:9093
advertised.listeners=PLAINTEXT://172.16.0.74:9092

完整配置

cat >/opt/module/kafka/config/kraft/server.properties<@:。

min.insync.replicas=2
# 最小同步副本数,用于保证数据的可靠性。

controller-election.enable=true
# 启用控制器选举,确保集群的稳定性。

############################# Socket Server Settings #############################

listeners=PLAINTEXT://172.16.0.74:9092,CONTROLLER://172.16.0.74:9093
# 监听地址,分别用于Broker和Controller通信。

inter.broker.listener.name=PLAINTEXT
# Broker间通信使用的监听器名称。

advertised.listeners=PLAINTEXT://172.16.0.74:9092
# 对外公布的监听地址,用于客户端连接

controller.listener.names=CONTROLLER
# Controller使用的监听器名称

listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
# 监听器与安全协议的映射

num.network.threads=8
# 处理网络请求的线程数。这个数值应该根据服务器的CPU核心数来调整。


num.io.threads=20
# 处理磁盘IO的线程数。这个数值也应该根据服务器的CPU核心数和磁盘性能来调整。

socket.send.buffer.bytes=204800
# 发送套接字缓冲区大小,默认为1024 * 1024 * 2即2MB。

socket.receive.buffer.bytes=204800
# 接收套接字缓冲区大小,默认为1024 * 1024 * 2即2MB。

socket.request.max.bytes=209755200
# 最大请求大小,默认为100 * 1024 * 1024 * 2即200MB。这里增加至128MB以支持更大的消息。


############################# Log Basics #############################

log.dirs=/datas/kafka
# 日志目录,确保有足够的磁盘空间。
# 建议挂载多块磁盘,例如:/data/kafka1,/data/kafka2

num.partitions=16
# 默认分区数,根据需求调整。

num.recovery.threads.per.data.dir=1
# 恢复线程数,根据磁盘性能调整。增加恢复线程数以加快启动和关闭时的日志恢复速度

############################# Internal Topic Settings  #############################

offsets.topic.replication.factor=3
# 偏移量主题复制因子,通常设置为集群大小。

transaction.state.log.replication.factor=3
# 事务状态日志复制因子,通常设置为集群大小。

transaction.state.log.min.isr=2
# 事务状态日志最小ISR,保证数据可靠性。

############################# Log Flush Policy #############################

log.flush.interval.messages=10000
# 消息刷盘间隔,默认为10000,表示每10000条消息刷盘一次。

log.flush.interval.ms=1000
# 时间刷盘间隔,默认为1000ms。这里保持默认值。

############################# Log Retention Policy #############################

log.retention.hours=168
# 日志保留时间 7 天,根据存储需求和法规要求调整。

log.segment.bytes=1073741824
# 日志段大小 1GB(默认值),根据性能和存储需求调整。

log.retention.check.interval.ms=300000
# 日志保留策略检查间隔,根据需求调整。

############################# Other Settings #############################

auto.create.topics.enable=true
# 是否自动创建主题,根据管理策略调整。

default.replication.factor=3
# 默认复制因子,根据集群大小调整。

replication.factor=3
# 复制因子,根据集群大小调整。

unclean.leader.election.enable=false
# 是否允许非ISR副本成为领导者,通常设置为false以保证数据一致性。

message.max.bytes=10485760
# 最大单消息大小 10MB,根据需求调整。

fetch.max.bytes=10485760
# 最大获取字节,根据网络和性能需求调整。


EOF

172.16.0.75 节点配置

参数修改

node.id=3
listeners=PLAINTEXT://172.16.0.75:9092,CONTROLLER://172.16.0.75:9093
advertised.listeners=PLAINTEXT://172.16.0.75:9092

完整配置

cat >/opt/module/kafka/config/kraft/server.properties<@:。

min.insync.replicas=2
# 最小同步副本数,用于保证数据的可靠性。

controller-election.enable=true
# 启用控制器选举,确保集群的稳定性。

############################# Socket Server Settings #############################

listeners=PLAINTEXT://172.16.0.75:9092,CONTROLLER://172.16.0.75:9093
# 监听地址,分别用于Broker和Controller通信。

inter.broker.listener.name=PLAINTEXT
# Broker间通信使用的监听器名称。

advertised.listeners=PLAINTEXT://172.16.0.75:9092
# 对外公布的监听地址,用于客户端连接

controller.listener.names=CONTROLLER
# Controller使用的监听器名称

listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
# 监听器与安全协议的映射

num.network.threads=8
# 处理网络请求的线程数。这个数值应该根据服务器的CPU核心数来调整。

num.io.threads=20
# 处理磁盘IO的线程数。这个数值也应该根据服务器的CPU核心数和磁盘性能来调整。

socket.send.buffer.bytes=204800
# 发送套接字缓冲区大小,默认为1024 * 1024 * 2即2MB。

socket.receive.buffer.bytes=204800
# 接收套接字缓冲区大小,默认为1024 * 1024 * 2即2MB。

socket.request.max.bytes=209755200
# 最大请求大小,默认为100 * 1024 * 1024 * 2即200MB。这里增加至128MB以支持更大的消息。


############################# Log Basics #############################

log.dirs=/datas/kafka
# 日志目录,确保有足够的磁盘空间。
# 建议挂载多块磁盘,例如:/data/kafka1,/data/kafka2

num.partitions=16
# 默认分区数,根据需求调整。

num.recovery.threads.per.data.dir=1
# 恢复线程数,根据磁盘性能调整。增加恢复线程数以加快启动和关闭时的日志恢复速度

############################# Internal Topic Settings  #############################

offsets.topic.replication.factor=3
# 偏移量主题复制因子,通常设置为集群大小。

transaction.state.log.replication.factor=3
# 事务状态日志复制因子,通常设置为集群大小。

transaction.state.log.min.isr=2
# 事务状态日志最小ISR,保证数据可靠性。

############################# Log Flush Policy #############################

log.flush.interval.messages=10000
# 消息刷盘间隔,默认为10000,表示每10000条消息刷盘一次。

log.flush.interval.ms=1000
# 时间刷盘间隔,默认为1000ms。这里保持默认值。

############################# Log Retention Policy #############################

log.retention.hours=168
# 日志保留时间 7 天,根据存储需求和法规要求调整。

log.segment.bytes=1073741824
# 日志段大小 1GB(默认值),根据性能和存储需求调整。

log.retention.check.interval.ms=300000
# 日志保留策略检查间隔,根据需求调整。

############################# Other Settings #############################

auto.create.topics.enable=true
# 是否自动创建主题,根据管理策略调整。

default.replication.factor=3
# 默认复制因子,根据集群大小调整。

replication.factor=3
# 复制因子,根据集群大小调整。

unclean.leader.election.enable=false
# 是否允许非ISR副本成为领导者,通常设置为false以保证数据一致性。

message.max.bytes=10485760
# 最大单消息大小 10MB,根据需求调整。

fetch.max.bytes=10485760
# 最大获取字节,根据网络和性能需求调整。

EOF

三、‌Kafka 4.0 手动启动顺序(KRaft 模式)

环境要求

‌版本‌:Kafka ≥3.8(支持 KRaft 模式,无需依赖 ZooKeeper)‌
‌节点配置‌:3 台独立服务器,已配置 process.roles=broker,controller 和 controller.quorum.voters、node.id
‌特别注意‌:advertised.listeners 必须配置为客户端可访问的地址(如公网 IP 或域名)

3.1 初始化元数据

1. 生成一个唯一的集群ID(在一台kafka服务器上执行一次即可)

kafka-storage.sh random-uuid  
Output:
SzIhECn-QbCLzIuNxk1A2A 

2. 所有节点格式化存储目录

kafka-storage.sh format -t <生成的集群ID> -c config/server.properties 

kafka3.8 
kafka-storage.sh format -t SzIhECn-QbCLzIuNxk1A2A -c ./config/kraft/server.properties   

注:确认配置及路径确实存在,并且kafka用户有访问权限(检查准备工作是否做对)
格式化操作完成之后,log.dirs目录下多出一个Meta.properties文件,存储了当前的kafka节点的id(node.id),当前节点属于哪个集群(cluster.id)

3. 查看元数据

$ cat /data/kafka/meta.properties
#
#Tue Apr 12 07:39:07 CST 2022
node.id=1
version=1
cluster.id=SzIhECn-QbCLzIuNxk1A2A   # 集群id

4. 修改启动内存参数

内存配置建议为系统50%-60%

所有节点

vi /opt/module/kafka/bin/kafka-server-start.sh

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx8G -Xms8G"
    export JMX_PORT="9999"
fi

指定堆大小,默认是1GB 根据内存大小修改

5. 启动所有节点

# 每个节点依次执行(后台模式)  
kafka-server-start.sh -daemon config/server.properties  
或
nohup bin/kafka-server-start.sh config/kraft/server.properties 2>&1 &

验证:通过 jps 检查 Kafka 进程是否存在‌

6. 配置Systemctl 启用服务

所有节点配置启动服务

cat > /usr/lib/systemd/system/kafka.service <

7. 其它启动 kafka


#!/bin/bash

kafkaServers='ip1 ip2 ip3'
kafkaHome='/opt/module/kafka'

start_kafka() {
    for kafka in $kafkaServers
    do
        ssh -T $kafka </dev/null 2>&1 &
EOF
        echo "从节点 $kafka 启动kafka...[ done ]"
        sleep 5
    done
}

stop_kafka() {
    for kafka in $kafkaServers
    do
        ssh -T $kafka <

四、功能验证

1、创建 Topic

  1. 创建 Topic
kafka-topics.sh --create \
  --bootstrap-server 172.16.0.73:9092 \
  --topic test \
  --partitions 3 \
  --replication-factor 3

验证:使用 kafka-topics.sh --describe 查看分区分布‌

  1. 查看Topic
kafka-topics.sh --bootstrap-server 172.16.0.73:9092 --list 
  1. 删除Topic
kafka-topics.sh --bootstrap-server 172.16.0.73:9092 --delete --topic  test

2、生产消息测试

# 启动控制台生产者 
kafka-console-producer.sh --topic test --bootstrap-server 172.16.0.73:9092 
>hello kafka 
# 启动控制台消费者
kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server 172.16.0.73:9092 
>hello kafka

在生产者控制台输入hello kafka,消费者控制台,就可以消费到生产者的消息,输出 hello kafka,表示消费端成功消费了生产者生产的消息!

–bootstrap-server 可以指定集群任意一个节,或所有节点
–replication-factor 指定副本数,必须小于等于集群节点数,否则报错
–partitions 指定分区数,如果设置3个分区,则最多3个消费者同时消费信息

五、注意事项‌

‌启动顺序‌:所有节点需同时启动或按任意顺序启动(KRaft 模式支持动态节点加入)‌
‌端口开放‌:确保节点间 9092(Broker)和 9093(控制器通信)端口互通‌
‌日志检查‌:监控启动日志 logs/server.log,排查配置错误或网络问题‌

配置说明

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 将存储数据的日志目录,在准备工作中创建好的目录。

你可能感兴趣的:(中间件应用,中间件,kafka)