Kafka是目前非常流行的消息隊列中間件,常用於做普通的消息隊列、網站的活性數據分析(PV、流量、點擊量等)、日誌的搜集(對接大數據存儲引擎做離線分析)。 全部內容來自網路,可信度有待考證!如有問題,還請及時指正。 概念介紹 在Kafka中消息隊列分為三種角色: ,即生產者,負責產生日誌數據。 ,存 ...
Kafka是目前非常流行的消息隊列中間件,常用於做普通的消息隊列、網站的活性數據分析(PV、流量、點擊量等)、日誌的搜集(對接大數據存儲引擎做離線分析)。
全部內容來自網路,可信度有待考證!如有問題,還請及時指正。
概念介紹
在Kafka中消息隊列分為三種角色:
producer
,即生產者,負責產生日誌數據。broker
,存儲節點,負責按照topic
中的partition
分區,均勻分散式的存儲分區。consumer
,即消費者,負責讀取使用broker
中的分區。
producer
Kafka系統中的生產者,用於產生數據併發送給broker進行存儲。由於需要與broker中的分區保持socket連接,因此需要在zk中維護生產者與分區broker的對應關係。同一個topic下的數據,會以某種負載均衡的方式發送到不同的分區中。
broker
Broker可以當做Kafka中的存儲節點,數據按照topic組織,按照某種負載均衡方式分配到不同的分區中。一個Topic由多個分區組成,每個分區可以設置備份數量。分區由一個leader+多個followers組成,生產者直接與leader進行溝通,leader接收消息後,其他的followers會同步這個消息。所有的follwers同步消息後,該消息才會成為可消費的狀態。
Broker中Topic與分區,分區與生產者,分區之間的選舉備份等等信息都需要ZK進行協調。
consumer
Consumer是Kafka中的消費者,通常以組的形式存在,一個Group會包含多個Consumer。每個組對應一個Topic,該Topic內的分區只能對應一個消費者,也就是如果消費者很多的情況下,會出現有的消費者消費不到數據;如果消費者很少的情況下,會有消費者同時消費多個分區的數據。
Kafka僅僅會保證一個分區的消息的消費是有序的,多個分區並不保證有序性。
為了保證數據消費的可靠性,Kakka提供了幾種消費的機制:
- 1 at most once,即消費數據後,保存offset,就再也取不到這個數據了。
- 2 at least once,即消費數據後,保存offset,如果保存出錯,下次可能還會取到該數據
- 3 exactly once,待查閱
在Kafka中offset是由consumer維護的(實際可以由zk來完成)。這種機制有兩個好處,
- 一個是可以依據consumer的能力來消費數據,避免產生消費數據的壓力;
- 另一個就是可以自定義fetch消費的數據數目,可以一次讀取1條,也可以1次讀取100條。
topic
Kafka中的數據的主題,所有的操作(如消息的存儲和讀取\消費)都是依據topic完成。
partition
每個Topic由多個分區組成,每個分區內部的數據保證了有序性,即是按照時間序列,append到分區的尾部。分區是有固定大小的,容量不夠時,會創建新的分區。Kafka在一定時間內會定期清理過期的文件。
這種連續性的文件存儲,一方面有效的利用磁碟的線性存取;另一方面減輕了記憶體的壓力。
zookeeper
在Kafka中很多節點的調度以及資源的分配,都要依賴於zookeeper來完成。
如:
- 1 Broker的註冊,保存Broker的IP以及埠;
- 2 Topic註冊,管理broker中Topic的分區以及分佈情況
- 3 Broker的負載均衡,講Topic動態的分配到broker中,通過topic的分佈以及broker的負載判斷
- 4 消費者,每個分區的消息僅發送給一個消費者(不知道跟zookeeper有啥關係)
- 5 消費者與分區的對應關係,存儲在zk中
- 6 消費者負載均衡,一旦消費者增加或者減少,都會觸發消費者的負載均衡
- 7 消費者的offset,High level中由zk維護offset的信息;Low Level中由自己維護offset
偽集群環境的搭建
部署偽集群環境,即單節點環境非常簡單。下載部署文件,解壓後,直接運行即可。
運行命令如下:
# 啟動zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties &
# 啟動kafka
bin/kafka-server-start.sh config/server.properties &
如果想要測試,可以啟動測試程式:
# 啟動生產者測試程式
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
# 啟動消費者測試程式
./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
在生產者界面輸入的內容,就可以直接在消費者界面中看到了。