不少人都認爲Kafka是一個消息隊列,實際上並不徹底對,在官網的標題中使用了一句話來描述Kafka:html
A distributed streaming platform(一個分佈式的流平臺)java
因此在本質上來說,Kafka並非一個消息隊列,它其實是用來作流處理的一個平臺。那麼什麼是分佈式的流平臺呢?這就須要簡單說明下Kafka誕生的背景:apache
Kafka早期設計的目的是用做於 LinkedIn 的活動流(Activity Stream)和運營數據處理管道(Pipeline)的一個分佈式消息發佈和訂閱系統,起初基於Scala編寫(如今是Scala + Java),以後成爲 Apache 基金會的一個頂級項目。bootstrap
活動流數據是全部的網站對用戶的使用狀況作分析的時候要用到的最常規的部分,活動數據包括頁面的訪問量(PV)、被查看內容方面的信息以及搜索內容。這種數據一般的處理方式是先把各類活動以日誌的形式寫入某種文件,而後週期性的對這些文件進行統計分析。運營數據指的是服務器的性能數據(CPU、IO 使用率、請求時間、服務日誌等)。vim
實際上在這種大數據的流處理裏面,Kafka常常會對接Spark、Flink等實時流計算引擎,這些場景要求流處理平臺具備高性能、高吞吐量、低延遲等特色,而 Kafka 具備很好的吞吐量、內置分區、冗餘及容錯性的優勢(Kafka 每秒能夠處理幾十萬消息),所以讓 Kafka 成爲了一個很好的大規模消息處理應用的解決方案。bash
因爲 Kafka 提供了相似 JMS 的特性,因此不少人對它的第一印象就是消息隊列。可是在設計和實現上是徹底不一樣的,並且它也不是 JMS 規範的實現,所以咱們須要糾正對Kafka的錯誤認知。服務器
接下來演示一下Kafka的安裝與配置。Kafka是基於Zookeeper來實現分佈式協調的,因此在安裝Kafka以前須要先安裝Zookeeper。Zookeeper和Kafka都依賴於JDK,我這裏已經事先安裝好了JDK:tcp
[root@txy-server2 ~]# java --version java 11.0.5 2019-10-15 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.5+10-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.5+10-LTS, mixed mode) [root@txy-server2 ~]#
準備好JDK後,到Zookeeper的官網下載地址,複製下載連接:分佈式
而後到Linux中使用wget
命令進行下載,以下:ide
[root@txy-server2 ~]# cd /usr/local/src [root@txy-server2 /usr/local/src]# wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
解壓下載好的壓縮包,並將解壓後的目錄移動和重命名:
[root@txy-server2 /usr/local/src]# tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz [root@txy-server2 /usr/local/src]# mv apache-zookeeper-3.6.1-bin ../zookeeper
進入到Zookeeper的配置文件目錄,將zoo_sample.cfg
這個示例配置文件拷貝一份並命名爲zoo.cfg
,這是Zookeeper默認的配置文件名稱:
[root@txy-server2 /usr/local/src]# cd ../zookeeper/conf/ [root@txy-server2 /usr/local/zookeeper/conf]# ls configuration.xsl log4j.properties zoo_sample.cfg [root@txy-server2 /usr/local/zookeeper/conf]# cp zoo_sample.cfg zoo.cfg
修改一下配置文件中的dataDir
配置項,指定一個磁盤空間較大的目錄:
[root@txy-server2 /usr/local/zookeeper/conf]# vim zoo.cfg # 指定Zookeeper的數據存儲目錄,類比於MySQL的dataDir dataDir=/data/zookeeper [root@txy-server2 /usr/local/zookeeper/conf]# mkdir -p /data/zookeeper
接下來就能夠進入bin
目錄,使用啓動腳原本啓動Zookeeper了,以下示例:
[root@txy-server2 /usr/local/zookeeper/conf]# cd ../bin/ [root@txy-server2 /usr/local/zookeeper/bin]# ./zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@txy-server2 /usr/local/zookeeper/bin]#
啓動完成後,能夠經過查看是否正常監聽端口號來判斷是否啓動成功,以下則是啓動成功了:
[root@txy-server2 ~]# netstat -lntp |grep 2181 tcp6 0 0 :::2181 :::* LISTEN 7825/java [root@txy-server2 ~]#
安裝完Zookeeper後,接下來就能夠安裝Kafka了,一樣的套路首先去Kafka的官網下載地址,複製下載連接:
而後到Linux中使用wget
命令進行下載,以下:
[root@txy-server2 ~]# cd /usr/local/src [root@txy-server2 /usr/local/src]# wget https://mirror.bit.edu.cn/apache/kafka/2.5.0/kafka_2.13-2.5.0.tgz
解壓下載好的壓縮包,並將解壓後的目錄移動和重命名:
[root@txy-server2 /usr/local/src]# tar -xvf kafka_2.13-2.5.0.tgz [root@txy-server2 /usr/local/src]# mv kafka_2.13-2.5.0 ../kafka
進入Kafka的配置文件目錄,修改配置文件:
[root@txy-server2 /usr/local/src]# cd ../kafka/config/ [root@txy-server2 /usr/local/kafka/config]# vim server.properties # 指定監聽的地址及端口號,該配置項是指定內網ip listeners=PLAINTEXT://127.0.0.1:9092 # 若是須要開放外網訪問,則在該配置項指定外網ip advertised.listeners=PLAINTEXT://127.0.0.1:9092 # 指定kafka日誌文件的存儲目錄 log.dirs=/usr/local/kafka/kafka-logs # 指定zookeeper的鏈接地址,多個地址用逗號分隔 zookeeper.connect=localhost:2181 [root@txy-server2 /usr/local/kafka/config]# mkdir /usr/local/kafka/kafka-logs
在完成配置文件的修改後,爲了方便使用Kafka的命令腳本,咱們能夠將Kafka的bin
目錄配置到環境變量中:
[root@txy-server2 ~]# vim /etc/profile export KAFKA_HOME=/usr/local/kafka export PATH=$PATH:$KAFKA_HOME/bin [root@txy-server2 ~]# source /etc/profile # 讓配置生效
這樣就可使用以下命令啓動Kafka了:
[root@txy-server2 ~]# kafka-server-start.sh /usr/local/kafka/config/server.properties &
執行以上命令後,啓動日誌會輸出到控制檯,能夠經過日誌判斷是否啓動成功,也能夠經過查看是否監聽了9092
端口來判斷是否啓動成功:
[root@txy-server2 ~]# netstat -lntp |grep 9092 tcp6 0 0 172.21.0.10:9092 :::* LISTEN 31943/java [root@txy-server2 ~]#
咱們可使用以下命令建立一個Topic:
[root@txy-server2 ~]# kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test-topic Created topic test-topic. # 控制檯輸出這句表示建立完成 ... [root@txy-server2 ~]#
參數說明:
--create
:表示建立一個Topic--zookeeper
:指定zookeeper的ip及端口號--replication-factor
:指定複製因子--partitions
:指定partition的數量--topic
:指定建立的topic的名稱查看已經建立的Topic信息:
[root@txy-server2 ~]# kafka-topics.sh --list --zookeeper localhost:2181 test-topic [root@txy-server2 ~]#
向test-topic
生產一些消息:
[root@txy-server2 ~]# kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test-topic >helloworld >第二條消息 >第三條消息
從test-topic
中消費消息:
[root@txy-server2 ~]# kafka-console-consumer.sh --bootstrap-server 127.0.0.1:2181 --topic test-topic --from-beginning helloworld 第二條消息 消息 第四條消息 第五條消息
最後,中止Kafka的命令以下:
[root@txy-server2 ~]# kafka-server-stop.sh