kafka是一個以日志形式存盤訊息的訊息中間件,以高吞吐而聞名,

一、生產者producer
1.ack模式
前提:kafka的服務器broker是個集群
1.1 ack = 0
生產者只管投遞,并不關注kafka服務器broker是否接收到訊息,
缺點:可能會出現訊息丟失,
1.2 ack = 1
生產者投遞訊息后,broker副本的leader接收到訊息,在本地持久化后,就回傳生產者訊息發送成功;然后開啟執行緒向其它follower同步這條訊息,
缺點:leader在ack后,還未來得及將訊息同步給follower就宕機了,kafka集群新的leader并沒這條訊息,原leader啟動后,由于高水位線機制(下文會講到),也不會有這條訊息,該訊息丟失,
解決方法:建立一張本地訊息表,生產者發送訊息前,將訊息先寫入本地,
1.3 ack = -1
生產者投遞訊息后,broker副本的leader接收訊息后,將訊息同步給整個副本集群后,在回傳給生產者,
缺點:耗時久;leader將資料都同步給副本集群后,在ack程序中宕機;生產者會以為出現錯誤而重試,導致新leader上重復接收了這條訊息,

2.批量發送
kafka發送訊息不會一條一條發送,而是有一個緩沖區,當緩沖區滿了,生產者會批量將這些訊息發送到broker,減少IO通訊次數,也會通過定時任務定時發送緩沖區的訊息,
3.訊息壓縮
發送訊息時會將訊息進行壓縮(去掉注釋,空格等資訊),降低帶寬,
4.零拷貝(linux的api)
采用dma拷貝代替cpu拷貝,降低cpu壓力,
同時使用mmap記憶體映射,使用戶空間和內核空間進行記憶體共享,減少用戶態和內核態的切換次數,
使用sendfile將mmap中的資料直接發送到網卡傳輸,
整個程序cpu切換兩次,cpu拷貝0次,

二、訊息服務器
1. broker
kafka的物理服務器,用于保存和轉發訊息,
2.topic
邏輯概念,訊息的一種型別,或者說訊息的一種屬性,
3.partition
topic的物理存盤概念,也是topic在broker中的具體存放空間,
以segment格式存放(類似于ConcurrentHashMap7的原理,分攤治理),當單個segment檔案的大小超過500M(默認配置)時,會自動生成下一個Segment,檔案以上一個segment的最大offset命名,長度20位,不足補零,
segment中由.index和.log組成,.index為offset的稀疏索引,key為offset,value為地址指標;.log為實際存放訊息的檔案,key為地址指標,value為訊息體,

4.zookeeper
kafka的注冊中心,存盤broker、topic、partition、group等資訊,
5.controller
管理副本選舉以及topic分配等操作,通過分布式鎖的方式創建,(多個broker去zk上創建相同的臨時節點,誰創建成功誰就是controller,其余broker訂閱該節點,當controller宕機后,zk會自動洗掉,發送事件通知這些broker重新競爭),
6.副本
集群模式下,為了高可用,資料會在多個broker上存在多份,也就是副本,controller會通過broker與zk的鏈接而保存一個副本的集合,即ISR,
副本leader就是ISR的第一個節點,當leader宕機后,zk與其斷開鏈接,controller將其從ISR頭部剔除,新的leader就是ISR的新頭部,原leader恢復后,與ZK保持通訊,controller將其重新加入ISR,放入集合末尾,
每個副本都有兩個引數:LEO和HW,LEO表示當前副本中存放的最大的offset值,HW則表示消費者可以看到的最大offset值(即所有副本交集中最大的offset),當副本資料同步時,follower副本會舍棄高于HW的offset的訊息,重新去leader同步訊息,所以可能會 出現訊息丟失,

三、消費者consumer
1.consumer
消費者節點,訂閱partition,根據offset從partition上取資料,當消費成功后,會commit offset至partition,partition通過定時任務洗掉這些已消費的資料,
2.group
消費組,將消費者分類,同一個消費組中的消費者消費同一個partition的相同訊息,commit offset時會有問題,
3.消費記錄
topic的日志檔案中會消費者在磁區中的消費記錄,默認分成50個檔案,來通過key(key=group-id.topic.partition)取模的方式,找到檔案查詢消費記錄,進而消費下一個offset,

?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354567.html
標籤:其他
