kafka消息是经过主题来进行组织和区分的,每一个主题有分为零个或多个分区,分区数量能够在建立时指定也能够后期修改,不过修改只能增长不能删除,每一个分区又有一个或多个副本,副本中会有一个副本被选作Leader副本,该副本对外提供读写操做,其余副本则是Follower。生产者发送消息到Leader副本的代理节点上,Follower副本从Leader同步数据。
ide
分区的每一个副本对应到一个Log对象,每一个Log有划分为多个LogSegment,每一个LogSegment包括一个日志文件和两个索引文件,其中两个索引文件分别是偏移量索引文件和时间戳索引文件。Log和LogSegment是逻辑概念,日志文件和索引文件才是物理存储对象,下图为主题BBB三个分区的日志文件目录,每一个分区对应一个目录。spa
下图为BBB主题0分区的日志文件(.log)和偏移量文件(.index)以及时间戳文件(.timeindex)。日志文件默认单个日志文件大小为1GB,能够经过修改配置文件来指定大小。Kafka提供日志切割机制,要么达到日志文件大小,若是没有达到大小阈值,可是达到了log.roll.ms或者log.roll.hours设置的值也会进行切割建立新的日志文件。线程
数据文件名称是一堆0,其实这就是数据文件的命名规则,它是由第一条消息的偏移量值而后左补0构成20位长度来造成的。代理
Kafka会把每一个日志段的基准偏移量保存到ConcurrentSkipListMap集合中,经过二分法能够快速定位到消息所在的数据文件和索引文件,而后在索引文件中经过二分法,查找最小值等于指定偏移量的最大偏移量,最后从查找的最大偏移量出开始扫描数据文件,直到查询到偏移量与指定偏移量相等的消息。日志
日志目录中的锁文件orm
同一时刻只能由一个日志管理器实例或者线程来获取该锁文件,该文件只有在Kafka正常关闭后才会被删除,经过该文件能够判断Kafka上次是否正常关闭。
对象
代理启动时会启动包括日志管理器在内的不少管理器,日志管理器是用来专门管理日志的。索引
加载配置文件中的log.dir配置项所配置的路径,并检查路径是否存在,若是不存在就建立,并在这个日志目录下建立.lock锁文件,该文件只有kafka被正常关闭时才会删除。同时建立和加载日志检查点文件,若是不存在就建立,该文件记录每一个主题每一个分区下一次写入磁盘数据的偏移量ip
而后根据检查点文件加载和恢复日志,它会产生一个线程池来完整这个工做。它会检查.kafka_cleanshutdown文件,当代理上一次正常关闭是才会有这个文件,若是不存在则表示第一次启动或者上一次没有正常关闭。kafka
线程开始恢复日志,在内部会为目录下每个分区建立一个任务由线程池里的线程执行。
完成后删除.kafka_cleanshutdown文件,同时关闭线程池。
日志清理:
Kafka提供两种日志清理策略,删除和压缩。经过参数cleanup.policy来指定清理策略。日志清理能够控制到主题级别,能够为不一样主题建立不一样的清理策略。
日志删除,它是一个定时任务在日志管理器启动后会启动它。默认为5分钟执行一次。kafka提供了基于日志保留时长的删除策略和日志大小的策略,默认是168小时,也就是7天,日志被保留7天以后将会删除。默认不设置日志大小。日志保留时长不是经过日志文件的最后修改时间来肯定的,它是基于时间戳索引进行的。
日志压缩