kafka集羣精華之-----安裝配置、擴容、監控

kafka集羣細節支出折磨我死去活來,查看衆多文檔進度緩慢,內容重複,所以站在大佬的肩膀上 整理文檔記錄它。

kafka說明:
一個Topic可以認爲是一類消息,每個topic將被分成多個partition(區),,此外kafka還可以配置partitions需要備份的個數(replicas)。
有多少個partitions就意味着有多少個"leader",kafka會將"leader"均衡的分散在每個實例上,來確保整體的性能穩定。

kafka是通過zookeeper來管理集羣,kafka軟件包內雖然包括了一個簡版的zookeeper,但是功能有限。在生產環境下,直接下載使用官方zookeeper軟件。

說明:由於測試環境機器有限,這裏就在一臺機器上搭建僞集羣環境
(由於遇到的坑太多,在多臺機器上測試過,所以以下筆記的ip可能不一致,自己調整)

所有軟件版本說明:

下面後期會附加配置文件原版

Zookeeper集羣搭建

wget https://mirrors.cnnic.cn/apache/zookeeper/stable/zookeeper-3.4.14.tar.gz
tar -xzf zookeeper-3.4.14.tar.gz
mv zookeeper-3.4.14 /opt/zookeeper/
cd  /opt/zookeeper/
mv zookeeper-3.4.14 zookeeper

進入/opt/zookeeper/ conf目錄下,將zoo_sample.cfg修改爲zoo.cfg(因爲zookeeper啓動時默認讀的配置文件就叫zoo.cfg)
mv zoo_sample.cfg zoo.cfg

zookeeper配置文件說明:

tickTime=2000    #心跳時間,單位:毫秒
initLimit=10         #Follower在啓動時需要在10個心跳時間內從Leader同步數據
syncLimit=5        #超過5個心跳時間收不到Follower的響應,就認爲此Follower已經下線
dataDir=/data/zookeeper/data00    #zookeeper存儲數據的目錄
clientPort=2181                              #zookeeper服務端口
server.0=192.168.6.56:20881:30881
server.1=192.168.6.56:20882:30882
server.2=192.168.6.56:20883:30883

查看配置文件:cat zoo.cfg

tickTime=2000 
initLimit=10
syncLimit=5 
dataDir=/data/zookeeper/data00 
clientPort=2181 
server.0=172.20.20.243:20881:30881
server.1=172.20.20.243:20882:30882
server.2=172.20.20.243:20883:30883

server.0、server.1、server.2 是指整個zookeeper集羣內的節點列表。
server的配置規則爲:server.N=YYY:A:B

N表示服務器編號
YYY表示服務器的IP地址
A爲LF通信端口,表示該服務器與集羣中的leader交換的信息的端口。
B爲選舉端口,表示選舉新leader時服務器間相互通信的端口(當leader掛掉時,其餘服務器會相互通信,選擇出新的leader)

一般來說,集羣中每個服務器的A端口都是一樣,每個服務器的B端口也是一樣。但是當所採用的爲僞集羣時,IP地址都一樣,只能是A端口和B端口不一樣。

zookeeper多節點配置

通過以上配置,一個zookeeper節點就做好了,下面配置多個節點,我們把zookeeper根目錄zookeeper00拷貝多份並重命名

cp -a zookeeper00/ zookeeper01
cp -a zookeeper00/ zookeeper02

針對zookeeper01/conf/zoo.cfg和zookeeper02/conf/zoo.cfg,同樣需要修改上面幾個地方。修改後參數具體如下(由於是在同一臺機器上模擬集羣,所以dataDir、clientPort不能一樣)

zookeeper01/conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5 
dataDir=/data/zookeeper/data01 
clientPort=2182
server.0=192.168.6.56:20881:30881
server.1=192.168.6.56:20882:30882
server.2=192.168.6.56:20883:30883

zookeeper02/conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5 
dataDir=/data/zookeeper/data02 
clientPort=2183
server.0=192.168.6.56:20881:30881
server.1=192.168.6.56:20882:30882
server.2=192.168.6.56:20883:30883

zookeeper數據目錄創建,zookeeper三個節點對應的數據目錄分別爲

mkdir  /data/zookeeper/data00 -p
mkdir  /data/zookeeper/data01 -p
mkdir  /data/zookeeper/data02 -p

創建好對應的目錄後,要分別在這三個目錄下創建一個名爲myid的文件,文件內容只有一個數字,代表zookeeper節點的唯一id,即要確保此id在集羣內唯一,且要跟配置文件中的server.0、server.1、server.2 對應上。

echo 0 >/data/zookeeper/data00/myid
echo 1 >/data/zookeeper/data01/myid
echo 2 >/data/zookeeper/data02/myid

kafka broker集羣搭建

版本選擇有講究,有對應不同的api版本

kafka 下載、解壓

wget http://archive.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz    

wget http://apache.opencas.org/kafka/0.9.0.1/kafka_2.11-2.1.0.tgz

tar -xzf kafka_2.11-0.9.0.0.tgz
mv kafka*  /opt/

kafka broker配置文件修改 /opt/kafka/config/server.properties

broker.id=0                                                    #整個集羣內唯一id號,整數,一般從0開始
listeners=PLAINTEXT://192.168.6.56:9092  #協議、當前broker機器ip、端口,此值可以配置多個,這裏修改爲ip和端口。
port=9092                                             #broker端口
host.name=192.168.6.56                     #broker 機器ip
log.dirs=/data/kafka-logs/kafka00        #kafka存儲數據的目錄
zookeeper.connect=192.168.6.56:2181,192.168.6.56:2182,192.168.6.56:2183
                                                             #zookeeper 集羣列表

kafka broker多節點配置
kafka多節點配置,可以像zookeeper一樣把軟件目錄copy多份,修改各自的配置文件。這裏介紹另外一種方式:同一個軟件目錄程序,但使用不同的配置文件啓動

注意:
使用不同的配置文件啓動多個broker節點,這種方式只適合一臺機器下的僞集羣搭建,在多臺機器的真正集羣就沒有意義了

config/server-1.properties

broker.id=1 
listeners=PLAINTEXT://192.168.6.56:9093
port=9093 
host.name=192.168.6.56
log.dirs=/data/kafka-logs/kafka01 
zookeeper.connect=192.168.6.56:2181,192.168.6.56:2182,192.168.6.56:2183

config/server-2.properties

broker.id=2 
listeners=PLAINTEXT://192.168.6.56:9094
port=9094 
host.name=192.168.6.56
log.dirs=/data/kafka-logs/kafka02 
zookeeper.connect=192.168.6.56:2181,192.168.6.56:2182,192.168.6.56:2183

集羣啓動
(1)zookeeper集羣先啓動,執行

/opt/zookeeper00/bin/zkServer.sh start
/opt/zookeeper01/bin/zkServer.sh start
/opt/zookeeper02/bin/zkServer.sh start

我們可以通過以下命令查看zookeeper是否已啓動:ps -ef | grep zoo.cfg

(2)kafka 集羣后啓動,進入到kafka目錄,執行

cd  /opt/kafka

bin/kafka-server-start.sh -daemon config/server.properties
bin/kafka-server-start.sh -daemon config/server-1.properties
bin/kafka-server-start.sh -daemon config/server-2.properties

"-daemon" 參數代表以守護進程的方式啓動kafka server。

官網及網上大多給的啓動命令是沒有"-daemon"參數,如:“bin/kafka-server-start.sh config/server.properties &”,但是這種方式啓動後,如果用戶退出的ssh連接,進程就有可能結束。

通過以下命令查看kafka server是否已啓動:

ps -ef | grep config

netstat -lntup|grep 90

測試集羣功能

爲了簡單起見,這裏通過命令行的方式啓動生產者和消費者進行測試。

創建一個topic
bin/kafka-topics.sh --create --zookeeper 172.20.20.243:2181,10.0.0.12:2181,10.0.0.13:2181/kafkagroup --replication-factor 3 --partitions 3 --topic test5

查看某個topic詳情
bin/kafka-topics.sh --describe --zookeeper 172.20.20.243:2181/kafkagroup --topic test5

生產者
bin/kafka-console-producer.sh --broker-list 172.20.20.243:9092 --topic test5

消費者

bin/kafka-console-consumer.sh --zookeeper 172.20.20.243:2181/kafkagroup --topic test5 --from-beginning

老版本會報錯,使用kafka版本1.2.2以後,啓動消費者命令變爲:

bin/kafka-console-consumer.sh --bootstrap-server 172.20.20.243:9092 --topic test5 --from-beginning

列出所有的topic :

./kafka-topics.sh --list --zookeeper 172.20.20.243/kafkagroup

**模擬節點宕機

(1)kafka broker集羣某個節點宕機,我們直接通過kill 進程來模擬

[root@elk ~]# netstat -lntup|grep 90
tcp 0 0 172.20.20.243:9092 0.0.0.0: LISTEN 2496/java
tcp 0 0 172.20.20.243:9093 0.0.0.0:
LISTEN 2781/java
tcp 0 0 172.20.20.243:9094 0.0.0.0:* LISTEN 3070/java
[root@elk ~]# kill 2496

經過測試,生產和消費者消息正常。

(2)zookpeer集羣某個節點宕機Kill zookpeer

[root@elk ~]# netstat -lntup|grep 308
tcp        0      0 172.20.20.243:30881        0.0.0.0:*               LISTEN      1457/java           
tcp        0      0 172.20.20.243:30882        0.0.0.0:*               LISTEN      1481/java           
tcp        0      0 172.20.20.243:30883        0.0.0.0:*               LISTEN      1531/java   

[root@elk ~]# kil 1457        

經過測試,生產和消費者消息正常。

注意事項:
當消費者時在命令中只指定了一個zookeeper節點,且模擬zookeeper某個節點宕機時,kill掉的正好又是這個節點。這種情況下消費者會不停的報警告信息,但是不影響消費信息。

參考博文 https://www.jianshu.com/p/dc4770fc34b6


kafka擴容

首先按照搭建步驟,在其他機器上搭建集羣,kafka的配置文件中 zkconnect 要保持與原kafka一致。

  1. 驗證kafka新節點是否加入集羣成功,這個應該去zookeeper的zkCli.sh 去查看。
./zkCli.sh
ls /kafka/brokers/ids
[0, 1, 2]

2.創建了一topic

./kafka-topics.sh --create --zookeeper 172.20.20.243:2181/kafkagroup --replication-factor 1 --partitions 1 --topic test3

3.列出所有topic

./kafka-topics.sh --list --zookeeper 172.20.20.243:2181/kafkagroup

4.修改partiton數量

./kafka-topics.sh --zookeeper 172.20.20.243:2181/kafkagroup --alter --topic test3 --partitions 3

5.查看一個topic的所有詳細信息

bin/kafka-topics.sh --describe --zookeeper 172.20.20.243:2181/kafka --topic mmm

Topic:eee   PartitionCount:3    ReplicationFactor:1 Configs:
    Topic: eee  Partition: 0    Leader: 37  Replicas: 37    Isr: 37
    Topic: eee  Partition: 1    Leader: 37  Replicas: 37    Isr: 37
    Topic: eee  Partition: 2    Leader: 38  Replicas: 38    Isr: 38
  1. 在當前目錄創建一個json文件reassignment-test3.json

加入內容:

{
    "partitions": [
        {
            "topic": "eee",
            "partition": 0,
            "replicas": [
                0,
                1
            ]
        },
        {
            "topic": "eee",
            "partition": 1,
            "replicas": [
                0,
                1,
                2
            ]
        }
    ]
}

7.修改replicas

./kafka-reassign-partitions.sh --zookeeper 172.20.20.243:2181/kafkagroup --reassignment-json-file reassignment-test3.json --execute

8.驗證修改後情況

./kafka-topics.sh --describe --zookeeper 172.20.20.243:2181/kafka --topic mmm

Topic:test3 PartitionCount:3    ReplicationFactor:1 Configs:
    Topic: test3    Partition: 0    Leader: 2   Replicas: 0,1,2 Isr: 2,1,0
    Topic: test3    Partition: 1    Leader: 0   Replicas: 0,1,2 Isr: 0,2,1
    Topic: test3    Partition: 2    Leader: 1   Replicas: 1 Isr: 1

kafka監控

主流的第三方kafka監控程序分別爲:
Kafka Web Conslole、Kafka Manager、KafkaOffsetMonitor、Kafka Eagle

Kafka Web Console這個監控工具,在生產環境中使用,運行一段時間後,發現該工具會和Kafka生產者、消費者、ZooKeeper建立大量連接,從而導致網絡阻塞,監控功能如下:
Brokers列表
Kafka 集羣中 Topic列表,及對應的Partition、LogSiz e等信息
點擊Topic,可以瀏覽對應的Consumer Groups、Offset、Lag等信息
生產和消費流量圖、消息預覽

Kafka Manager雅虎開源的Kafka集羣管理工具,監控功能如下:
管理幾個不同的集羣
監控集羣的狀態(topics, brokers, 副本分佈, 分區分佈)
產生分區分配(Generate partition assignments)基於集羣的當前狀態
重新分配分區

KafkaOffsetMonitor可以實時監控:
Kafka集羣狀態
Topic、Consumer Group列表
圖形化展示topic和consumer之間的關係
圖形化展示consumer的Offset、Lag等信息

總結以上三種監控程序的優缺點:

(1)Kafka Web Console:監控功能較爲全面,可以預覽消息,監控Offset、Lag等信息,存在已知bug,不建議在生產環境中使用。Kafka Web Console:github上已經說明了不再更新了。

(2)KafkaOffsetMonitor:程序一個jar包的形式運行,部署較爲方便。只有監控功能,使用起來也較爲安全。可以監控消費者以及所在分區的offset,幫助分析當前的消費以及生產是否順暢,功能比較單調但界面還可以。

(3)Kafka Manager:偏向Kafka集羣管理,若操作不當,容易導致集羣出現故障。對Kafka實時生產和消費消息是通過JMX實現的。沒有記錄Offset、Lag等信息。以表格的形式展現數據,比較方便用來管理kafka,例如topic的創建、刪除以及分區的管理等。Kafka Eagle是其升級版本,功能豐富,安裝部署以及管理方便。


若只需要監控功能,推薦使用KafkaOffsetMonitor,若偏重Kafka集羣管理,推薦使用Kafka Eagle。

下面主要介紹兩種監控的使用

(1)KafkaOffsetMonitor監控

但是在使用過程中有可能會發現頁面反應緩慢或者無法顯示相應內容的情況。據說這是由於jar包中的某些js等文件需要連接到網絡,或者需要×××導致的。

KafkaOffsetMonitor是Kafka的一款客戶端消費監控工具,用來實時監控Kafka服務的Consumer以及它們所在的Partition中的Offset,我們可以瀏覽當前的消費者組,並且每個Topic的所有Partition的消費情況都可以一目瞭然。

下載地址:https://github.com/quantifind/KafkaOffsetMonitor/releases
mkdir /KafkaMonitor
wget https://github.com/quantifind/KafkaOffsetMonitor/releases/download/v0.2.1/KafkaOffsetMonitor-assembly-0.2.1.jar

通過java編譯命令來運行這個jar包

java -cp KafkaOffsetMonitor-assembly-0.2.1.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb --zk 172.20.20.243:2181,172.20.20.243:2182,172.20.20.243:2183 --port 8088  --refresh 5.seconds --retain 1.days

參數說明:

zk :zookeeper主機地址,如果有多個,用逗號隔開
port :應用程序端口
refresh :應用程序在數據庫中刷新和存儲點的頻率
retain :在db中保留多長時間
dbName :保存的數據庫文件名,默認爲offsetapp

爲了更方便的啓動KafkaOffsetMonitor,可以寫一個啓動腳本來直接運行, kafka-monitor-start.sh的腳本,然後編輯這個腳本:
vim kafka-monitor-start.sh

java -Xms512M -Xmx512M -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m  -cp KafkaOffsetMonitor-assembly-0.2.1.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb \
--port 8088 \
--zk 172.20.20.243:2181,172.20.20.243:2182,172.20.20.243:2183\
--refresh 5.minutes \
--retain 1.day >/dev/null 2>&1;

chmod +x kafka-monitor-start.sh

啓動和檢查:

nohup /data/KafkaMonitor/kafka-monitor-start.sh &
lsof -i:8088

在遊覽器中輸入:http://ip:port即可以查看KafkaOffsetMonitor Web UI
我在測試的時候,數據上報有點問題。

(2)kafka Eagle監控系統的目標是做一個部署簡單,開發容易,使用方便的kafka消息監控系統,可以展示 Kafka 集羣的 Topic 數量,消費者數量,Kafka 的 Brokers 數,以及所屬的 Zookeeper 集羣信息。
帶了監控告警功能,新版本支持釘釘、微信,郵件,但是告警事項有點少,後面應該會使用zabbix細化硬件方面的告警,有模板支持。

搭建過程有參考了以下文檔
https://www.cnblogs.com/yinzhengjie/p/9957389.html
https://www.jianshu.com/p/552ab3e23c96
https://www.cnblogs.com/smartloli/p/9371904.html

安裝包 kafka_2.11-2.1.1.tgz
主目錄 /opt/kafka-eagle

環境變量裏面添加了如下內容,當然也需要jdk支持。

cat /etc/profile

export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

#ADD kafka-Eagle path by xinvwang at 20190407
export KE_HOME=/opt/kafka-eagle
export PATH=$PATH:$KE_HOME/bin

還需要安裝數據庫服務

需要提前創建數據並導入sql文件:(這裏是個大坑,有的版本不支持自動創建數據庫,高版本手動創建庫後 會自動導入sql文件)

mysql -uroot -h127.0.0.1 -p ke< sql/ke.sql

kafka eagle的配置文件如下:
(後期還需要更新,此版本配置有些問題)

cat conf/system-config.properties
kafka.eagle.zk.cluster.alias=prd-ops
prd-ops.zk.list=172.20.20.243:2181,10.0.0.12:2181,10.0.0.13:2181/kafkagroup
kafka.zk.limit.size=25
kafka.eagle.webui.port=8048
kafka.eagle.offset.storage=kafka
kafka.eagle.mail.enable=true
kafka.eagle.mail.sa=alert_sa
[email protected]
kafka.eagle.mail.password=xxx
kafka.eagle.mail.server.host=mail.126.com
kafka.eagle.mail.server.port=25
kafka.eagle.topic.token=keadmin
kafka.eagle.sasl.enable=false
kafka.eagle.sasl.protocol=SASL_PLAINTEXT
kafka.eagle.sasl.mechanism=PLAIN
kafka.eagle.sasl.client=/opt/kafka_eagle/conf/kafka_client_jaas.conf
kafka.eagle.driver=com.mysql.jdbc.Driver
kafka.eagle.url=jdbc:mysql://127.0.0.1:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
kafka.eagle.username=root
kafka.eagle.password=123456

常見報錯信息:

報錯信息:
Could not resolve placeholder 'kafka.eagle.url' in string value "${kafka.eagle.url}"
解決辦法:
配置mysql連接,需要提前導入sql信息

報錯信息:ERROR - Context initialization failed
解決辦法:與zookeeperk的連接信息填寫有問題

kafka數據上報失敗,需要開啓kafka的jmx:
../bin/kafka-server-start.sh 裏面添加如下內容,表示開啓jmx

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-server -Xms2G -Xmx2G -XX:PermSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70"
    export JMX_PORT="9999"
    #export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi

出現問題(consumer 活動信息不正常):數據存儲異常失敗

zookeepeer顯示問題 :授權失敗,配置文件的問題

開啓服務 : ./ke.sh start
檢查服務:  ./ke.sh status
...

啓動正常後,可通過web界面訪問控制檯如下。

博文待補充


常用命令示例:

/opt/zookeeper/bin/zkServer.sh start
cd /opt/kafka/bin
./kafka-server-start.sh -daemon config/server.properties

systemctl start mariadb.service
ke.sh start

當前版本信息說明:

kafka kafka_2.11-2.0.0
zookeeper zookeeper-3.4.8
jdk jdk1.8.0_191

kafka-eagle監控: kafka-eagle-web-1.2.9

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章