安裝前的環(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
以下是輸出內(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
之前設(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
我們可以看到,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信息: