搭建kafka集群詳細教程

kafka集群搭建

網絡上的博客質量參差不齊,對新手很不友好,我參考了一些博客文檔后,重新寫了一遍kafka的搭建教程,包括zookeeper的搭建教程,還附上了遇到的一些常見錯誤的解決方案。
我使用了3臺虛擬機,因為kafka需要zookeeper的支持,所以虛擬機上需要事先搭建好zookeeper的集群,具體步驟見 《搭建zookeeper集群》。主要參考了這兩個教程: 教程一(三臺虛擬機)教程二(兩臺虛擬機)

1. 軟件環(huán)境

  1. CenOS7 虛擬機三臺。
  2. 已經搭建好的zookeeper集群。
  3. 軟件版本:kafka_2.11-1.0.0

2. 創(chuàng)建目錄并下載安裝軟件

1.創(chuàng)建目錄

cd /opt
mkdir kafka #創(chuàng)建項目目錄
cd kafka
mkdir kafkalogs #創(chuàng)建kafka消息目錄,主要存放kafka消息

  1. 下載軟件
    我用的是xshell工具將下載好的軟件傳送到虛擬機的,放在了/opt/kafka/目錄下,并解壓:

tar -zxvf kafka_2.11-1.0.0.tgz

3. 修改配置文件

3.1 進入到config目錄

cd /opt/kafka/kafka_2.11-1.0.0/config/

我們主要關心的文件只有一個:server.properties,我們可以發(fā)現在這個目錄下有很多文件,還有zookeeper的文件。我們可以直接使用kafka自帶的zookeeper集群來啟動,但是考慮到未來的項目需求,建議使用獨立的zookeeper集群。

-rw-r--r--. 1 root root 906 Oct 27 08:56 connect-console-sink.properties
-rw-r--r--. 1 root root 909 Oct 27 08:56 connect-console-source.properties
-rw-r--r--. 1 root root 5807 Oct 27 08:56 connect-distributed.properties
-rw-r--r--. 1 root root 883 Oct 27 08:56 connect-file-sink.properties
-rw-r--r--. 1 root root 881 Oct 27 08:56 connect-file-source.properties
-rw-r--r--. 1 root root 1111 Oct 27 08:56 connect-log4j.properties
-rw-r--r--. 1 root root 2730 Oct 27 08:56 connect-standalone.properties
-rw-r--r--. 1 root root 1221 Oct 27 08:56 consumer.properties
-rw-r--r--. 1 root root 4727 Oct 27 08:56 log4j.properties
-rw-r--r--. 1 root root 1919 Oct 27 08:56 producer.properties
-rw-r--r--. 1 root root 7030 Nov 22 18:10 server.properties
-rw-r--r--. 1 root root 1032 Oct 27 08:56 tools-log4j.properties
-rw-r--r--. 1 root root 1023 Oct 27 08:56 zookeeper.properties

3.2 修改配置文件server.properties

需要說明的是,我現在是在虛擬機1上進行的操作,同樣的操作要在三臺虛擬機上都執(zhí)行,只是有些細微的配置不同,其他配置信息完全相同。對于不同虛擬機上有差異的部分,我會一一指出。下面修改配置文件:

// 打開配置文件
vim server.properties
// 修改配置文件
broker.id=1
/* 這是這臺虛擬機上的值,在另外兩臺虛擬機上應該是2或者3,這個值是唯一的,每臺虛擬機或者叫服務器不能相同。 /
/
設置本機IP和端口。 我這里設置的是listeners,也可以直接設置host.name=192.168.172.10,port=19292,這個IP地址也是與本機相關的,每臺服務器上設置為自己的IP地址。 /
listeners=PLAINTEXT://192.168.172.10:19092
// 該端口默認是9092,我為了加深理解,沒有設置為默認值。
// 在og.retention.hours=168下面新增下面三項
message.max.byte=5242880
default.replication.factor=2
replica.fetch.max.bytes=5242880
/
設置zookeeper的連接端口,新版本的kafka不再使用zookeeper而是通過brokerlist的配置讓producer直接連接broker,這個brokerlist可以配置多個,只要有一個能連接上,就可以讓producer獲取道集群中的其他broker的信息,繞過了zookeeper。因此這個zookeeper.connect可以設置多個值 */
zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181

