認識Kafka
花費越少的精力在資料移動上,就能越專注於核心業務 --- 《Kafka:The Definitive Guide》
認識 Kafka 之前,先了解一下釋出與訂閱訊息系統:訊息的傳送者不會直接把訊息傳送給接收者、傳送者以某種方式對訊息進行分類,接收者訂閱它們,以便能接受特定型別的訊息。釋出與訂閱系統一般會有一個 broker(n. 經紀人、中間商) 也就是釋出訊息的中心點。
Kafka 是一款基於釋出與訂閱的訊息系統,一般被稱為“分散式提交日誌”或者“分散式流平臺”。 Kafka 的資料單元被稱作訊息,可以看作是資料庫中的一行資料,訊息是由位元組陣列組成,故對 kafka 來說訊息沒有特別的意義,訊息可以有一個可選的後設資料,也就是鍵。鍵也是一個位元組陣列,同樣對於 kafka 沒有什麼特殊意義。鍵可以用來將訊息以一種可控的方式寫入分割槽。最簡單的例子就是為鍵生成一個一致性雜湊值,然後使用雜湊值對主題分割槽數進行取模,為訊息選擇分割槽。這樣可以保證具有相同鍵的訊息總是被寫在相同的分割槽上。保證訊息在一個主題中順序讀取。
為了提高效率,訊息將被分批次寫入 Kafka 。批次就是一組訊息,類似於 redis 中的流水線(Pipelined)操作。
主題和分割槽
kafka 的訊息通過主題進行分類,主題就相當於資料庫中的表,主題可以被分成若干個分割槽,一個分割槽就是一個提交日誌,訊息以追加的形式被寫入分割槽。然後按照先入先出的順序讀取。一個主題下的分割槽也可以在不同的伺服器上,以此提供比單個伺服器更加強大的效能
生產者和消費者
Kafka 的客戶端就是 Kafka 系統的使用者,一般情況下有兩種基本型別:生產者和消費者
Producer 生產者建立訊息,一般情況下,一個訊息會被髮布到一個特定的主題上。生產者在預設情況下將訊息均分在主題的每個分割槽上
Consumer 消費者讀取訊息,消費者訂閱一個或多個主題,並按照訊息的生成順序讀取他們,消費者通過檢查訊息的偏移量來區分已經讀過的訊息。這個偏移量會被消費者在 zk 或者 kafka 上儲存,如果消費者關閉或者重啟,他的讀取狀態不會消失
消費者是消費者群組 Consumer group的一部分,群組可以保證每個分割槽被一個消費者消費(因此消費者數量不能大於分割槽數量,會造成消費者伺服器的浪費),如果一個消費者失效,群組裡的其他消費者可以接管失效消費者的工作。
Kafka的優點
- 無縫支援多個生產者
- 支援多個消費者從一條訊息流讀取資料、且各個消費者之間的偏移量不影響。也支援多個消費者共享一個訊息流,並保證整個消費者群組對每個訊息只消費一次
- 可以對每個主題設定保留規則,根據保留規則持久化資料到磁碟
- 高效能,高伸縮性
安裝
Kafka 使用 Zookeeper(後面簡稱zk) 儲存叢集的後設資料資訊和消費者資訊, Kafka 發行版本自帶 zk,可以直接從指令碼啟動,不過安裝一個完整版的 zk 也不難
安裝單節點 zk
官方下載地址:http://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/
如果下載速度不如意,可以使用我的藍奏雲:https://keats.lanzous.com/iMWi8dpi04f 提取碼: keats
安裝目錄: /usr/local/zookeeper
資料目錄: /var/lib/zookeeper
# tar -zxf zookeeper-3.4.6.tar.gz
# mv zookeeper-3.4.6 /usr/local/zookeeper
# mkdir -p /var/lib/zookeeper
# cat > /usr/local/zookeeper/conf/zoo.cfg << EOF
> tickTime=2000
> dataDir=/var/lib/zookeeper
> clientPort=2181
> EOF
# 接著設定一下環境變數中的 JAVA_HOME,可以先使用 export 命令檢視是否已經設定
# export JAVA_HOME=/xxx
# 最後切換到 zk 安裝目錄,啟動 zk
# /usr/local/zookeeper/bin/zkServer.sh start
接著通過四字命令 srvr 驗證 zk 是否安裝正確
# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 4
Connection closed by foreign host.
[root@linux-keats bin]# pwd
/usr/local/zookeeper/bin
安裝單節點 Kafka
下載: https://archive.apache.org/dist/kafka/0.9.0.1/kafka_2.11-0.9.0.1.tgz
藍奏雲:下載後將字尾名 zip 改為 tgz:https://keats.lanzous.com/iaZ9hdpj5bi
# tar -zxf kafka_2.11-0.9.0.1.tgz
# mv kafka_2.11-0.9.0.1 /usr/local/kafka
# mkdir /tmp/kafka-logs
# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
其中 -dadmon 表示 kafka 以守護執行緒的形式啟動
配置 kafka
#broker 的全域性唯一編號,叢集中不能重複。int型別
broker.id=0
#是否允許刪除 topic
delete.topic.enable=true
#處理網路請求的執行緒數量
num.network.threads=3
#處理磁碟 IO 的執行緒數量
num.io.threads=8
#傳送套接字的緩衝區大小
socket.send.buffer.bytes=102400
#接收套接字的緩衝區大小
socket.receive.buffer.bytes=102400
#請求套接字的緩衝區大小
socket.request.max.bytes=104857600
#kafka 執行日誌(此日誌非常規意義的日誌)存放的路徑。用上一步建立的目錄。
log.dirs=/tmp/kafka-logs
#topic 建立時預設的分割槽數
num.partitions=1
#用來恢復和清理 data 下資料的執行緒數量
num.recovery.threads.per.data.dir=1
#segment 檔案保留的最長時間,超時將被刪除
log.retention.hours=168
#配置連線 Zookeeper 地址。如果是 zk 叢集,使用 , 隔開
zookeeper.connect=localhost:2181
叢集
zk 叢集的安裝請度娘 zk 叢集,kafka 可以按照末尾參考文獻安裝叢集。我這裡測試伺服器效能不行還跑了幾個 java 程式,就不裝叢集了
測試
主題相關操作
/usr/local/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".
- --create 建立操作 還有 --list 查詢,--describe 詳情
- --zookeeper localhost:2181 配置 zk 的資訊
- --partitions 1 分割槽數目 1
- --replication-factor 1 副本數 1。副本數不能大於 kafka broker 節點的數目
- --topic test 指定主題名稱
建立好主題後,logs 資料夾內就會出現 主題名-分割槽名 的提交日誌
往主題傳送訊息
# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
Test Message 1
Test Message 2
^D
從測試主題讀取訊息
# /usr/local/kafka/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
Test Message 1
Test Message 2
^C
Processed a total of 2 messages
參考
《kafka權威指南》 --- 美國人著