說明:如下內容爲我的學習kafka的筆記整理,現整理成文章分享,若是對讀者有些幫助那就再好不過了。圖片有一部分是本身畫的,有一部分來自於百度圖片,如有侵襲,請留言,我會刪除。內容上如有不完善的地方,歡迎讀者留言指出,筆者會盡快勘正,謝謝!
kafka是分佈式的、高併發的、基於發佈/訂閱模式的消息隊列軟件系統。緩存
kafka對外使用topic的概念,生產者往topic裏寫消息,消費者組的消費者從topic裏讀消息。併發
爲了提升某個topic的負載能力,kafka的一個topic是由多個分區(Partition)組成。生產者根據必定的規則向多個分區PUSH數據,消費者組的多個消費者能夠同時消費不一樣分區裏的消息。異步
爲保證可用性,kafka的每個分區都能配置N個副本。副本分爲Leader副本和Follower副本,Follower僅負責從Leader複製數據,Leader負責全部的讀寫請求。kafka集羣實際存儲的是副本。分佈式
主題分區副本在broker的分配原則:每一個Broker都有均等分配分區Leader的機會,同個分區的副本不能落到同一臺機器上!具體規則:高併發
- 將全部N Broker和待分配的i個Partition排序。
- 將第i個Partition分配到第(i mod n)個Broker上。
- 將第i個Partition的第j個副本分配到第((i + j) mod n)個Broker。
Kafka是一個分佈式、分區的、多副本的、多訂閱者,基於zookeeper協調的分佈式MQ系統。學習
爲提升發送效率,生產者一般將多條消息打包PUSH到kafka集羣。spa
分區的Leader副本負責讀寫,Leader副本收到來着生產者的消息並寫入本地的同時,也會將消息發給對應的Follower副本,Follower寫入本地後返回給Leader ACK,Leader收到必定數量的Follower的ACK之後再返回給生產者ACK表示消息已寫入Kafka集羣。kafka的副本同步不是徹底同步,也不是徹底異步,而是一種ISR機制。code
leader會維護一個與其基本保持同步的Replica列表,該列表稱爲ISR(in-sync Replica),每一個Partition都會有一個ISR,並且是由leader動態維護。blog
Leader收到ISR裏的所有Follower的ACK之後再向發送者回復ACK。排序
HW以後的數據對消費者不可見,當leader掛掉之後,就從ISR裏選舉一個新的leader。以後,爲保證多個副本之間的數據一致性,其他的Follower都會將各自消息文件高於hw的部分截掉,而後重新的leader同步數據。
kafka集羣會給開啓冪等性的生產者在初始化的時候會分配一個PID。生產者發往同一個分區(Partition)的每個消息會附帶上一個序列號(SeqNumber)。Broker端會對<PID,Partition,SeqNumber>作緩存,當具備相同序列號的消息提交時,Broker只會持久化一條消息。
但生產者的PID在重啓之後會變化,同時不一樣的分區也具備不一樣序列號,因此冪等性沒法保證跨分區跨會話的精準一次性。
Push模式和Pull模式都有各自的優點和缺點,相較之下,Kafka選擇了Pull模式,以提升整個集羣的消費能力
需保證兩個原則:全部的分區的消息都有消費者進行消費,不可能出現同一個消費者組的多個個消費者負責同一個分區。
以上內容圖片均來自於百度圖片,侵刪!!!