以下是对您提供的配置的完善和优化建议,针对三节点集群(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 → 格式化存储 → 启动所有节点 → 验证元数据 → 功能测试
wget https://archive.apache.org/dist/kafka/3.8.0/kafka_2.12-3.8.0.tgz
mkdir -p /opt/module
上传java kafka 到/opt/module/
mkdir /usr/java
tar xf jdk-8u181-linux-x64.tar.gz -C /usr/java/
cat >/etc/profile.d/myenv.sh<
所有节点安装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
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
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
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 ≥3.8(支持 KRaft 模式,无需依赖 ZooKeeper)
节点配置:3 台独立服务器,已配置 process.roles=broker,controller 和 controller.quorum.voters、node.id
特别注意:advertised.listeners 必须配置为客户端可访问的地址(如公网 IP 或域名)
kafka-storage.sh random-uuid
Output:
SzIhECn-QbCLzIuNxk1A2A
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)
$ cat /data/kafka/meta.properties
#
#Tue Apr 12 07:39:07 CST 2022
node.id=1
version=1
cluster.id=SzIhECn-QbCLzIuNxk1A2A # 集群id
内存配置建议为系统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 根据内存大小修改
# 每个节点依次执行(后台模式)
kafka-server-start.sh -daemon config/server.properties
或
nohup bin/kafka-server-start.sh config/kraft/server.properties 2>&1 &
验证:通过 jps 检查 Kafka 进程是否存在
所有节点配置启动服务
cat > /usr/lib/systemd/system/kafka.service <
#!/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 <
kafka-topics.sh --create \
--bootstrap-server 172.16.0.73:9092 \
--topic test \
--partitions 3 \
--replication-factor 3
验证:使用 kafka-topics.sh --describe 查看分区分布
kafka-topics.sh --bootstrap-server 172.16.0.73:9092 --list
kafka-topics.sh --bootstrap-server 172.16.0.73:9092 --delete --topic test
# 启动控制台生产者
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 将存储数据的日志目录,在准备工作中创建好的目录。