天天看點

kafka的檔案格式和副本的Leader選舉

一、kafka的檔案存儲

     在kafka中,一個topic可以有多個分區,分區在實體上是單獨存放的,為了資料安全,一個分區可以有多個副本,而每個分區都有單獨的leader來負責讀寫請求。我們可以通過指令

bin/kafka-topics.sh --create --zookeeper master:2181 --replication-factor 2 --partitions 3 --topic test
           

  來建立一個topic,同時指定副本數和分區數,通過指令

bin/kafka-topics.sh --describe --zookeeper master:2181 --topic test
           
kafka的檔案格式和副本的Leader選舉

   可以看到主題topic有3個分區,每個分區2個副本(副本包括leader本身)且每個分區都有單獨的Leader。當我們往某個分區生産消息的時候,在配置的日志目錄下會有記錄topic分區的log和index,表示的是每個topic的某個分區的日志記錄和索引記錄,預設情況下每個log會被切割成500M一個的資料檔案,檔案預設保留7天,當然這些都是可以修改的。

二、kafka檔案的順序讀寫

     上面我已經說到了在某個分區下的目錄中有log和index檔案,log主要是記錄具體的消息,而index是采用稀疏索引用來記錄某條消息對應的偏移量。

    檢視log檔案的具體内容的指令為:

bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /bigdata/kafka/kafka-logs/test-0/00000000000000000000.log  --print-data-log
           

       這裡我的資料量太大我就不截圖了,日志裡面記錄的是具體的發送消息,包括建立時間,offest等,可以預見的是,如果log檔案達到了我配置的檔案大小那麼就會有一個新檔案産生,而新的資料會在新産生的檔案裡面寫,也就是說這是一個append的過程,隻會在末尾追加資料,這就是順序寫。

    檢視index檔案的具體内容:

kafka的檔案格式和副本的Leader選舉

    左邊offest表示的是在log檔案中的第XXX條消息,position表示的是這條消息的實體偏移量

三、kafka消息的檢索

      其實很簡單主要是用二分查找算法,比如我們要查找一條offest=10000的檔案,kafka首先會在對應分區下的log檔案裡采用二分檢視定位到某個記錄該offest

=10000這條消息的log,然後從相應的index檔案定位其偏移量,然後拿着偏移量到log裡面直接擷取。這樣就完成了一個消息的檢索過程。

四、kafka的leader副本選舉

         可以預見的是,如果某個分區的Leader挂了,那麼其它跟随者将會進行選舉産生一個新的leader,之後所有的讀寫就會轉移到這個新的Leader上,在kafka中,其不是采用常見的多數選舉的方式進行副本的Leader選舉,而是會在Zookeeper上針對每個Topic維護一個稱為ISR(in-sync replica,已同步的副本)的集合,顯然還有一些副本沒有來得及同步。隻有這個ISR清單裡面的才有資格成為leader(先使用ISR裡面的第一個,如果不行依次類推,因為ISR裡面的是同步副本,消息是最完整且各個節點都是一樣的)。

  通過ISR,kafka需要的備援度較低,可以容忍的失敗數比較高。假設某個topic有f+1個副本,kafka可以容忍f個不可用,當然,如果全部ISR裡面的副本都不可用,也可以選擇其他可用的副本,隻是存在資料的不一緻。