入門請參照: /opensource/os-cn-kafka/index.html
在此不再贅述。
這部分不是本文的重點,但是kafka需要用到kafka集群,所以先搭建kafka集群。
從kafka官方文檔看到,kafka似乎在未來的版本希望拋棄zookeep集群,自己維護集群的壹致性,拭目以待吧。
我們搭建集群使用的是三臺同機房的機器,因為zookeeper不怎麽占資源也不怎麽占空間(我們的業務目前比較簡單),所以三臺機器上都搭建了zookeeper集群。
搭建zookeeper集群沒什麽難度,參考文檔: blogs.com/huangxincheng/p/5654170.html
下面列壹下我的配置並解析:
壹***用三臺物理機器,搭建壹個Kafka集群。
每臺服務器的硬盤劃分都是壹樣的,每個獨立的物理磁盤掛在壹個單獨的分區裏面,這樣很方便用於Kafka多個partition的數據讀寫與冗余。
/data1比較小,為了不成為集群的瓶頸,所以/data1用於存放kafka以及Zookeeper
每臺機器的磁盤分布如下:
下面是kafka的簡單配置,三臺服務器都壹樣,如有不壹致的在下文有說明。
kafka安裝在目錄/usr/local/kafka/下,下面的說明以10.1.xxx.57為例。
最重要的配置文件server.properties,需要配置的信息如下:
從上面的配置看到,kafka集群不需要像hadoop集群那樣,配置ssh通訊,而且壹個kafka服務器(官方文檔稱之為broker,下面統壹使用這個稱呼)並不知道其他的kafka服務器的存在,因此妳需要逐個broker去啟動kafka。各個broker根據自己的配置,會自動去配置文件上的zk服務器報到,這就是壹個有zk服務器粘合起來的kafka集群。
我寫了壹個啟動腳本,放在 /usr/local/kafka/bin 下面。啟動腳本每個broker都壹樣:
如同kafka集群裏面每壹個broker都需要單獨啟動壹樣,kafka集群裏面每壹個broker都需要單獨關閉。
官方給出的關閉腳本是單獨運行 bin/kafka-server-stop.sh
但是我運行的結果是無法關閉。打開腳本壹看,才發現是最簡單的辦法,發壹個TERM信號到kafka的java進程,官方腳本給出的grep有點問題。
發信號之後,壹直tail著kafka日誌,看到正常關閉。
指定zookeeper服務器,topic名稱是LvsKafka(註意topic名稱不能有英文句號(.)和下劃線(_),否則會通不過,理由是名稱會沖突,下文對此略有解析)
replication-factor指出重復因子是2,也就是每條數據有兩個拷貝,可靠性考慮。
partitions 指出需要多少個partition,數據量大的多壹點,無論生產和消費,這是負載均衡和高並發的需要。
可以看到剛才新建的24個partition,比如partition 5, 他的leader是broker 59,也就是10.1.xxx.59這臺機器。
建立topic時我們指出需要2個拷貝,從上面的輸出的Replicas字段看到,這兩個拷貝放在59,58兩個機器,也就是10.1.xxx.59和10.1.xxx.58.
Isr表示當前partition的所有拷貝所在的機器中,哪些是還活著(可以提供服務)的。現在是59和58都還存活。
這個命令另外還會看到壹些類似於下面的內容:
__consumer_offsets到底是什麽呢?其實就是客戶端的消費進度,客戶端會定時上報到kafka集群,而kafka集群會把每個客戶端的消費進度放入壹個自己內部的topic中,這個topic就是__consumer_offsets。我查看過__consumer_offsets的內容,其實就是每個客戶端的消費進度作為壹條消息,放入__consumer_offsets這個topic中。
這裏給了我們兩個提示:
1、kafka自己管理客戶端的消費進度,而不是依靠zk,這就是kafka官方文檔說的kafka未來會拋棄zk的底氣之壹;
2、留意到這個kafka自己的topic是帶下劃線的,也就是,kafka擔心我們自己建的topic如果帶下劃線的話會跟這些內部自用的topic沖突;