Kafka 3.9.2 KRaft 模式三节点集群完整部署指南

前言

简介

Kafka是一个能够支持高并发以及流式消息处理的消息中间件,并且Kafka天生就是支持集群的,今天就主要来介绍一下如何搭建Kafka集群。

Kafka集群中的节点类型

一个Kafka集群是由下列几种类型的节点构成的,它们充当着不同的作用

Broker节点:即代理节点,是Kafka中的工作节点,充当消息队列的角色,负责储存和处理消息,每个Broker都是一个独立的Kafka服务器,可以在不同的机器上运行,除此之外Broker还负责分区(partition)的管理,将主题(topic)划分为多个分区,并分布在集群的不同Broker

Controller节点:即控制器节点,是集群中的特殊节点,负责储存和管理整个集群元数据和状态,它能够监控整个集群中的Broker,在需要时还能够进行平衡操作

混合节点:即同时担任Broker和Controller节点角色的节点

两种模式的部署方式

zookeeper模式

这是一种比较简单,相对"传统"的搭建方式了!在这种模式下,每个Kafka节点都是依赖于Zookeeper的,使用Zookeeper存储集群中所有节点的元数据。

只要所有的Kafka节点连接到同一个Zookeeper上面(或者同一个Zookeeper集群),这些Kafka节点就构成了一个集群。所以说就算是只有一个Kafka节点在运行,这一个节点也可以称作一个集群。

在Zookeeper模式集群中,Zookeeper节点(或者集群)就充当了Controller的角色,而所有的Kafka节点就充当着Broker的角色。

KRaft模式

KRaft模式是新版本Kafka中推出的集群模式,这种模式下就完全不需要Zookeeper了!只需要数个Kafka节点就可以直接构成集群,在这时集群中的Kafka节点既有可能是Controller节点也可能是Broker节点,在这个模式中,我们不仅可以手动配置某个节点的角色(是Controller还是Broker),还可以使其同时担任Broker和Controller角色(混合节点)。

在KRaft模式中,集群的节点会通过投票选举的方式,选择出一个主要的Controller节点,这个节点也称作领导者,它将负责维护整个集群的元数据和状态信息,那么其它的Controller节点或者混合节点就称之为追随者,它们会从领导者同步集群元数据和状态信息。如果领导者宕机了,所有的节点会重新投票选举一个新的领导者。

在选举过程中,所有的节点都会参与投票过程,而候选节点只会是Controller节点或者混合节点(即Broker节点不会被选举为领导者)。

需要注意的是,在默认情况下Kafka集群中的Broker节点和Controller节点通常会监听不同的端口:

  • Broker节点是Kafka集群中的数据节点(消息队列),它们负责接收客户端的消息和传递消息给客户端,默认情况下,每个Broker节点会监听9092端口,该端口用于与客户端进行通信,客户端可以将消息发送到这个端口,或者从这个端口接收消息,这个端口可以称作客户端通信端口
  • Controller节点是Kafka集群中的控制器节点,负责管理集群的状态和元数据,Controller节点监听的端口通常是9093,该端口用于集群中其他节点获取元数据或在混合节点选举新的Controller时进行通信,通过该端口,其他节点可以与Controller节点交互,获取集群的元数据信息或参与控制器的选举过程,这个端口可以称作控制器端口
  • 混合节点(即同时担任Broker和Controller角色的节点)中,这两个端口都会被使用,默认情况下混合节点将监听9092端口接收和传递消息给客户端,并监听9093端口用于与其他节点进行元数据交换和控制器选举通信,可见混合节点会同时使用两个端口分别作为客户端通信端口与控制器端口

所以需要根据实际情况配置网络设置和防火墙规则,以确保Kafka集群中的节点能够在正确的端口上进行通信。上述提到的两种端口也是可以修改的,当然不建议修改。

同样地,就算是你只是搭建了一个Kafka节点,这一个节点也仍然被视为一个Kafka集群,并且KRaft模式下如果只需要建立一个节点,那么这个节点必须是混合节点。

一、环境准备

1.1 服务器规划

节点 IP地址 主机名 角色 硬件配置
节点1 192.168.1.101 kafka01 Controller+Broker 8C/16G/500G SSD
节点2 192.168.1.102 kafka02 Controller+Broker 8C/16G/500G SSD
节点3 192.168.1.103 kafka03 Controller+Broker 8C/16G/500G SSD

1.2 系统初始化(所有节点执行)

bash 复制代码
# 1. 设置主机名(分别在对应节点执行)
# kafka01 节点
hostnamectl set-hostname kafka01
# kafka02 节点
hostnamectl set-hostname kafka02
# kafka03 节点
hostnamectl set-hostname kafka03

# 2. 配置 hosts 文件(所有节点)
cat >> /etc/hosts << 'EOF'
192.168.1.101 kafka01
192.168.1.102 kafka02
192.168.1.103 kafka03
EOF

# 3. 关闭防火墙(或开放对应端口)
systemctl stop firewalld
systemctl disable firewalld

# 4. 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 5. 配置时间同步
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd

# 6. 安装必要工具
yum install -y wget tar java-11-openjdk java-11-openjdk-devel net-tools telnet

# 7. 验证 Java 版本
java -version
# 应该输出:openjdk version "11.0.x"

二、创建 Kafka 用户和目录

bash 复制代码
# 所有节点执行
# 1. 创建 kafka 用户
useradd -r -s /sbin/nologin kafka

# 2. 创建目录结构
mkdir -p /opt/kafka
mkdir -p /data/kafka/data
mkdir -p /data/kafka/metadata
mkdir -p /var/log/kafka
mkdir -p /etc/kafka/ssl
mkdir -p /etc/kafka/config

# 3. 设置目录权限
chown -R kafka:kafka /opt/kafka
chown -R kafka:kafka /data/kafka
chown -R kafka:kafka /var/log/kafka
chown -R kafka:kafka /etc/kafka

三、下载并安装 Kafka

bash 复制代码
# 所有节点执行
# 1. 下载 Kafka 3.9.2
cd /opt
wget https://archive.apache.org/dist/kafka/3.9.2/kafka_2.13-3.9.2.tgz

