前文介紹了kafka的一些基本原理,接下來我們深入了解下關於kafka的一些機制和優化
前文提到過,乙個topic是分成多個partition 儲存的;topic是邏輯上的概念,partition是物理上的概念,如圖所示:
通過我們可以看出,雖然每個partition內部是有序的,但對於整個topic而言它是無法保證有序性的。partition 的資料會以 日誌檔案的形式儲存到磁碟中,在配置檔案server.properties
中通過屬性log.dirs
指定。在該資料夾下會根據topic和序號來建立資料夾,在該 partition 資料夾中以.log
結尾的檔案是實際儲存資料的檔案,當生產者生產資料,。以.index
結尾的檔案是索引檔案,index 和log 組成乙個segment
。.log 檔案預設只會保持7天內的資料,通過log.retention.hours
配置項指定資料保持時長。當.log 檔案超出最大值時會建立新的 .log檔案和.index檔案,也就是乙個新的segment;其中檔案的名稱以訊息起始偏移量命名。log.segment.bytes
指定log檔案的最大值。當我們去尋找一條訊息的時候,會先根據偏移量來定位到屬於哪乙個segment
, 再通過二分查詢從index檔案中尋找該偏移量對應的索引,再通過索引去log檔案中找到真正的訊息。
為保證producer 傳送的資料不丟失,broker 接收到資料後都需要對producer傳送ack(確認接收) ,如果producer 未收到ack則會重新傳送該條訊息。producer 的 ack 策略又分為三種:
採用全副本同步完成再ack會有乙個問題:當leader 接收完資料,所有的follower開始同步資料,但一旦有乙個follower不能與leader進行同步,那leader會一直等下去,這樣會非常的浪費時間。為此kafka引入了 isr 機制——leader會維護乙個動態的 isr(in-sync replica set)列表,這個列表維護了和leader保持同步的集合。當isr中的follower完成資料的同步之後,leader就會傳送ack。如果follower 長時間未向leader同步資料,則該follower將會被踢出 isr,其他滿足條件的follower也會被加入到isr。這個同步最大時間配置項為replica.lag.time.max.ms
引數設定。如果leader故障了,也會從isr的follower中選舉新的leader。
因為副本的訊息數是存在差異的,可能leader10條,而follower只同步了8條;當leader掛掉,資料就有可能會發生丟失,通過一種機制來保證消費者消費資料的一致性就很有必要了。kafka的資料一致性通過 leo(每個副本的最後一條o'f'fset)和hw(所有的leo中最小的那個)來保證。示意圖:
消費者只能看到offset<=hw 的訊息。
kafka 對訊息消費的處理有兩種:
因為ack機制的存在,producer 向kafka傳送訊息時如果 ack=0,由於producer不等確認訊息是否投遞成功就不管了 ,可能丟失資料,此時消費者最多消費一次訊息;如果ack=1,當producer未收到訊息確認投遞成功時會再次投遞,這個時候可能訊息被投遞了多次,可能會存在重複消費的情況。當kafka開啟資料冪等性且ack=1的時候,此時重複的訊息會被去重,因此不會產生重複消費的情況。啟用冪等性的方式是將producer中的引數enable.idompotence
設定為true。
和rabbitmq一樣,可以指定消費者消費訊息是推模式還是拉模式,邏輯是和 rabbit 一樣的,這裡就不多做解釋了。在消費者組中,有多個消費者,乙個topic中有多個partition。那麼訊息的分配是怎麼樣的呢,首先前文提到過乙個消費者組中的消費者不能同時消費同乙個partition,這是基本原則。然後partiotion的分配機制有兩種,一種是range(範圍) 一種是 roundrobin(輪詢),range示 意圖:
roundrobin 示意圖:
kafka的producer生產資料,要以追加的形式寫入到log檔案中,這個寫磁碟的過程是順序寫,相對於磁碟的隨機寫來說,這個效率要高出很多,這個是kafka高效讀寫的保證之一。而另外的乙個保證高效讀寫的技術是零拷貝,用過netty的小夥伴應該知道這個技術,中間少了兩次使用者態的切換。
kafka的集群中會有乙個broker會被選舉為 controller,負責管理集群broker的上下線,所有topic的副本leader的選舉工作, 而controller的這些管理工作都是需要依賴於kafka的。下圖為leader的選舉示意圖:
的選舉
Kafka限流 Quota 設定
12月 24,2016 nix.huang 如果kafka客戶端是認證的。那麼可以使用userid和clientid兩種認證方式。如果沒有認證只能使用clientid限流。bin kafka configs.sh zookeeper localhost 2181 alter add config p...
kafka ack機制 出現故障資料同步問題
0 producer不等待broker的ack,這一操作提供了乙個最低的延遲,broker一接收到還沒有寫入磁碟就已經返回,當broker故障時有可能丟失資料 例如 當leader掛了,producer仍然往這個leader傳送訊息,就會造成資料丟失 1 producer等待broker 的ack,...
kafka設定超時時間
後台登入的地方 有用kafka傳送登入日誌 某一天 kafka連線超時 導致後台登入很慢 登入不進去 做類似以下修改 設定個超時時間 可以很好解決這個問題 rk new rdkafka producer rk setloglevel log debug rk addbrokers 127.0.0.1...