首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

CentOS 部署 Kafka 集群完整實踐:ZooKeeper 依賴、單節點到多節點多 Broker 擴展

     編輯:PHP 相關知識

CentOS 部署 Kafka 集群完整實踐:ZooKeeper 依賴、單節點到多節點多 Broker 擴展

Apache Kafka 作為高吞吐分布式日誌系統,依賴 ZooKeeper 進行元數據管理與協調。本文記錄在 CentOS 上基於 Kafka 0.9.0.0 (Scala 2.11) 與 ZooKeeper 3.4.7,從單節點單 Broker、單節點多 Broker 到三物理節點七 Broker 集群的完整部署、配置、驗證流程。

版本與拓撲規劃

組件版本
Kafkakafka_2.11-0.9.0.0
ZooKeeper3.4.7 (集群模式,參考獨立部署文檔)
主機名IPBroker 數量Broker IDs
bjrenrui0001192.168.100.20031, 2, 3
bjrenrui0002192.168.100.20124, 5
bjrenrui0003192.168.100.20226, 7

ZooKeeper 集群:bjrenrui0001:2181,bjrenrui0002:2181,bjrenrui0003:2181

階段一:單節點單 Broker (bjrenrui0001)

1. 下載解壓並創建軟鏈接

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

2. 核心配置 config/server.properties

broker.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

3. 啟動與驗證

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

4. 創建 Topic、生產消費測試

# 創建單副本 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

階段二:單節點多 Broker (bjrenrui0001 上運行 3 個 Broker)

1. 複製配置目錄並修改端口/ID

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 指向各自目錄。

2. 啟動新 Broker

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

3. 創建 3 副本 Topic 驗證高可用

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) 同步正常的副本集合。

階段三:多節點多 Broker (三物理機共 7 Broker)

1. bjrenrui0002 部署 Broker 4、5

解壓 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

2. bjrenrui0003 部署 Broker 6、7

# kafka_6: broker.id=6, port=9097, host.name=bjrenrui0003
# kafka_7: broker.id=7, port=9098, host.name=bjrenrui0003

3. 統一啟動所有 Broker

# 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

4. 集群驗證

# 各節點檢查端口
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

運維關鍵命令匯總

操作命令
停止單個 Brokersh /mq/kafka/bin/kafka-server-stop.sh (慎用:會停掉該節點所有 Broker)
精準停止指定 Brokerps 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
列出所有 Topickafka-topics.sh --list --zookeeper $ZK
查看消費組位移kafka-consumer-groups.sh --zookeeper $ZK --group $GROUP --describe
修改副本因子需生成 reassignment JSON,使用 kafka-reassign-partitions.sh
優雅關閉kafka-server-stop.sh 會等待副本同步完成再關閉

生產環境優化建議

  1. JVM 參數調優:KAFKA_HEAP_OPTS="-Xmx4G -Xms4G -XX:MetaspaceSize=256M -XX:+UseG1GC" 設置於啟動腳本或環境變量。
  2. 磁盤與文件系統:獨立磁盤掛載 log.dirs、使用 XFS/ext4、關閉 atime、預讀設置 blockdev --setra 16384。
  3. 網絡優化:socket.send.buffer.bytes=1048576、socket.receive.buffer.bytes=1048576、啟用 SO_REUSEPORT (Linux 3.9+)。
  4. 監控指標:UnderReplicatedPartitions、OfflinePartitionsController、RequestLatencyMs、BytesIn/OutPerSec、ISR 擴縮頻率。
  5. 安全加固:SASL_SSL 認證加密、ACL 授權、防火牆僅放行 Broker 間及 Client 訪問端口。
  6. 版本升級:0.9.0.0 極其古老,**生產必須升級至 2.8+ / 3.x (KRaft 模式可選)**,獲得事務、精確一次語義、Tiered Storage、KRaft 去 ZooKeeper 等特性。

總結

從單 Broker 到跨機房多 Broker,Kafka 部署核心在於:唯一 broker.id、差異化端口/日誌目錄、統一 ZooKeeper 連接串、副本因子 ≤ Broker 數量、ISR 監控。本文通過逐級擴展演示了集群擴容全過程。現代生產環境請直接部署 **Kafka 3.x + KRaft (可選) + Kubernetes Operator (Strimzi/Confluent)**,實現聲明式運維、自動化滾動升級、彈性伸縮。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved