一、前述
Kafka是一個分散式的訊息佇列系統(Message Queue)。
kafka叢集有多個Broker伺服器組成,每個型別的訊息被定義為topic。
同一topic內部的訊息按照一定的key和演算法被分割槽(partition)儲存在不同的Broker上。
訊息生產者producer和消費者consumer可以在多個Broker上生產/消費topic。
二、概念理解
Topics and Logs:
Topic即為每條釋出到Kafka叢集的訊息都有一個類別,topic在Kafka中可以由多個消費者訂閱、消費。
每個topic包含一個或多個partition(分割槽),partition數量可以在建立topic時指定,每個分割槽日誌中記錄了該分割槽的資料以及索引資訊。如下圖:
Kafka只保證一個分割槽內的訊息有序,不能保證一個主題的不同分割槽之間的訊息有序。如果你想要保證所有的訊息都絕對有序可以只為一個主題分配一個分割槽。(分割槽內有序,一個主題topic不一定是有序的)
分割槽會給每個訊息記錄分配一個順序ID號(偏移量), 能夠唯一地標識該分割槽中的每個記錄。Kafka叢集保留所有釋出的記錄,不管這個記錄有沒有被消費過,Kafka提供相應策略通過配置從而對舊資料處理。
實際上,每個消費者唯一儲存的後設資料資訊就是消費者當前消費日誌的位移位置。位移位置是由消費者控制,即、消費者可以通過修改偏移量讀取任何位置的資料。
Producers -- 生產者
訊息生產者,自己決定往哪個partition中寫入資料
- 1.hash
- 2.輪循
指定topic來傳送訊息到Kafka Broker
Consumers -- 消費者
根據topic消費相應的訊息
訊息消費者,自己在zookeeper中維護offset
每個消費者都有自己的消費者組,同一個topic中的資料只能在相同的消費組內消費一次,topic的每個partition只能同時被一個消費者組內的消費者消費
不同的消費者組之間消費相同的topic會不影響
broker
組成kafka叢集的節點,沒有主從關係,依靠zookeeper協調,broker負責訊息的讀寫,儲存。一個broker可以管理多個partition。
topic
訊息佇列,一類訊息。topic由partition組成,一個topic有多少個partition?建立可以指定
partition
組成topic的單元,相當於一個檔案,一個partition歸一個broker管理,每個partition有副本,有多少個?建立指定
zookeeper的作用:
1、儲存原資料
topic
partition
broker
2、儲存consumer的offsets
三、叢集安裝
叢集規劃:
Zookeeper叢集共三臺伺服器,分別為:node1、node2、node3。
Kafka叢集共三臺伺服器,分別為:node1、node2、node3。
安裝Kafka:
tar zxvf kafka_2.10-0.9.0.1.tgz -C /opt/
mv kafka_2.10-0.9.0.1/ kafka
修改配置檔案:config/server.properties
核心配置引數說明:
broker.id: broker叢集中唯一標識id,0、1、2、3依次增長(broker即Kafka叢集中的一臺伺服器)
注:
當前Kafka叢集共三臺節點,分別為:node1、node2、node3。對應的broker.id分別為0、1、2。
zookeeper.connect: zk叢集地址列表
當前node1伺服器上的Kafka目錄同步到其他node2、node3伺服器上:
scp -r /opt/kafka/ node2:/opt
scp -r /opt/kafka/ node3:/opt
修改node2、node3上Kafka配置檔案中的broker.id(分別在node2、3伺服器上執行以下命令修改broker.id)(當叢集大時,使用此安裝命令)
sed -i -e 's/broker.id=.*/broker.id=1/' /opt/kafka/config/server.properties
sed -i -e 's/broker.id=.*/broker.id=2/' /opt/kafka/config/server.properties
啟動kakka叢集
A、啟動Zookeeper叢集。
B、啟動Kafka叢集。
分別在三臺伺服器上執行以下命令啟動:
bin/kafka-server-start.sh config/server.properties
後臺啟動:nohup bin/kafka-server-start.sh config/server.properties > kafka.log 2>&1 &
可以建立個指令碼:(放在與bin同一級別下,注意建立後要修改許可權:chmod 755 startkafka.sh)
測試
(kafka-topics.sh --help檢視幫助手冊)
建立topic話題:
bin/kafka-topics.sh --zookeeper node1:2181,node2:2181,node3:2181 --create --replication-factor 2 --partitions 3 --topic test
(引數說明:
--replication-factor:指定每個分割槽的複製因子個數,預設1個
--partitions:指定當前建立的kafka分割槽數量,預設為1個
--topic:指定新建topic的名稱)
檢視topic列表:
bin/kafka-topics.sh --zookeeper node1:2181,node2:2181,node3:2181 --list
檢視“test”topic描述:
bin/kafka-topics.sh --zookeeper node1:2181,node2:2181,node3:2181 --describe --topic test
建立生產者:
bin/kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic test
建立消費者:
bin/kafka-console-consumer.sh --zookeeper node1:2181,node2:2181,node3:2181 --from-beginning --topic test
注:
檢視幫助手冊:
bin/kafka-console-consumer.sh help
刪除kafka中的資料。
① :在kafka叢集中刪除topic,當前topic被標記成刪除。
./kafka-topics.sh --zookeeper node3:2181,node4:2181,node5:2181 --delete --topic t1205
在每臺broker節點上刪除當前這個topic對應的真實資料。
② :進入zookeeper客戶端,刪除topic資訊
rmr /brokers/topics/t1205
③ :刪除zookeeper中被標記為刪除的topic資訊
kafka的leader的均衡機制
當一個broker停止或者crashes時,所有本來將它作為leader的分割槽將會把leader轉移到其他broker上去,極端情況下,會導致同一個leader管理多個分割槽,導致負載不均衡,同時當這個broker重啟時,如果這個broker不再是任何分割槽的leader,kafka的client也不會從這個broker來讀取訊息,從而導致資源的浪費。
kafka中有一個被稱為優先副本(preferred replicas)的概念。如果一個分割槽有3個副本,且這3個副本的優先順序別分別為0,1,2,根據優先副本的概念,0會作為leader 。當0節點的broker掛掉時,會啟動1這個節點broker當做leader。當0節點的broker再次啟動後,會自動恢復為此partition的leader。不會導致負載不均衡和資源浪費,這就是leader的均衡機制。
在配置檔案conf/ server.properties中配置開啟(預設就是開啟):
auto.leader.rebalance.enable true