Kafka参数broker.id详解
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-params-analysis-of-broker-id/
kafka在啟動服務之前必須要設定3個參數:broker.id、log.dirs、zookeeper.connect,這里我們就來重點說一下broker.id這個參數。在Kafka集群中,每個broker都有一個唯一的id值用來區分彼此。Kafka在啟動時會在zookeeper中/brokers/ids路徑下創建一個與當前broker的id為名稱的虛節點,Kafka的健康狀態檢查就依賴于此節點。當broker下線時,該虛節點會自動刪除,其他broker或者客戶端通過判斷/brokers/ids路徑下是否有此broker的id來確定該broker的健康狀態。
可以通過配置文件config/server.properties里的broker.id參數來配置broker的id值,默認情況下broker.id值為-1。Kafka broker的id值必須大于等于0時才有可能正常啟動,但是這里并不是只能通過配置文件config/server.properties來修改這個值,還可以通過meta.properties文件或者自動生成功能來實現broker的id值的設置。
首先來了解一下meta.properties文件。meta.properties文件中的內容參考如下:
# #Sun May 27 23:03:04 CST 2018 version=0 broker.id=1meta.properties文件中記錄了與當前Kafka版本對應的一個version字段,不過目前只有一個固定值0。還有一個broker.id即為當前Kafka broker的id值。Kafka成功啟動之后在每個根目錄下都會有一個meta.properties文件。
Kafka服務啟動時也會加載配置文件config/server.properties里的參數log.dir和log.dirs,這兩個參數用來配置Kafka日志文件所存放的根目錄。一般情況下,log.dir用來配置單個根目錄,log.dirs用來配置多個根目錄,但是Kafka并沒有對此做強制性限制,也就是說log.dir和log.dirs都可以用來配置單個或者多個根目錄。log.dirs的優先級比log.dir高,如果沒有配置log.dirs則才以log.dir配置的為準。默認情況下只配置了log.dir參數,其值為/tmp/kafka-logs。
meta.properties文件與broker.id的關聯如下:
如果config/server.properties配置文件中并未配置broker.id,并且根目錄中也沒有任何meta.properties文件(比如服務第一次啟動時),那么應該作何處理呢?
對于Kafka中還提供了另外兩個參數broker.id.generation.enable和reserved.broker.max.id來配合生成新的broker.id。broker.id.generation.enable參數是用來配置是否開啟自動生成broker.id的功能,默認情況下為true,即開啟此功能。自動生成的broker.id是有一個基準值的,即自動生成的broker.id必須超過這個基準值,這個基準值通過reserved.broker.max.id參數配置,默認值為1000,也就是說默認情況下自動生成的broker.id從1001開始。
自動生成broker.id的原理是先往/brokers/seqid節點中寫入一個空字符串,然后獲取返回的Stat信息中的version的值,然后將version的值和reserved.broker.max.id參數配置的值相加可得。之所以是先往節點中寫入數據再獲取Stat信息,這樣可以確保返回的version值大于0,進而就可以確保生成的broker.id值大于reserved.broker.max.id參數配置的值,符合非自動生成的broker.id的值在[0, reserved.broker.max.id]區間的設定。
初始化時/kafka/brokers/seqid的狀態如下:
[zk: xxx.xxx.xxx.xxx:2181(CONNECTED) 6] get /kafka/brokers/seqid null cZxid = 0x200001b2b ctime = Mon Nov 13 17:39:54 CST 2017 mZxid = 0x200001b2b mtime = Mon Nov 13 17:39:54 CST 2017 pZxid = 0x200001b2b cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 0可以看到dataVersion=0,這個就是前面所說的version。在插入一個空字符串之后,dataVersion就自增1,表示數據發生了變更,這樣通過zookeeper的這個功能來實現集群層面的序號遞增的功能,整體上相當于一個發號器。
[zk: xxx.xxx.xxx.xxx:2181(CONNECTED) 7] set /kafka/brokers/seqid "" cZxid = 0x200001b2b ctime = Mon Nov 13 17:39:54 CST 2017 mZxid = 0x2000e6eb2 mtime = Mon May 28 18:19:03 CST 2018 pZxid = 0x200001b2b cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 2 numChildren = 0大多數情況下我們一般都是通過并且習慣于用最普通的config/server.properties配置文件的方式來設定broker.id的值,但是如果知曉其中的細枝末節的話,在遇到諸如InconsistentBrokerIdException異常時可以處理的游刃有余,也可以通過自動生成broker.id的功能來實現一些另類的功能。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-params-analysis-of-broker-id/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的Kafka参数broker.id详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kafka日志清理之Log Compac
- 下一篇: Kafka解惑之时间轮(TimingWh