也就是說,zookeeper.connect 指的是zookeeper集群的地址,可以是多個,多個之間用逗號分割
配置文件的詳細信息見參考鏈接

4. 啟動kafka集群并測試

4.1 啟動服務

首先要啟動kafka集群,并且是三臺都要手動去啟動。

// 進入kafka的bin目錄
cd /opt/kafka/kafka_2.11-1.0.0/bin/
// 啟動kafka
./kafka-server-start.sh -daemon ../config/server.properties

-daemon代表著以后臺模式運行kafka集群,這樣kafka的啟動就不會影響我們繼續(xù)在控制臺輸入命令。

4.2 檢查服務是否啟動

執(zhí)行命令jps,顯示出了正在運行Kafka這個進程,進程號是4855。在運行這個命令時,你可能會出現錯誤,顯示jps command not found。文章的最后給出了解決方案。

jps
4161 QuorumPeerMain
4855 Kafka
6809 Jps

4.3 創(chuàng)建topic來驗證是否創(chuàng)建成功

  1. 創(chuàng)建topic

./kafka-topics.sh --create --zookeeper 192.168.172.10:12181 --replication-factor 2 --partitions 1 --topic my-topic

參數解釋:

--replication-factor 2 // 復制兩份
--partitions 1 // 創(chuàng)建1個分區(qū)
--topic // 主題為my-topic
-- --zookeeper // 此處為為zookeeper監(jiān)聽的地址

  1. 創(chuàng)建生產者producer

./kafka-console-producer.sh --broker-list 192.168.172.10:19092 --topic my-topic //`這個IP地址可以寫brokerlist中的任意一個

此時,console處于阻塞狀態(tài),可以直接輸入數據。

  1. 創(chuàng)建消費者
    此時要切換到另一臺虛擬機的shell界面輸入以下命令:

./kafka-console-consumer.sh --zookeeper 192.168.172.10:12181 --topic my-topic --from-beginning

此時,一旦有數據生成,此處的console中就會顯示數據。

5. 遇到的問題

5.1 端口輸入錯誤

[root@localhost bin]# ./kafka-topics.sh --create --zookeeper 192.168.172.10 --replication-factor 2 --partitions 1 --topic my-topic
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
[2017-11-22 17:45:59,726] WARN Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn) java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)

at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)  
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)  

這是因為在輸入創(chuàng)建topic命令時,端口輸入錯誤了,./kafka-topics.sh --create --zookeeper 192.168.172.10 --replication-factor 2 --partitions 1 --topic my-topic。這里邊只輸入了IP地址192.168.172.10,沒有輸入端口號:12181。這個IP地址+端口號是在/opt/kafka/kafka_2.11-1.0.0/config/server.properties文件中的zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181設置的任意一個地址即可。
參考鏈接: 主參考輔助參考,還有一個參考

5.2 topic名字寫錯

[root@localhost bin]# ./kafka-console-producer.sh --broker-list 192.168.172.10:19092--topic
shuaige
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Missing required argument "[topic]"

這個問題是因為我的topic名字寫錯了。我是照著這兩個教程搭建kafka集群的:Kafka【第一篇】Kafka集群搭建kafka集群環(huán)境搭建。第二篇幾乎是抄的第一篇。由于這兩個文檔的topic名字不一樣,我在虛擬機1上創(chuàng)建的topic名字是用的教程一的my-topic,創(chuàng)建生產者時用的卻是教程二的shuaige,所以才報錯。可見kafka的生產者和消費者是通過topic進行連接的,而不是kafka的IP地址。
PS:教程一Kafka【第一篇】Kafka集群搭建是目前為止看到的寫的最好的kafka集群搭建的教程,其他博客都有錯誤,無法復現。

