`
农村外出务工男JAVA
  • 浏览: 104722 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

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


 

   可以看到主题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文件的具体内容:

 
    左边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里面的副本都不可用,也可以选择其他可用的副本,只是存在数据的不一致。

  • 大小: 18.3 KB
  • 大小: 11.3 KB
  • 大小: 35.3 KB
分享到:
评论
1 楼 zhuwensheng 2018-04-03  
它是怎么感知leader不可用需要选举新的leader呢

相关推荐

Global site tag (gtag.js) - Google Analytics