深色模式
Kafka 部署与 Topic
摘要:Kafka 是分布式的事件流平台,单机跑起来不难,难在理解 broker、topic、分区之间的关系。本文先用 KRaft 模式起一个单机节点完成收发消息,再说明如何扩展为三节点集群与 Topic 的日常管理命令。
适用环境
bash
java -version 2>&1 | head -1 # Kafka 3.x 需要 Java 8/11/17
free -g # 单节点建议 >= 4G 内存
df -h /data # 消息落盘目录,建议独立磁盘
# 到 https://kafka.apache.org/downloads 核对最新稳定版后再下载
curl -LO https://downloads.apache.org/kafka/3.7.0/kafka_2.13-3.7.0.tgz1
2
3
4
5
6
2
3
4
5
6
操作步骤
1. 解压并放到约定目录
bash
sudo tar -xzf kafka_2.13-3.7.0.tgz -C /opt
sudo ln -sfn /opt/kafka_2.13-3.7.0 /opt/kafka
sudo mkdir -p /data/kafka-logs
sudo useradd -r -s /sbin/nologin kafka 2>/dev/null || true
sudo chown -R kafka:kafka /data/kafka-logs /opt/kafka_2.13-3.7.01
2
3
4
5
2
3
4
5
2. 生成集群 ID 并格式化存储(KRaft 模式,无需 ZooKeeper)
bash
KAFKA_CLUSTER_ID=$(/opt/kafka/bin/kafka-storage.sh random-uuid)
echo "cluster.id=$KAFKA_CLUSTER_ID"
sudo -u kafka /opt/kafka/bin/kafka-storage.sh format \
-t $KAFKA_CLUSTER_ID -c /opt/kafka/config/kraft/server.properties1
2
3
4
2
3
4
DANGER
kafka-storage.sh format 会初始化并清空元数据目录。对已有数据的集群重复执行等于删库,只在首次部署或确认可丢弃数据时执行。
3. 启动 broker
bash
sudo -u kafka /opt/kafka/bin/kafka-server-start.sh -daemon \
/opt/kafka/config/kraft/server.properties
sudo tail -f /opt/kafka/logs/server.log # 看到 started (kafka.server.KafkaServer) 即就绪1
2
3
2
3
4. 创建 Topic 并收发消息
bash
# 创建 3 分区、副本因子 1(单机只能为 1)
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--create --topic demo-topic --partitions 3 --replication-factor 1
# 查看与描述
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--describe --topic demo-topic1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
bash
# 生产者(Ctrl+C 结束)
/opt/kafka/bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic demo-topic
# 另开终端消费,--from-beginning 从头读
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic demo-topic --from-beginning1
2
3
4
5
6
2
3
4
5
6
5. 扩展为三节点集群(每台机器重复步骤 1-3,注意两个关键配置)
properties
# /opt/kafka/config/kraft/server.properties
node.id=1 # 三台分别填 1、2、3,必须全局唯一
process.roles=broker,controller
controller.quorum.voters=1@10.0.0.1:9093,2@10.0.0.2:9093,3@10.0.0.3:9093
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
advertised.listeners=PLAINTEXT://10.0.0.1:9092 # 客户端真正连接的地址
log.dirs=/data/kafka-logs1
2
3
4
5
6
7
2
3
4
5
6
7
6. 用 systemd 托管
bash
sudo tee /etc/systemd/system/kafka.service <<'EOF'
[Unit]
Description=Apache Kafka (KRaft)
After=network.target
[Service]
User=kafka
Type=forking
ExecStart=/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now kafka1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
验证
bash
# 1) 进程与端口
systemctl is-active kafka && ss -ltnp | grep 9092
# 2) 元数据是否正常
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic demo-topic
# 3) 端到端:发一条再消费一条
echo "hello-$RANDOM" | /opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 --topic demo-topic
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic demo-topic --from-beginning --max-messages 1
# 4) 三节点时确认 controller 已选出
grep -i 'controller' /opt/kafka/logs/server.log | tail -51
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
常见坑
WARNING
advertised.listeners 配成 localhost,客户端从其他机器连过来时拿到的是 localhost:9092,表现为"能建连但发不出消息"。必须填客户端可路由的真实 IP 或域名。
WARNING
单机环境创建 Topic 时指定 --replication-factor 2 会直接报错,因为副本数不能超过 broker 数。先扩容节点再提高副本因子。
DANGER
多个 broker 配置里 node.id 重复,会导致元数据混乱、分区无法分配,日志里刷 Duplicate node id。上线前逐个核对。