Apache Kafka 作為高吞吐分布式日誌系統,依賴 ZooKeeper 進行元數據管理與協調。本文記錄在 CentOS 上基於 Kafka 0.9.0.0 (Scala 2.11) 與 ZooKeeper 3.4.7,從單節點單 Broker、單節點多 Broker 到三物理節點七 Broker 集群的完整部署、配置、驗證流程。
| 組件 | 版本 |
|---|---|
| Kafka | kafka_2.11-0.9.0.0 |
| ZooKeeper | 3.4.7 (集群模式,參考獨立部署文檔) |
| 主機名 | IP | Broker 數量 | Broker IDs |
|---|---|---|---|
| bjrenrui0001 | 192.168.100.200 | 3 | 1, 2, 3 |
| bjrenrui0002 | 192.168.100.201 | 2 | 4, 5 |
| bjrenrui0003 | 192.168.100.202 | 2 | 6, 7 |
ZooKeeper 集群:bjrenrui0001:2181,bjrenrui0002:2181,bjrenrui0003:2181
cd /mq wget https://mirrors.hust.edu.cn/apache/kafka/0.9.0.0/kafka_2.11-0.9.0.0.tgz tar zxvf kafka_2.11-0.9.0.0.tgz -C /mq/ ln -s /mq/kafka_2.11-0.9.0.0 /mq/kafka mkdir /mq/kafka/logs
config/server.propertiesbroker.id=1 listeners=PLAINTEXT://:9092 port=9092 num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=1048576 socket.receive.buffer.bytes=1048576 socket.request.max.bytes=104857600 log.dirs=/mq/kafka/logs/kafka-logs num.partitions=10 num.recovery.threads.per.data.dir=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 log.cleaner.enable=false zookeeper.connect=bjrenrui0001:2181,bjrenrui0002:2181,bjrenrui0003:2181 zookeeper.connection.timeout.ms=6000
cd /mq/kafka sh bin/kafka-server-start.sh -daemon config/server.properties netstat -ntlp | grep -E '2181|9092' # tcp6 0 0 :::9092 LISTEN 26903/java # tcp6 0 0 :::2181 LISTEN 24532/java
# 創建單副本 Topic sh bin/kafka-topics.sh --create --zookeeper bjrenrui0001:2181,bjrenrui0002:2181,bjrenrui0003:2181 --replication-factor 1 --partitions 1 --topic test # 生產者發送 sh bin/kafka-console-producer.sh --broker-list bjrenrui0001:9092 --topic test > first > message # 消費者接收 (從頭) sh bin/kafka-console-consumer.sh --zookeeper bjrenrui0001:2181,bjrenrui0002:2181,bjrenrui0003:2181 --topic test --from-beginning first message
cp -r /mq/kafka_2.11-0.9.0.0 /mq/kafka_2.11-0.9.0.0_2 cp -r /mq/kafka_2.11-0.9.0.0 /mq/kafka_2.11-0.9.0.0_3 ln -s /mq/kafka_2.11-0.9.0.0_2 /mq/kafka_2 ln -s /mq/kafka_2.11-0.9.0.0_3 /mq/kafka_3
分別修改 kafka_2/config/server.properties (broker.id=2, port=9093) 和 kafka_3/config/server.properties (broker.id=3, port=9094),host.name=bjrenrui0001,log.dirs 指向各自目錄。
sh /mq/kafka_2/bin/kafka-server-start.sh -daemon /mq/kafka_2/config/server.properties sh /mq/kafka_3/bin/kafka-server-start.sh -daemon /mq/kafka_3/config/server.properties netstat -ntlp | grep -E '2181|909[2-9]' # 9092, 9093, 9094 均 LISTEN
sh /mq/kafka/bin/kafka-topics.sh --create --zookeeper bjrenrui0001:2181,bjrenrui0002:2181,bjrenrui0003:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic # 查看分區領導者與副本分布 sh /mq/kafka/bin/kafka-topics.sh --describe --zookeeper bjrenrui0001:2181,bjrenrui0002:2181,bjrenrui0003:2181 --topic my-replicated-topic # Topic: my-replicated-topic Partition: 0 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
關鍵指標:Leader 處理讀寫、Replicas 所有副本、Isr (In-Sync Replicas) 同步正常的副本集合。
解壓 Kafka 包到 /mq/kafka_4、/mq/kafka_5,複製 bjrenrui0001 的配置並修改:
# kafka_4: broker.id=4, port=9095, host.name=bjrenrui0002 # kafka_5: broker.id=5, port=9096, host.name=bjrenrui0002
# kafka_6: broker.id=6, port=9097, host.name=bjrenrui0003 # kafka_7: broker.id=7, port=9098, host.name=bjrenrui0003
# bjrenrui0001 sh /mq/kafka/bin/kafka-server-start.sh -daemon /mq/kafka/config/server.properties sh /mq/kafka_2/bin/kafka-server-start.sh -daemon /mq/kafka_2/config/server.properties sh /mq/kafka_3/bin/kafka-server-start.sh -daemon /mq/kafka_3/config/server.properties # bjrenrui0002 sh /mq/kafka_4/bin/kafka-server-start.sh -daemon /mq/kafka_4/config/server.properties sh /mq/kafka_5/bin/kafka-server-start.sh -daemon /mq/kafka_5/config/server.properties # bjrenrui0003 sh /mq/kafka_6/bin/kafka-server-start.sh -daemon /mq/kafka_6/config/server.properties sh /mq/kafka_7/bin/kafka-server-start.sh -daemon /mq/kafka_7/config/server.properties
# 各節點檢查端口 netstat -ntlp | grep -E '2181|909[2-9]' | sort -k3 # bjrenrui0001: 9092,9093,9094 # bjrenrui0002: 9095,9096 # bjrenrui0003: 9097,9098 # 跨節點生產消費測試 # 生產者 (連接任意 Broker) sh /mq/kafka/bin/kafka-console-producer.sh --broker-list bjrenrui0001:9092 --topic my-replicated-topic # 消費者 (從 bjrenrui0002 的 Broker 4 讀取) sh /mq/kafka_4/bin/kafka-console-consumer.sh --zookeeper bjrenrui0001:2181,bjrenrui0002:2181,bjrenrui0003:2181 --topic my-replicated-topic --from-beginning
| 操作 | 命令 |
|---|---|
| 停止單個 Broker | sh /mq/kafka/bin/kafka-server-stop.sh (慎用:會停掉該節點所有 Broker) |
| 精準停止指定 Broker | ps ax | grep -i 'kafka\.Kafka' | grep java | grep -v grep | awk '{print $1}' | xargs kill -SIGTERM |
| 查看 Topic 詳情 | kafka-topics.sh --describe --zookeeper $ZK --topic $TOPIC |
| 列出所有 Topic | kafka-topics.sh --list --zookeeper $ZK |
| 查看消費組位移 | kafka-consumer-groups.sh --zookeeper $ZK --group $GROUP --describe |
| 修改副本因子 | 需生成 reassignment JSON,使用 kafka-reassign-partitions.sh |
| 優雅關閉 | kafka-server-stop.sh 會等待副本同步完成再關閉 |
KAFKA_HEAP_OPTS="-Xmx4G -Xms4G -XX:MetaspaceSize=256M -XX:+UseG1GC" 設置於啟動腳本或環境變量。log.dirs、使用 XFS/ext4、關閉 atime、預讀設置 blockdev --setra 16384。socket.send.buffer.bytes=1048576、socket.receive.buffer.bytes=1048576、啟用 SO_REUSEPORT (Linux 3.9+)。UnderReplicatedPartitions、OfflinePartitionsController、RequestLatencyMs、BytesIn/OutPerSec、ISR 擴縮頻率。從單 Broker 到跨機房多 Broker,Kafka 部署核心在於:唯一 broker.id、差異化端口/日誌目錄、統一 ZooKeeper 連接串、副本因子 ≤ Broker 數量、ISR 監控。本文通過逐級擴展演示了集群擴容全過程。現代生產環境請直接部署 **Kafka 3.x + KRaft (可選) + Kubernetes Operator (Strimzi/Confluent)**,實現聲明式運維、自動化滾動升級、彈性伸縮。