1、概念
Kafka是分佈式的、可分區的,可複製的消息系統。
2、原理
【待補充】
3、組成
1)Topics/Logs
一個topic是對一組消息的歸納。
每個topic將被分成多個partition,每個partition在存儲層面是append log文件。
任何發佈到此partition的消息都會被直接追加到log文件的尾部,每條消息在文件中的位置成爲offset,offset爲一個long型數字,它是一條消息的唯一標記。
kafka沒有提供其他索引機制來存儲offset,因爲kafka幾乎不允許對消息隨機讀寫。
一個topic的多個partition被分佈在kafka集羣中的多個server上。
每個server負責partition中的消息的讀寫操作。
2)Producer
producer將消息發佈到它指定的topic中,並負責決定發佈到哪個分區。
通常簡單的由負載均衡機制隨機選擇分區,但也可以通過特定的分區函數選擇分區。
使用更多的第二種。
3)Consumer
Consumer可以加入某個consumer組,共同競爭一個topic,topic中的消息將被分發到組中的某個成員。
同一組中的consumer可以在不同的程序中,也可以在不同的機器上。
若所有的consumer同屬於一個組,就可以成爲隊列模式,在各個Consumer中實現負載均衡。
若所有的Consumer各屬不同組,就可以成爲發佈-訂閱模式,所有消息被分發到所有Consumer。
常見的是:
每個topic都有若干數量的consumer組,每個組都是一個邏輯上的訂閱者。
爲了容錯和更好的穩定性,每個組由若干consumer組成。
其實就是一個發佈-訂閱模式,只不過訂閱者是組而不是單個consumer。
4、機制
1)備份
kafka可以配置partition需要備份的個數,每個partition將會被備份到多臺機器,以提高可用性。
每個partition都有一個server爲“leader”,leader負責所有的讀寫操作,如果leader失效,那麼將會有其他的follower來接管。
follower只是跟進leader,同步消息。
作爲leader的服務器承擔了全部的請求壓力,因此從集羣的整體考慮,有多少個partition就應該有多少個leader。
kafka會將leader均衡地分散在每個實例上,來確保整體的性能穩定。
2)持久化
kafka直接將數據寫到文件系統的日誌中。
對於主要用於日誌處理的消息系統,數據的持久化可以簡單地通過將數據追加到文件中實現,讀的時候從文件中讀就好。這樣做的好處是讀寫都是O(1),並且讀操作不會阻塞寫操作和其他操作。
爲了減少磁盤寫入的次數,broker會將消息暫時buffer起來,當消息的個數達到一定閾值時,再flush到磁盤,這樣減少了磁盤IO調用的次數。
3)日誌
【待補充】
4)主從同步
【待補充】
這段時間真是忙毀,上週末搬家,來這裏到現在還沒收拾好屋子,還沒網絡,這篇博文也是開的手機熱點發的,且看,後續再完善。