# 2. 解压
tar -xzf kafka_2.13-3.9.2.tgz
mv kafka_2.13-3.9.2/* /opt/kafka/
rm -rf kafka_2.13-3.9.2 kafka_2.13-3.9.2.tgz

# 3. 设置权限
chown -R kafka:kafka /opt/kafka

四、生成 SSL 证书(可选,推荐生产环境使用)

4.1 在 kafka01 节点生成 CA 和证书

bash 复制代码
# 创建证书目录
cd /etc/kafka/ssl

# 1. 生成 CA 私钥和证书
openssl req -new -x509 -keyout ca-key -out ca-cert -days 3650 \
    -subj "/CN=Kafka-Security-CA" \
    -passout pass:kafka-ca-password \
    -nodes

# 2. 为每个节点生成证书
for node in kafka01 kafka02 kafka03; do
    echo "生成 $node 证书..."
    
    # 生成 keystore
    keytool -keystore ${node}.keystore.jks -alias localhost \
        -validity 3650 -genkey -keyalg RSA -storetype JKS \
        -dname "CN=${node}" -ext "SAN=DNS:${node},IP:$(grep ${node} /etc/hosts | awk '{print $1}')" \
        -storepass kafka-broker-password -keypass kafka-broker-password
    
    # 生成证书签名请求
    keytool -keystore ${node}.keystore.jks -alias localhost \
        -certreq -file ${node}-cert-req -storepass kafka-broker-password
    
    # 使用 CA 签名
    openssl x509 -req -CA ca-cert -CAkey ca-key \
        -in ${node}-cert-req -out ${node}-cert-signed \
        -days 3650 -CAcreateserial -passin pass:kafka-ca-password
    
    # 导入 CA 证书到 keystore
    keytool -keystore ${node}.keystore.jks -alias CARoot \
        -import -file ca-cert -storepass kafka-broker-password -noprompt
    
    # 导入签名证书到 keystore
    keytool -keystore ${node}.keystore.jks -alias localhost \
        -import -file ${node}-cert-signed -storepass kafka-broker-password -noprompt
    
    # 创建 truststore
    keytool -keystore ${node}.truststore.jks -alias CARoot \
        -import -file ca-cert -storepass kafka-truststore-password -noprompt
    
    # 清理临时文件
    rm -f ${node}-cert-req ${node}-cert-signed
done

# 3. 为客户端生成证书
keytool -keystore client.keystore.jks -alias client \
    -validity 3650 -genkey -keyalg RSA -storetype JKS \
    -dname "CN=kafka-client" \
    -storepass kafka-client-password -keypass kafka-client-password

keytool -keystore client.keystore.jks -alias client \
    -certreq -file client-cert-req -storepass kafka-client-password

openssl x509 -req -CA ca-cert -CAkey ca-key \
    -in client-cert-req -out client-cert-signed \
    -days 3650 -CAcreateserial -passin pass:kafka-ca-password

keytool -keystore client.keystore.jks -alias CARoot \
    -import -file ca-cert -storepass kafka-client-password -noprompt

keytool -keystore client.keystore.jks -alias client \
    -import -file client-cert-signed -storepass kafka-client-password -noprompt

keytool -keystore client.truststore.jks -alias CARoot \
    -import -file ca-cert -storepass kafka-truststore-password -noprompt

rm -f client-cert-req client-cert-signed

# 4. 设置权限
chown -R kafka:kafka /etc/kafka/ssl
chmod 600 /etc/kafka/ssl/*.jks

4.2 分发证书到其他节点

bash 复制代码
# 在 kafka01 节点执行
for node in kafka02 kafka03; do
    # 分发对应节点的证书
    scp /etc/kafka/ssl/${node}.keystore.jks ${node}:/etc/kafka/ssl/
    scp /etc/kafka/ssl/${node}.truststore.jks ${node}:/etc/kafka/ssl/
    # 分发 CA 证书
    scp /etc/kafka/ssl/ca-cert ${node}:/etc/kafka/ssl/
done

# 在各节点设置权限
ssh kafka02 "chown -R kafka:kafka /etc/kafka/ssl && chmod 600 /etc/kafka/ssl/*.jks"
ssh kafka03 "chown -R kafka:kafka /etc/kafka/ssl && chmod 600 /etc/kafka/ssl/*.jks"

五、配置 Kafka

5.1 创建主配置文件(各节点修改 node.id

kafka01 节点 /etc/kafka/server.properties:

properties 复制代码
# ============ 节点标识 ============
node.id=1
process.roles=broker,controller

# ============ 监听器配置 ============
listeners=SASL_SSL://kafka01:9093,CONTROLLER://kafka01:9094
advertised.listeners=SASL_SSL://kafka01:9093
inter.broker.listener.name=SASL_SSL
controller.listener.names=CONTROLLER

# ============ Controller Quorum 配置 ============
controller.quorum.voters=1@kafka01:9094,2@kafka02:9094,3@kafka03:9094
controller.quorum.fetch.timeout.ms=2000
controller.quorum.election.timeout.ms=1000

# ============ 日志存储 ============
log.dirs=/data/kafka/data
metadata.log.dir=/data/kafka/metadata
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

# ============ 副本机制 ============
default.replication.factor=3
min.insync.replicas=2
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2

# ============ SASL/SCRAM 认证配置 ============
sasl.enabled.mechanisms=SCRAM-SHA-256,SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.mechanism.controller.protocol=SCRAM-SHA-256
listener.name.sasl_ssl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.sasl_ssl.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;

# ============ SSL 配置 ============
ssl.keystore.location=/etc/kafka/ssl/kafka01.keystore.jks
ssl.keystore.password=kafka-broker-password
ssl.key.password=kafka-broker-password
ssl.truststore.location=/etc/kafka/ssl/kafka01.truststore.jks
ssl.truststore.password=kafka-truststore-password
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.3
ssl.protocol=TLSv1.3

# ============ 授权配置 ============
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:admin

# ============ 性能优化 ============
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
num.partitions=12
num.recovery.threads.per.data.dir=4

# ============ 其他配置 ============
auto.create.topics.enable=false
delete.topic.enable=true
group.initial.rebalance.delay.ms=3000

kafka02 节点配置差异:

properties 复制代码
node.id=2
listeners=SASL_SSL://kafka02:9093,CONTROLLER://kafka02:9094
advertised.listeners=SASL_SSL://kafka02:9093
ssl.keystore.location=/etc/kafka/ssl/kafka02.keystore.jks
ssl.truststore.location=/etc/kafka/ssl/kafka02.truststore.jks

kafka03 节点配置差异:

properties 复制代码
node.id=3
listeners=SASL_SSL://kafka03:9093,CONTROLLER://kafka03:9094
advertised.listeners=SASL_SSL://kafka03:9093
ssl.keystore.location=/etc/kafka/ssl/kafka03.keystore.jks
ssl.truststore.location=/etc/kafka/ssl/kafka03.truststore.jks

5.2 创建 JAAS 配置文件

所有节点 /etc/kafka/kafka_server_jaas.conf:

bash 复制代码
cat > /etc/kafka/kafka_server_jaas.conf << 'EOF'
KafkaServer {
    org.apache.kafka.common.security.scram.ScramLoginModule required
    username="admin"
    password="admin-initial-password";
};

Controller {
    org.apache.kafka.common.security.scram.ScramLoginModule required
    username="admin"
    password="admin-initial-password";
};
EOF

chown kafka:kafka /etc/kafka/kafka_server_jaas.conf
chmod 600 /etc/kafka/kafka_server_jaas.conf

5.3 创建 systemd 服务文件

所有节点 /etc/systemd/system/kafka.service:

bash 复制代码
cat > /etc/systemd/system/kafka.service << 'EOF'
[Unit]
Description=Apache Kafka
Documentation=http://kafka.apache.org/documentation.html
After=network.target

[Service]
Type=simple
User=kafka
Group=kafka
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk"
Environment="KAFKA_HEAP_OPTS=-Xms4g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
Environment="KAFKA_JVM_PERFORMANCE_OPTS=-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M"
Environment="KAFKA_OPTS=-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf"
ExecStart=/opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=10
LimitNOFILE=1000000
LimitNPROC=65536
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target
EOF

# 重新加载 systemd
systemctl daemon-reload
systemctl enable kafka.service

六、初始化集群

6.1 生成集群 ID(仅在 kafka01 执行)

bash 复制代码
# 在 kafka01 节点执行
# 1. 生成集群 ID
CLUSTER_ID=$(/opt/kafka/bin/kafka-storage.sh random-uuid)
echo "Cluster ID: $CLUSTER_ID"
# 保存集群 ID 到文件,供后续使用
echo $CLUSTER_ID > /etc/kafka/cluster-id
cat /etc/kafka/cluster-id

6.2 格式化元数据存储(所有节点执行)

bash 复制代码
# 所有节点执行
# 使用相同的集群 ID
CLUSTER_ID=$(cat /etc/kafka/cluster-id)

# 格式化元数据存储
/opt/kafka/bin/kafka-storage.sh format \
    -t ${CLUSTER_ID} \
    -c /etc/kafka/server.properties \
    --ignore-formatted

# 验证格式化结果
ls -la /data/kafka/metadata/

七、启动集群

7.1 启动所有节点

bash 复制代码
# 可以同时在所有节点执行,也可以按顺序执行
# 节点1
systemctl start kafka

# 节点2
systemctl start kafka

# 节点3
systemctl start kafka

# 检查服务状态
systemctl status kafka

扩展:命令行启动

复制代码
bin/kafka-server-start.sh -daemon config/kraft/server-1.properties

7.2 验证集群状态

bash 复制代码
# 在任意节点执行
# 1. 查看集群元数据状态
/opt/kafka/bin/kafka-metadata-quorum.sh \
    --bootstrap-server kafka01:9093,kafka02:9093,kafka03:9093 \
    describe --status

# 预期输出:
# ClusterId:              <uuid>
# LeaderId:               1
# LeaderEpoch:            2
# HighWatermark:          100
# MaxFollowerLag:         0
# MaxFollowerLagTimeMs:   0
# CurrentVoters:          [1,2,3]
# CurrentObservers:       []

# 2. 查看日志
tail -f /var/log/kafka/server.log
# 或者
journalctl -u kafka -f

八、创建用户和配置 ACL

8.1 创建管理员配置文件

bash 复制代码
# 在 kafka01 创建管理员客户端配置
cat > /etc/kafka/admin-client.properties << 'EOF'
bootstrap.servers=kafka01:9093,kafka02:9093,kafka03:9093
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-initial-password";
ssl.truststore.location=/etc/kafka/ssl/client.truststore.jks
ssl.truststore.password=kafka-truststore-password
ssl.keystore.location=/etc/kafka/ssl/client.keystore.jks
ssl.keystore.password=kafka-client-password
ssl.key.password=kafka-client-password
ssl.endpoint.identification.algorithm=
EOF

chmod 600 /etc/kafka/admin-client.properties

8.2 创建用户

bash 复制代码
# 1. 更新管理员密码(从初始密码改为正式密码)
/opt/kafka/bin/kafka-configs.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --alter \
    --add-config 'SCRAM-SHA-256=[password=SecureAdmin123!],SCRAM-SHA-512=[password=SecureAdmin123!]' \
    --entity-type users \
    --entity-name admin

# 2. 创建生产者用户
/opt/kafka/bin/kafka-configs.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --alter \
    --add-config 'SCRAM-SHA-256=[password=Producer123!],SCRAM-SHA-512=[password=Producer123!]' \
    --entity-type users \
    --entity-name producer

# 3. 创建消费者用户
/opt/kafka/bin/kafka-configs.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --alter \
    --add-config 'SCRAM-SHA-256=[password=Consumer123!],SCRAM-SHA-512=[password=Consumer123!]' \
    --entity-type users \
    --entity-name consumer

# 4. 验证用户创建
/opt/kafka/bin/kafka-configs.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --describe \
    --entity-type users \
    --entity-name admin

8.3 配置 ACL

bash 复制代码
# 1. 授予管理员所有权限
/opt/kafka/bin/kafka-acls.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --add \
    --allow-principal User:admin \
    --operation All \
    --topic '*' \
    --group '*'

# 2. 授予生产者写入权限
/opt/kafka/bin/kafka-acls.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --add \
    --allow-principal User:producer \
    --producer \
    --topic 'business-*'

# 3. 授予消费者读取权限
/opt/kafka/bin/kafka-acls.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --add \
    --allow-principal User:consumer \
    --consumer \
    --topic 'business-*' \
    --group 'consumer-*'

# 4. 查看 ACL
/opt/kafka/bin/kafka-acls.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --list

九、测试验证

9.1 创建测试 Topic

bash 复制代码
# 使用管理员权限创建 Topic
/opt/kafka/bin/kafka-topics.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --create \
    --topic test-topic \
    --partitions 3 \
    --replication-factor 3

# 查看 Topic 详情
/opt/kafka/bin/kafka-topics.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --describe \
    --topic test-topic

9.2 测试生产者和消费者

bash 复制代码
# 创建生产者配置
cat > /tmp/producer.properties << 'EOF'
bootstrap.servers=kafka01:9093,kafka02:9093,kafka03:9093
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="producer" password="Producer123!";
ssl.truststore.location=/etc/kafka/ssl/client.truststore.jks
ssl.truststore.password=kafka-truststore-password
ssl.keystore.location=/etc/kafka/ssl/client.keystore.jks
ssl.keystore.password=kafka-client-password
ssl.key.password=kafka-client-password
ssl.endpoint.identification.algorithm=
EOF

# 创建消费者配置
cat > /tmp/consumer.properties << 'EOF'
bootstrap.servers=kafka01:9093,kafka02:9093,kafka03:9093
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="consumer" password="Consumer123!";
ssl.truststore.location=/etc/kafka/ssl/client.truststore.jks
ssl.truststore.password=kafka-truststore-password
ssl.keystore.location=/etc/kafka/ssl/client.keystore.jks
ssl.keystore.password=kafka-client-password
ssl.key.password=kafka-client-password
ssl.endpoint.identification.algorithm=
group.id=test-group
EOF

# 测试生产消息
echo "Hello Kafka with Security!" | /opt/kafka/bin/kafka-console-producer.sh \
    --bootstrap-server kafka01:9093 \
    --producer.config /tmp/producer.properties \
    --topic test-topic

# 测试消费消息
/opt/kafka/bin/kafka-console-consumer.sh \
    --bootstrap-server kafka01:9093 \
    --consumer.config /tmp/consumer.properties \
    --topic test-topic \
    --from-beginning \
    --max-messages 1

十、监控配置

10.1 启用 JMX 监控

bash 复制代码
# 修改 systemd 服务文件
cat > /etc/systemd/system/kafka.service << 'EOF'
[Unit]
Description=Apache Kafka
Documentation=http://kafka.apache.org/documentation.html
After=network.target

[Service]
Type=simple
User=kafka
Group=kafka
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk"
Environment="KAFKA_HEAP_OPTS=-Xms4g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
Environment="KAFKA_JVM_PERFORMANCE_OPTS=-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M"
Environment="KAFKA_OPTS=-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf"
Environment="JMX_PORT=9999"
Environment="KAFKA_JMX_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=$(hostname)"
ExecStart=/opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=10
LimitNOFILE=1000000
LimitNPROC=65536
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl restart kafka

十一、常用运维命令

bash 复制代码
# 1. 查看集群状态
/opt/kafka/bin/kafka-metadata-quorum.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    describe --status

# 2. 查看所有 Topic
/opt/kafka/bin/kafka-topics.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --list

# 3. 查看消费者组
/opt/kafka/bin/kafka-consumer-groups.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    --list

# 4. 查看 Broker 信息
/opt/kafka/bin/kafka-broker-api-versions.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties

# 5. 查看日志
tail -f /var/log/kafka/server.log
journalctl -u kafka -f

# 6. 重启服务
systemctl restart kafka

# 7. 查看服务状态
systemctl status kafka

十二、故障排查清单

bash 复制代码
# 1. 检查服务是否启动
systemctl status kafka
ps aux | grep kafka

# 2. 检查端口监听
netstat -tlnp | grep -E '9093|9094'

# 3. 检查日志错误
grep -i error /var/log/kafka/server.log | tail -20
journalctl -u kafka -n 50 --no-pager

# 4. 检查元数据状态
/opt/kafka/bin/kafka-metadata-quorum.sh \
    --bootstrap-server kafka01:9093 \
    --command-config /etc/kafka/admin-client.properties \
    describe --status

# 5. 测试连接
telnet kafka01 9093
telnet kafka01 9094

# 6. 检查 SSL 证书
keytool -list -v -keystore /etc/kafka/ssl/kafka01.keystore.jks \
    -storepass kafka-broker-password | grep -E 'Owner|Valid'

# 7. 验证 SASL 配置
grep -A 5 "sasl" /etc/kafka/server.properties

这个完整的部署指南包含了所有必要的步骤,包括证书生成、服务配置、用户创建和测试验证。按照这个步骤操作,可以成功部署一个安全的三节点 Kafka KRaft 集群。

相关推荐
明快de玄米611 小时前
Kafka 可靠消息投递:核心机制总结
kafka
明快de玄米613 小时前
Kafka:基于 Outbox 的可靠消息投递完整方案
kafka
szephyr1 天前
消息队列入门:RabbitMQ 和 Kafka 到底怎么选,什么时候不该用
后端·架构·kafka·消息队列·rabbitmq
hey you~2 天前
云客服会话数据实时同步,数据库架构怎么设计?
消息队列·数据库架构·高可用·实时同步·最终一致性·云客服·会话数据
A.说学逗唱的Coke3 天前
【大模型专题】别再用 HTTP 直连 Agent 了:用 Kafka 承载 A2A 协议,从 PoC 走到生产
人工智能·kafka·a2a
用户531397318173 天前
[Kafka源码揭秘] 消息写入全链路:网络IO与请求入队
kafka·消息队列
swordbob3 天前
一个 Partition就是一个年级,一个消费者组占用1年级1班,另一个消费者组占用1年级2班,座位号(offset)可以相同,但班级号不同?
kafka
香吧香3 天前
Kafka 三节点集群:只订阅一个 broker 会丢消息吗?能用 VIP订阅 吗?
kafka
雾隐隐o3 天前
Kafka 生产者消息丢失:ACK、重试与可靠发送
kafka