Kafka是目前業界使用最廣泛的訊息佇列。資料流轉常見這樣的業務場景,客戶端把採集到的日誌推送給Kafka,業務方可以消費Kafka的資料落地HDFS,用於離線分析,也可以使用Spark或Flink消費Kafka中的資料,用於實時計算。Kafka在資料流轉過程中發揮著紐帶作用,可用於日誌採集和資料處理系統間的解耦。
本文將介紹搭建Kafka叢集的詳細安裝步驟,並根據日常業務遇到的問題,對Linux系統和Kafka節點的配置引數進行調優。
1. 環境說明
元件 | 版本 | 說明 |
---|---|---|
Kafka | 2.12-2.5.1 | |
Zookeeper | 3.5.8 | 5個節點 |
JDK | 1.8.0_144 |
伺服器配置:
CPU:【2*Intel(R) Xeon(R) Silver 4214 Processor 12 Cores 24 Threads 2.20 GHz】
記憶體:【8*16G DDR4-2666 ECC 1.2v RDIMM】
機械硬碟:【12*4T 7200轉 3.5寸 SATA介面】
網路卡:萬兆網路卡
Linux系統:centos7.6
2.初始化各個節點基礎環境
- 安裝jdk1.8
下載jdk1.8.0_144,並解壓到/usr/local目錄
- 關閉swap
若不關閉swap,記憶體頻繁與磁碟空間交換,會有增加gc時間的風險。
#臨時生效
swapoff -a
#永久生效
echo 'swapoff -a' >> /etc/rc.d/rc.local
- 修改最大檔案開啟數
Linux預設配置的最大檔案開啟數為1024,若Kafka的寫入和消費方比較多,會很容易超過預設值,導致broker異常關閉。
#臨時生效
ulimit -n 102400
#檢視open files 個數
ulimit -a | grep 'open files'
#永久生效
vim /etc/security/limits.conf
* soft nofile 102400
* hard nofile 102400
3.搭建zk叢集
搭建5個節點的zk叢集,可保證在最多掛兩個zk節點的情況下,zk叢集依然可以正常對外提供服務。
zk叢集搭建步驟參見上篇博文:zookeeper-3.5.8叢集搭建
4. 中轉機上配置一份Kafka
下載解壓
從官網下載一份kafka_2.12-2.5.1程式壓縮包,解壓到當前目錄。
修改配置
- 修改bin/kafka-server-start.sh檔案
配置日誌列印目錄、開放JMX埠、依賴的JDK,以及JVM記憶體。
vim bin/kafka-server-start.sh
export LOG_DIR="/var/log/kafka"
export JMX_PORT="2020"
export JAVA_HOME="/usr/local/jdk1.8.0_144"
if [ "x$KAFKA_HE:AP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx6G -Xms6G"
fi
- 修改bin/kafka-run-class.sh
配置JVM的垃圾回收器G1引數。
vim bin/kafka-run-class.sh
export JAVA_HOME="/usr/local/jdk1.8.0_144" #其他指令碼呼叫該shell,需要JDK環境
KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"
- 修改config/server.properties檔案
vim config/server.properties
broker.id=10*
listeners=PLAINTEXT://host_name:9090
# 在寫入量150MB/s,讀取量300MB/s的情況下,使用以下兩個配置,網路執行緒和磁碟IO執行緒平均空閒率大約30%。
num.network.threads=6
num.io.threads=12
log.dirs=/data*/kafka-logs #根據具體情況而定
log.retention.hours=48
zookeeper.connect=zk1.bjehp.com:2181,zk2.bjehp.com:2181,zk3.bjehp.com:2181,zk4.bjehp.com:2181,zk5.bjehp.com:2181/kafka/talos #注意修改zookeeper地址
auto.create.topics.enable=false
default.replication.factor=2
#以下注釋為Kafka預設引數,注意zk的連線時間與超時時間由0.8版本的6s提高到現版本的18s.
#offsets.topic.replication.factor=3
#transaction.state.log.replication.factor=3
#transaction.state.log.min.isr=2
#group.initial.rebalance.delay.ms=3000
#zookeeper.connection.timeout.ms=18000
#zookeeper.session.timeout.ms=18000
5. 在各個節點安裝並啟動Kafka
安裝
- 同步安裝包
將中轉機的Kafka安裝包拷貝到本地/usr/local/目錄
- 根據機器實際情況修改server.properties配置檔案
vim /usr/local/kafka_2.12-2.5.1/config/server.properties
broker.id=10* #修改broker id引數
log.dirs=/data*/kafka-logs #根據實際情況修改log目錄
listeners=SASL_PLAINTEXT://hostname:9090 #修改hostname
啟動並驗證
nohup /usr/local/kafka_2.12-2.5.1/bin/kafka-server-start.sh /usr/local/kafka_2.12-2.5.1/config/server.properties > /dev/null 2>&1 &
ps aux | grep kafka
tailf /var/log/kafka/server.log
netstat -tnlp | grep 9090
netstat -tnlp | grep 2020
停止
/usr/local/kafka_2.12-2.5.1/bin/kafka-server-stop.sh
6.服務運維
定時清除日誌
vim /etc/cron.d/kafka-logclean
# 每天定時清除1天前的kafka日誌檔案
5 4 * * * root find /var/log/kafka/*.log.* -type f -mtime +1 | xargs rm -f
配置監控報警
- 配置伺服器的磁碟、記憶體、cpu load報警
- 配置Kakfa節點埠報警
總結
本文介紹了Kakfa叢集的詳細搭建步驟,以及Linux系統和Kafka節點的引數調優。近些年隨著Kafka版本不斷迭代,之前的舊版本的bug(比如0.8版本)也不斷被修復,並且不斷有新功能湧現,比如流量配額、exactly-once語義等,使得Kafka叢集越來越穩定,這將明顯降低叢集故障。Kafka在很多功能點的實現上有很多巧妙的設計,值得不斷地深入學習和探索~~~