當前位置:編程學習大全網 - 源碼下載 - kafka offset的存儲

kafka offset的存儲

offset即消費消息的偏移值,記錄了kafka每個consumergroup的下壹個需要讀取消費位置,保障其消息的消費可靠性。

kafka0.8.1.1以前,offset保存在zk中,存放在/consumers節點下。但是由於頻繁訪問zk,zk需要壹個壹個節點更新offset,不能批量或分組更新,導致offset更新成了瓶頸。後續兩個過渡版本增加了參數“offsets.storage”,該參數可配置為“zookeeper”或“kafka”分別表示offset的保持位置在zk或是broker,默認保留在zk,0.9版本以後offset就默認保存在broker下。若配置的“kafka”,當設置了“dual.commit.enabled”參數時,offset仍然可以提交到zk。

zk中保存offset結構為:

註意:由於kafka對客戶端client向下兼容,低版本的client仍然能夠通過鏈接zk消費數據,並提交offset數據,即使broker版本高於0.9,提交的offset仍然保存在zk;此時仍然存在offset更新瓶頸問題,所以建議盡量使用高版本client,通過鏈接broker方式消費數據。

例如:kafka broker版本2.6.0,consumer版本0.8.2.1:

構建consumer:

啟動消費者消費全部10條歷史消息,查看zk下/consumer節點的消費者信息:

可以看到group “test_group1”對topic “test1”的3個partition消費情況,offset分別為6,2,2。

這裏kafka只記錄了每個group的消費情況,沒有對某壹個consumer做單獨記錄。早期版本/ids節點記錄consumer id信息,owner節點記錄各個partition所屬consumer信息

如上所述,新版本中offset由broker維護,offset信息由壹個特殊的topic “ __consumer_offsets”來保存,offset以消息形式發送到該topic並保存在broker中。這樣consumer提交offset時,只需連接到broker,不用訪問zk,避免了zk節點更新瓶頸。

broker消息保存目錄在配置文件server.properties中:

該目錄下默認包含50個以__consumer_offsets開頭的目錄,用於存放offset:

offset的存放位置決定於groupid的hash值,其獲取方式:

其中numPartitions由offsets.topic.num.partitions參數決定,默認值即50。以groupid “test-group”為例,計數其存儲位置為:__consumer_offsets-12,當其消費全部10條數據後,使用命令查看該目錄下消息記錄:kafka-console-consumer --bootstrap-server localhost:9092 --topic __consumer_offsets --partition 12 --from-beginning --formatter 'kafka.coordinator.group.GroupMetadataManager$OffsetsMessageFormatter'

該數據結構為以groupid-topic-partition作為key,value為OffsetAndMetadata,其中包含了offset信息。可以看到group“test-group”在topic“test1”的三個partition下offset值分別為6,2,2。同保存在zk數據壹樣,offset只記錄groupid的消費情況,對於具體consumer是透明的。

那麽offset具體被發送給哪個broker保存呢?

由上文可知,offset的存儲分區是通過groupid的hash值取得的,那麽offset發送的broker就是該分區的leader broker,這也符合kafka普通消息的發生邏輯。所以,每個group的offset都將發生到壹個broker,broker中存在壹個offset manager 實例負責接收處理offset提交請求,並返回提交操作結果。

參考:

/kafka/2016/11/04/Kafka-Group-Coordinator.html

https://cwiki.apache.org/confluence/display/KAFKA/Offset+Management

  • 上一篇:RabbitMQ筆記九:MessageListenerAdapter詳解
  • 下一篇:Linux內核版本號的意義
  • copyright 2024編程學習大全網