5.3 啟動console消費者后界面卡住不動

創(chuàng)建consumer后不能消費生產者的消息,卡住了

[root@localhost bin]# ./kafka-console-consumer.sh --zookeeper 192.168.172.10:12181 --topic my-topic --from-beginning
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
// 卡在了上邊這句話不動 了

其中下面這段提示不用管它。跟JVM有關系,是一些openJDK默認的設置,具體我也沒懂。感興趣這里有解釋:參考1參考2

OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N

產生錯誤的原因是我在虛擬機1啟動生產者的時候用的命令:./kafka-console-producer.sh --broker-list 192.168.172.10:12181 --topic my-topic,注意這里我寫的端口號是12181。當我將生產者啟動時的端口參數設為19092,消費者啟動時的端口參數設為12181時,就可以成功的進行生產者和消費者的通信。

關于生產者和消費者的端口設置,這個教程里有比較簡明的講解:kafka快速上手
在zookeeper的配置文件zoo.cfg中,zookeeper會開發(fā)一個clientPort=12181(這是我自己設置的值)端口給消費者使用,其實也可以給生產者使用,但是在0.8.0版本后,producer不再通過zookeeper連接broker,而是通過brokerlist的配置(在kafka的server.properties文件中,我設置的值為zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181)直接和broker連接,只要能和一個broker連接上,就能夠獲取到集群中其他broker的信息,繞過了zookeeper。

5.4 linux下jps command not found

jps命令可以列出本機所有java進程的pid (jps命令講解)。我運行jps命令時出現:

-bash: jps: command not found

網上好多例子都是說因為jdk里有jps可執(zhí)行文件,只是沒有放在環(huán)境變量里。使用root身份vi /etc/profile,然后在下面加一行export PATH="usr/java/jdk160_05/bin:$PATH"(其中jdk160_05是你的安裝目錄,依你自己的安裝情況所決定),然后source /etc/profile即可解決。
但是對我的CentOS7虛擬機不起作用,我覺得這是當你自己安裝jdk后jps命令無法運行時可以這樣解決,但是有人試驗過,自己安裝jdk成功后,一般jps命令就已經好使了。
所以說,一般輸入jps后報-bash: jps: command not found的都是Linux自帶的jdk,下面以我的CentOS7的解決方法為例。需要安裝java-1.X.X-openjdk-devel這個包,他提供了jps這個工具。

[root@localhost lib]# yum list | grep jdk-devel
java-1.8.0-openjdk-devel.x86_64 1:1.8.0.151-1.b12.el7_4 @updates
java-1.6.0-openjdk-devel.x86_64 1:1.6.0.41-1.13.13.1.el7_3 base
java-1.7.0-openjdk-devel.x86_64 1:1.7.0.151-2.6.11.1.el7_4 updates
java-1.8.0-openjdk-devel.i686 1:1.8.0.151-1.b12.el7_4 updates
java-1.8.0-openjdk-devel-debug.i686 1:1.8.0.151-1.b12.el7_4 updates
java-1.8.0-openjdk-devel-debug.x86_64 1:1.8.0.151-1.b12.el7_4 updates
[root@localhost lib]# java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
在這里可以看到我的jdk的版本是"1.8.0_151",所以我安裝了java-1.8.0-openjdk-devel-debug.x86_64
[root@localhost lib]# yum -y install java-1.8.0-openjdk-devel-debug.x86_64

安裝完畢后,問題解決,jps可以正常運行。
參考:教程1教程2

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,250評論 6 530
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 97,923評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,041評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,475評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,253評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,801評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,882評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,023評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,530評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,494評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,639評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,177評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,890評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,289評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,552評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,242評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,626評論 2 370