kafka集群搭建與使用

安裝前的環(huán)境準備

由于Kafka是用Scala語言開發(fā)的,運行在JVM上,因此在安裝Kafka之前需要先安裝JDK。

yum install java-1.8.0-openjdk* -y

kafka依賴zookeeper,所以需要先安裝zookeeper

wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz

tar -zxvf zookeeper-3.4.12.tar.gz

cd zookeeper-3.4.12

cp conf/zoo_sample.cfg conf/zoo.cfg

啟動zookeeper

bin/zkServer.sh start

bin/zkCli.sh

ls / #查看zk的根目錄相關(guān)節(jié)點

[zk: localhost:2181(CONNECTED) 8] ls /
[dubbo, zookeeper, locks]
[zk: localhost:2181(CONNECTED) 9] 

第一步:下載安裝包

下載1.1.0 release版本,并解壓:

wget https://archive.apache.org/dist/kafka/1.1.0/kafka_2.11-1.1.0.tgz
tar -xzf kafka_2.11-1.1.0.tgz
cd kafka_2.11-1.1.0

第二步:啟動服務(wù)

現(xiàn)在來啟動kafka服務(wù):
啟動腳本語法:kafka-server-start.sh [-daemon] server.properties
可以看到,server.properties的配置路徑是一個強制的參數(shù),-daemon表示以后臺進程運行,否則ssh客戶端退出后,就會停止服務(wù)。(注意,在啟動kafka時會使用linux主機名關(guān)聯(lián)的ip地址,所以需要把主機名和linux的ip映射配置到本地host里,用vim /etc/hosts)
bin/kafka-server-start.sh -daemon config/server.properties
我們進入zookeeper目錄通過zookeeper客戶端查看下zookeeper的目錄樹
bin/zkCli.sh
ls / #查看zk的根目錄kafka相關(guān)節(jié)點
ls /brokers/ids #查看kafka節(jié)點

[zk: localhost:2181(CONNECTED) 3] ls /
[cluster, controller, brokers, zookeeper, dubbo, admin, isr_change_notification, log_dir_event_notification, locks, controller_epoch, consumers, latest_producer_id_block, config]
[zk: localhost:2181(CONNECTED) 4] ls /brokers
[ids, topics, seqid]
[zk: localhost:2181(CONNECTED) 5] 

第三步:創(chuàng)建主題

現(xiàn)在我們來創(chuàng)建一個名字為“test”的Topic,這個topic只有一個partition,并且備份因子也設(shè)置為1:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
現(xiàn)在我們可以通過以下命令來查看kafka中目前存在的topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
除了我們通過手工的方式創(chuàng)建Topic,我們可以配置broker,當producer發(fā)布一個消息某個指定的Topic,但是這個Topic并不存在時,就自動創(chuàng)建。

[root@iZ2ze8dv3a3mevar9w80f1Z kafka_2.12-2.1.0]# bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".
[root@iZ2ze8dv3a3mevar9w80f1Z kafka_2.12-2.1.0]# 
[root@iZ2ze8dv3a3mevar9w80f1Z kafka_2.12-2.1.0]# 

[zk: localhost:2181(CONNECTED) 6] ls /brokers/topics
[test]
[zk: localhost:2181(CONNECTED) 7] 

第四步:發(fā)送消息

kafka自帶了一個producer命令客戶端,可以從本地文件中讀取內(nèi)容,或者我們也可以以命令行中直接輸入內(nèi)容,并將這些內(nèi)容以消息的形式發(fā)送到kafka集群中。在默認情況下,每一個行會被當做成一個獨立的消息。
首先我們要運行發(fā)布消息的腳本,然后在命令中輸入要發(fā)送的消息的內(nèi)容:

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test 
>this is a msg
>this is a another msg 

第五步:消費消息

對于consumer,kafka同樣也攜帶了一個命令行客戶端,會將獲取到內(nèi)容在命令中進行輸出:
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning #老版本
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup --consumer-property client.id=consumer-1 --topic test #新版本
如果你是通過不同的終端窗口來運行以上的命令,你將會看到在producer終端輸入的內(nèi)容,很快就會在consumer的終端窗口上顯示出來。
以上所有的命令都有一些附加的選項;當我們不攜帶任何參數(shù)運行命令的時候,將會顯示出這個命令的詳細用法。
還有一些其他命令如下:

查看組名
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list --new-consumer
查看消費者的消費偏移量
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group testGroup
消費多主題
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --whitelist "test|test-2"

單播消費

一條消息只能被某一個消費者消費的模式,類似queue模式,只需讓所有消費者在同一個消費組里即可
分別在兩個客戶端執(zhí)行如下消費命令,然后往主題里發(fā)送消息,結(jié)果只有一個客戶端能收到消息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup --topic test

多播消費
一條消息能被多個消費者消費的模式,類似publish-subscribe模式費,針對Kafka同一條消息只能被同一個消費組下的某一個消費者消費的特性,要實現(xiàn)多播只要保證這些消費者屬于不同的消費組即可。我們再增加一個消費者,該消費者屬于testGroup-2消費組,結(jié)果兩個客戶端都能收到消息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup-2 --topic tes

第六步:kafka集群配置

到目前為止,我們都是在一個單節(jié)點上運行broker,這并沒有什么意思。對于kafka來說,一個單獨的broker意味著kafka集群中只有一個接點。要想增加kafka集群中的節(jié)點數(shù)量,只需要多啟動幾個broker實例即可。為了有更好的理解,現(xiàn)在我們在一臺機器上同時啟動三個broker實例。
首先,我們需要建立好其他2個broker的配置文件:
cp config/server.properties config/server-1.properties
cp config/server.properties config/server-2.properties

config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://:9093
log.dir=/tmp/kafka-logs-1

config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/tmp/kafka-logs-2

broker.id屬性在kafka集群中必須要是唯一的。我們需要重新指定port和log目錄,因為我們是在同一臺機器上運行多個實例。如果不進行修改的話,consumer只能獲取到一個instance實例的信息,或者是相互之間的數(shù)據(jù)會被影響。
目前我們已經(jīng)有一個zookeeper實例和一個broker實例在運行了,現(xiàn)在我們只需要在啟動2個broker實例即可:

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

現(xiàn)在我們創(chuàng)建一個新的topic,備份因子設(shè)置為3:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic

現(xiàn)在我們已經(jīng)有了集群,并且創(chuàng)建了一個3個備份因子的topic,但是到底是哪一個broker在為這個topic提供服務(wù)呢(因為我們只有一個分區(qū),所以肯定同時只有一個broker在處理這個topic)?

 bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
image.png

以下是輸出內(nèi)容的解釋,第一行是所有分區(qū)的概要信息,之后的每一行表示每一個partition的信息。因為目前我們只有一個partition,因此關(guān)于partition的信息只有一行。
leader節(jié)點負責給定partition的所有讀寫請求。
replicas 表示某個partition在哪幾個broker上存在備份。不管這個幾點是不是”leader“,甚至這個節(jié)點掛了,也會列出。
isr 是replicas的一個子集,它只列出當前還存活著的,并且備份了該partition的節(jié)點。
現(xiàn)在我們的案例中,0號節(jié)點是leader,即使用server.properties啟動的那個進程。
我們可以運行相同的命令查看之前創(chuàng)建的名稱為”test“的topic

 bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test 
image.png

之前設(shè)置了topic的partition數(shù)量為1,備份因子為1,因此顯示就如上所示了。
現(xiàn)在我們向新建的topic中發(fā)送一些message:

 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
>my test msg 1
>my test msg 2

現(xiàn)在開始消費:

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
my test msg 1
my test msg 2

現(xiàn)在我們來測試我們?nèi)蒎e性,因為broker0目前是leader,所以我們要將其kill

ps -ef | grep server.properties
kill -9 1177
現(xiàn)在再執(zhí)行命令:
bin/kafka-topics.sh --describe --zookeeper localhost:9092 --topic my-replicated-topic
image.png

我們可以看到,leader節(jié)點已經(jīng)變成了broker 2.要注意的是,在Isr中,已經(jīng)沒有了0號節(jié)點。leader的選舉也是從ISR(in-sync replica)中進行的。
此時,我們依然可以 消費新消息:

 bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
my test msg 1
my test msg 2

查看主題分區(qū)對應(yīng)的leader信息:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容