Kafka的自我介紹
很多人都認爲Kafka是一個消息隊列,實際上並不完全對,在官網的標題中使用了一句話來描述Kafka:
A distributed streaming platform(一個分佈式的流平臺)
所以在本質上來講,Kafka並不是一個消息隊列,它實際上是用來做流處理的一個平臺。那麼什麼是分佈式的流平臺呢?這就需要簡單說明下Kafka誕生的背景:
Kafka早期設計的目的是用作於 LinkedIn 的活動流(Activity Stream)和運營數據處理管道(Pipeline)的一個分佈式消息發佈和訂閱系統,起初基於Scala編寫(現在是Scala + Java),之後成爲 Apache 基金會的一個頂級項目。
活動流數據是所有的網站對用戶的使用情況做分析的時候要用到的最常規的部分,活動數據包括頁面的訪問量(PV)、被查看內容方面的信息以及搜索內容。這種數據通常的處理方式是先把各種活動以日誌的形式寫入某種文件,然後週期性的對這些文件進行統計分析。運營數據指的是服務器的性能數據(CPU、IO 使用率、請求時間、服務日誌等)。
實際上在這種大數據的流處理裏面,Kafka經常會對接Spark、Flink等實時流計算引擎,這些場景要求流處理平臺具有高性能、高吞吐量、低延遲等特點,而 Kafka 具有很好的吞吐量、內置分區、冗餘及容錯性的優點(Kafka 每秒可以處理幾十萬消息),因此讓 Kafka 成爲了一個很好的大規模消息處理應用的解決方案。
由於 Kafka 提供了類似 JMS 的特性,所以很多人對它的第一印象就是消息隊列。但是在設計和實現上是完全不同的,而且它也不是 JMS 規範的實現,因此我們需要糾正對Kafka的錯誤認知。
Zookeeper安裝
接下來演示一下Kafka的安裝與配置。Kafka是基於Zookeeper來實現分佈式協調的,所以在安裝Kafka之前需要先安裝Zookeeper。Zookeeper和Kafka都依賴於JDK,我這裏已經事先安裝好了JDK:
[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
命令進行下載,如下:
[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 ~]#
Kafka安裝
安裝完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基本概念及使用演示
基本概念
- Topic:一個虛擬的概念,由一個到多個Partition組成,Topic作爲生產者和消費者交互數據的媒介
- Partition:實際的消息存儲單位,也就是真正存儲消息的地方
- Producer:消息生產者
- Consumer:消息消費者
在完成配置文件的修改後,爲了方便使用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