kafka集群搭建
網絡上的博客質量參差不齊,對新手很不友好,我參考了一些博客文檔后,重新寫了一遍kafka的搭建教程,包括zookeeper的搭建教程,還附上了遇到的一些常見錯誤的解決方案。
我使用了3臺虛擬機,因為kafka需要zookeeper的支持,所以虛擬機上需要事先搭建好zookeeper的集群,具體步驟見 《搭建zookeeper集群》。主要參考了這兩個教程: 教程一(三臺虛擬機),教程二(兩臺虛擬機)。
1. 軟件環(huán)境
- CenOS7 虛擬機三臺。
- 已經搭建好的zookeeper集群。
- 軟件版本: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消息
- 下載軟件
我用的是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)建成功
- 創(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)聽的地址
- 創(chuàng)建生產者producer
./kafka-console-producer.sh --broker-list 192.168.172.10:19092 --topic my-topic
//`這個IP地址可以寫brokerlist中的任意一個
此時,console處于阻塞狀態(tài),可以直接輸入數據。
- 創(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