Kafka_2.12-2.5.1集群搭建與參數調優

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在很多功能點的實現上有很多巧妙的設計,值得不斷地深入學習和探索~~~

Tags: