1. 程式人生 > >實戰中kafka叢集遇到的問題並提供的解決方案

實戰中kafka叢集遇到的問題並提供的解決方案

首先提到kafka叢集,不免的會與zookeeper聯絡在一起 。
ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務。它是叢集的管理者,監視著叢集中各個節點的狀態根據節點提交的反饋進行下一步合理操作。最終,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
kafka 通俗的來說是訊息中介軟體 與之類似或是經常使用如:ActiveMg、RabbitMq等 由於是展示實戰的問題,在這就不做過多的介紹(自己查缺補漏)。
總結:搭建kafka叢集 ,首先搭建zookeeper主從copy,再做kafka叢集。有人問我,用單一節點的zookeeper不行嗎?答案是可行的 。但是你想一下,在搭建kafka叢集的同時你的硬體裝置是支援,搭建zookeeper叢集的,你為什麼不把叢集做的更穩定一些呢(將其放到一個zookeeper上。如果zookeeper掛掉怎麼辦)。
綜上所述開幹:
我用的伺服器為:centos7(個人覺得穩定一些)
zookeeper叢集的搭建:

http://zookeeper.apache.org(zookeeper官方網址)
(1)安裝zookeeper
推薦安裝方法 :wget http://mirrors.hust.edu.cn/apache/zookeeper
官方提供的下載路徑供給選擇
http://mirror.bit.edu.cn/apache/zookeeper/

(2)下載完成後,解壓安裝
tar -zxvf zookeeper-3.4.10.tar.gz
(3)修改配置檔案
下載完成找到 zookeeper-3.4.10/conf/ zoo_sample.cfg
將 zoo_sample.cfg copy一份 (cp zoo_sample.cfg zoo.cfg)
尋找修改檔案的路徑 zookeeper-3.4.10/conf/zoo.cfg
tickTime=2000(Zookeeper的時間單元。Zookeeper中所有時間都是以這個時間單元的整數倍去配置的。例如,session的最小超時時間是2*tickTime。(單位:毫秒))
initLimit=10(Observer和Follower啟動時,從Leader同步最新資料時,Leader允許initLimit * tickTime的時間內完成。如果同步的資料量很大,可以相應的把這個值設定的大一些。)
syncLimit=5(表示Follower和Observer與Leader互動時的最大等待時間,只不過是在與leader同步完畢之後,進入正常請求轉發或ping等訊息互動時的超時時間。)
dataDir=/data/zookeeper/data(用於存放記憶體資料快照的資料夾,同時用於叢集的myid檔案也存在這個資料夾裡)
dataLogDir=/data/zookeeper/log(事務日誌寫入該配置指定的目錄,而不是“ dataDir ”所指定的目錄。這將允許使用一個專用的日誌裝置並且幫助我們避免日誌和快照之間的競爭)
clientPort=2181(服務的監聽埠)
server.1=10.0.0.20:6888:5888(表示 Flower 跟 Leader的通訊埠,簡稱服務端內部通訊的埠(預設6888),表示 是選舉埠(預設是5888))
server.2=10.0.0.5:6888:5888 server.3=10.0.0.199:6888:5888

例如

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data //注意要建立對應的目錄
dataLogDir=/data/zookeeper/log //注意要建立對應的目錄
clientPort=2181
server.1=10.0.0.20:6888:5888 //注意 server 後面是 myid 要與myid檔案中的值一致
server.2=10.0.0.5:6888:5888
server.3=10.0.0.199:6888:5888

注意:server 後面是 myid 要與myid檔案中的值一致
(4)配置其餘兩臺伺服器上的zookeeper
與之一樣 直接按第一臺配置就好。
(5)啟動配置好的三臺伺服器
sh zookeeper-3.4.10/bin/zkServer.sh start(啟動)
sh zookeeper-3.4.10/bin/zkServer.sh stop (關閉)
啟動完成後 檢視一下程序
jps
這裡寫圖片描述


表示有zookeeper的程序
或者
ps -ef |grep “zookeeper”
(5)zookeeper叢集測試
sh zookeeper-3.4.10/bin/zkCli.sh
看一下 zookeeper客戶端是否能正常訪問
這裡寫圖片描述

表示 客戶端能夠正常訪問
(6)測試zookeeper的主從copy
sh zookeeper-3.4.10/bin/zkServer.sh status
這裡寫圖片描述
這裡寫圖片描述

看到這就代表zookeeper主從copy 就成功啦

host.name=地址  //broker的主機地址,若是設定了,那麼會繫結到這個地址上,若是沒有,會繫結到所有的介面上,並將其中之一發送到ZK,一般不設定
 #在log.retention.hours=168 //下面新增下面三項
 message.max.byte=5242880 //表示訊息體的最大大小,單位是位元組
 default.replication.factor=3 //訊息備份數目
 replica.fetch.max.bytes=5242880 //replicas每次獲取資料的最大大小
 #設定zookeeper的連線埠
 zookeeper.connect=地址:埠,地址:埠,地址:埠

注意: broker.id 是唯一的
如果出現 kafka 啟動後閃退 ,那麼你要檢查一下 server.porperties中broker.id 是否唯一 。
解決方法 : 修改 server.porperties 的broker.id 然後刪除 log.dirs=/tmp/kafka-logs
下的所有日誌 重啟一下

(3)建立一個producer(用於釋出訊息)
sh bin/kafka-console-producer.sh –broker-list 地址:9092 –topic xxx

(4)檢視主題
bin/kafka-topics.sh –describe –zookeeper 地址:2181
檢視是否有建立的主題 xxx
(5)建立一個 consumer
sh bin/kafka-console-consumer.sh –zookeeper 地址:2181 –topic xxx t –from-beginning
檢視生產者釋出的訊息有沒有釋出成功 ,消費者是否能接受到
這裡寫圖片描述
如果上述完成那麼kafka叢集配置成功!

環境搭載成功!
如果遇到問題 歡迎聯絡作者 : 13071880500