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里面的副本都不可用,也可以选择其他可用的副本,只是存在数据的不一致。
上一篇: 自定义类加载器与spring的集成
下一篇: zookeeper事件监听实战