Kafka_2.12-2.5.1叢集搭建與引數調優

bjehp發表於2020-11-08

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

相關文章