Apache Kafka是分布式發布-訂閱消息系統,在 kafka官網上對 kafka 的定義:一個分布式發布-訂閱消息傳遞系統。 它最初由LinkedIn公司開發,Linkedin於2010年貢獻給了Apache基金會並成為頂級開源項目。Kafka是一種快速、可擴展的、設計內在就是分布式的,分區的和可復制的提交日志服務。
注意:Kafka並沒有遵循JMS規范,它只提供了發布和訂閱通訊方式!!!!!
kafka中文官網:http://kafka.apachecn.org/quickstart.html
Kafka用在日志里面比較多 大數據里面的
MQ的思想: 解耦合 流量削峰 異步通信
kafka優點:
- 高吞吐量、低延遲:kafka每秒可以處理幾十萬條消息,它的延遲最低只有幾毫秒,每個topic可以分多個partition, consumer group 對partition進行consume操作,我之前在課題里用到Spark Streaming 作為消費者過濾數據。
- 可擴展性:kafka集群支持熱擴展
- 持久性、可靠性:消息被持久化到本地磁盤,並且支持數據備份防止數據丟失
- 容錯性:允許集群中節點失敗(若副本數量為n,則允許n-1個節點失敗)
- 高並發:支持數千個客戶端同時讀寫
Kafka依賴Zookeeper,kafka把集群的節點信息 全部存放在Zookeeper節點!!!!!
應用場景:
- 日志收集:一個公司可以用Kafka可以收集各種服務的log,通過kafka以統一接口服務的方式開放給各種consumer,例如hadoop、Hbase、Solr或者Spark Streaming等。
- 消息系統:解耦和生產者和消費者、緩存消息等。
- 用戶活動跟蹤:Kafka經常被用來記錄web用戶或者app用戶的各種活動,如瀏覽網頁、搜索、點擊等活動,這些活動信息被各個服務器發布到kafka的topic中,然后訂閱者通過訂閱這些topic來做實時的監控分析,或者裝載到hadoop、數據倉庫中做離線分析和挖掘。
- 運營指標:Kafka也經常用來記錄運營監控數據。包括收集各種分布式應用的數據,生產各種操作的集中反饋,比如報警和報告。
- 流式處理:比如spark streaming和storm
- 事件源
關鍵名詞解釋:
Broker:Kafka節點,一個Kafka節點就是一個broker,多個broker可以組成一個Kafka集群。 broker就是節點,單機的kafka服務器
Topic:一類消息,消息存放的目錄即主題,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能夠同時負責多個topic的分發,kafka服務器存放 主題。kafka集群,相當於把topic進行拆分,拆分到不同的分區進行存放。類似於數據庫存放數據量比較大的情況下,表進行拆分。查詢時候進行分表查詢。
massage: Kafka中最基本的傳遞對象。
Partition:topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的隊列,就是分區的概念,相當於把topic存放到不同的物理機器上存儲起來。topic消息進行拆分,均攤存放到不同的
集群中的kafka服務器上。 每個partition其實是有順序的。
Segment:partition物理上由多個segment組成,每個Segment存着message信息
Producer : 生產者,生產message發送到topic
Consumer : 消費者,訂閱topic並消費message, consumer作為一個線程來消費
Consumer Group:消費者組,一個Consumer Group包含多個consumer。在同一個組可以收到消息
Offset:偏移量,理解為消息partition中的索引即可。 消息在partition的索引的位置
需要理解存儲策略:
1)kafka以topic來進行消息管理,每個topic包含多個partition,每個partition對應一個邏輯log,有多個segment組成。
2)每個segment中存儲多條消息(見下圖),消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲位置,避免id到位置的額外映射。
3)每個part在內存中對應一個index,記錄每個segment中的第一條消息偏移。
4)發布者發到某個topic的消息會被均勻的分布到多個partition上(或根據用戶指定的路由規則進行分布),broker收到發布消息往對應partition的最后一個segment上添加該消息,當某個segment上的消息條數達到配置值或消息發布時間超過閾值時,segment上的消息會被flush到磁盤,只有flush到磁盤上的消息訂閱者才能訂閱到,segment達到一定的大小后將不會再往該segment寫數據,broker會創建新的segment。
生產者發送消息原理:
Kafka高可用集群原理:
kafka 是topic為主的,kafka必須集群,核心就是集群,才能體現分區的優勢!
集群環境下 生產者投遞消息 到哪個Broker?
(Tomcat 通過Nginx 集合起來的思想深入人心)
集群的目的就是分擔單台的壓力,kafaka采用了 負載輪訓的機制
數據庫里面 單表 有1億條數據 查詢很慢的 。所以分表,比如按照月份進行分,或者根據其他的業務來進行分。
下圖三個Broke topic進行分區存放,在創建topic時候,輪訓去指定分區。BrokerId區分之
0,1,2,34,5,6為offset 每個分區中的offset是獨立的,互不影響的
三個broker,有三個消費者是比較合理的~
Zookeeper 節點專門存放topic 信息。 kafka 的broker的信息存放在zk節點