應用場景
- 日誌聚合,通常kafka 使用來記錄日誌信息。
- 限流削峯,當大量數據同時請求到服務的時候,能夠形成服務宕機,直接將消息放到kafka,而後對應服務根據規則取讀取。
高吞吐率
- 順序讀寫(partition中的消息是順序讀寫的。)
- 零copy
- 批量發送
- 壓縮消息
基本術語
- broker kafka機器節點
- topic 主題 邏輯上概念,來劃分消息所屬的類
- partition 主題對應到物理存儲上 。一個topic 至少一個partition 。在某個partition中的消息是有序的。多分區小沒有辦法保證消息的有序性 分區自己是 FIFO。通常 分區數量是borker的整數倍
- segment 將partiton 細分爲段,(三個文件一套 ,index .log )每一個段的最大存儲值是相同的
經過二分查找找到對應的 文件log 而後根據 index文件中存儲的偏移量 找到對應的log中的偏移量存儲的消息。java
log 文件的最大大小配置在配置文件中log.segment.bytesegmentfault
- consumer 消費者: 一個消費者可消費多個topic,也能夠消費同一個topic中的多個parition中的消息。一個分區中的消息運行多個無關的消費者同時消費。
- cosumergroup:消費者組 組內的消費者會協調在一塊兒,平均消費分區。對分區的消費是平均的。可是對消息的消費不是平均的。某個消費者只能消費一個pairtition中的消息。
- producer 生產者: 生成的消息默認是平均分的。也能夠指定寫到某個partition。也能夠根據消息的key 看成路由算出來寫到某個分區
- 分區副本: 防止消息丟失作的 分區的備份。須要注意的是 備份得在不一樣的機器上。
- partition leader :多個副本 得有一個 leader。負責當前消息的讀寫的partition。broker controller 負責leader 的選舉
- partition follower:主備 消息 follower 不是主從。主備的。從節點不對外提供服務
- isr 副本的同步列表 get /brokers/topics/java/partitions/state 獲得 一個 isr :【2,1】 列表 leader 的節點下標 leader 「2」
- offest :每條消息都有一個當前parittion下的惟一的一個64字節的偏移量。先根據index下索引文件找到對應的偏移量。根據偏移量找到對應的消息的地址值。
- broker controller broker有一個被選舉爲controller。負責管理 partition和 replicas的狀態 例如 partition leader 故障,由controller 負責從isr的 follower中選舉出一個新的leader 。當某個partition數量發生變化的時候,controller來負責從新分配消費者。
-
Hw 與 Leo
hw 表示consumer能夠消費到的最高的 partition偏移量。爲了保證 partiton中leader和follower的數據一致性spa
leo表示 follower 當前最後一個寫入消息的位置。日誌
leader新寫入的消息。consumer不能馬上消費。等到同步完成後,更新hw 。消息才能被消費code
![file file](http://static.javashuo.com/static/loading.gif)
從kafka 0.9 版本以後,zk的工做變的很簡單,負責維護和協調borker。broker controller的選舉工做。zk中存放着 各個topic主題的分區信息,分區的leader信息等。
* Coordinator
是broker上的一個進程。管理consumer group中的各個成員,主要用於offset位移的管理和rebalance。
* Rebalance
當分區數量發生變化的時候,或者消費者組中的消費者數量發送變化的時候,將partiton從新分配到不一樣的消費者。
*offset commit
consumer 消費一批消息後,須要將消費完的offset提交給broker。讓borker記錄下哪些消息是消費過的。
系統會將提交的offset 作完消息寫入到 _consumer_offsets 主題的partiton中。key爲消費者的id。 根據key 計算出hash值,而後再將hash與50 取模,餘數就是對應的partition編號。