|NO.Z.00060|——————————|BigDataEnd|——|Hadoop&kafka.V45|——|kafka.v45|日志存储概述|
一、日志存储概述
### --- 日志存储概述
~~~ Kafka 消息是以主题为单位进行归类,各个主题之间是彼此独立的,互不影响。
~~~ 每个主题又可以分为一个或多个分区。
~~~ 每个分区各自存在一个记录消息数据的日志文件。
[root@hadoop01 ~]# ls /opt/yanqi/servers/kafka/kafka-logs/
cleaner-offset-checkpoint meta.properties replication-offset-checkpoint tp_demo_03-1 tp_re_01-3 tp_re_02-0 tp_re_02-2
log-start-offset-checkpoint recovery-point-offset-checkpoint tp_demo_03-0 tp_demo_03-2 tp_re_01-4 tp_re_02-1
[root@hadoop01 ~]# kafka-topics.sh --zookeeper localhost:2181/myKafka --describe --topic tp_demo_03
Topic:tp_demo_03 PartitionCount:3 ReplicationFactor:2 Configs:
Topic: tp_demo_03 Partition: 0 Leader: 0 Replicas: 0,1 Isr: 1,0
Topic: tp_demo_03 Partition: 1 Leader: 1 Replicas: 1,0 Isr: 0,1
Topic: tp_demo_03 Partition: 2 Leader: 0 Replicas: 0,1 Isr: 1,0
~~~ # 图中,创建了一个 tp_demo_03 主题,
~~~ 其存在3个 Parition,对应的每个Parition下存在一个[Topic-Parition] 命名的消息日志文件。
~~~ 在理想情况下,数据流量分摊到各个 Parition 中,实现了负载均衡的效果。
~~~ 在分区日志文件中,你会发现很多类型的文件,比如: .index、.timestamp、.log、.snapshot 等。
~~~ 其中,文件名一致的文件集合就称为 LogSement。
[root@hadoop01 ~]# ls /opt/yanqi/servers/kafka/kafka-logs/tp_demo_03-0/
00000000000000000000.index 00000000000000000000.log 00000000000000000000.timeindex leader-epoch-checkpoint
[root@hadoop01 ~]# ls /opt/yanqi/servers/kafka/kafka-logs/tp_demo_03-1/
00000000000000000000.index 00000000000000000000.log 00000000000000000000.timeindex leader-epoch-checkpoint
[root@hadoop01 ~]# ls /opt/yanqi/servers/kafka/kafka-logs/tp_demo_03-2/
00000000000000000000.index 00000000000000000000.log 00000000000000000000.timeindex leader-epoch-checkpoint
### --- LogSegment
~~~ 分区日志文件中包含很多的 LogSegment
~~~ Kafka 日志追加是顺序写入的
~~~ LogSegment 可以减小日志文件的大小
~~~ 进行日志删除的时候和数据查找的时候可以快速定位。
~~~ ActiveLogSegment 是活跃的日志分段,拥有文件拥有写入权限,其余的 LogSegment 只有只读的权限。
~~~ 日志文件存在多种后缀文件,重点需要关注 .index、.timestamp、.log 三种类型。
二、类别作用
后缀名 | 说明 |
.index | 偏移量索引文件 |
.timestamp | 时间戳索引文件 |
.log | 日志文件 |
.snapshot | 快照文件 |
.deleted | |
.cleaned | 日志清理临时文件 |
.swap | 日志压缩之后临时文件 |
.leader-epoch-checkpoint |
~~~ # 每个 LogSegment 都有一个基准偏移量,表示当前 LogSegment 中第一条消息的 offset。
~~~ 偏移量是一个 64 位的长整形数,固定是20位数字,长度未达到,用 0 进行填补,
~~~ 索引文件和日志文件都由该作为文件名命名规则(00000000000000000000.index、00000000000000000000.timestamp、00000000000000000000.log)。
~~~ 如果日志文件名为 00000000000000000121.log ,
~~~ 则当前日志文件的一条数据偏移量就是121(偏移量从 0 开始)。
三、日志与索引文件
配置条目 | 默认值 | 说明 |
log.index.interval.bytes | 4096(4K) | 增加索引项字节间隔密度, 会影响索引文件中的区间密度和查询效率 |
log.segment.bytes | 1073741824(1G) | 日志文件最大值 |
log.roll.ms | 当前日志分段中消息的最大时间戳与当前系统的 时间戳的差值允许的最大范围,单位毫秒 |
|
log.roll.hours | 168(7天) | 当前日志分段中消息的最大时间戳与当前系统的 时间戳的差值允许的最大范围,单位小时 |
log.index.size.max.bytes | 10485760(10MB) | 触发偏移量索引文件或时间戳索引文件分段字节限额 |
### --- 配置项默认值说明
~~~ 偏移量索引文件用于记录消息偏移量与物理地址之间的映射关系。
~~~ 时间戳索引文件则根据时间戳查找对应的偏移量。
~~~ Kafka 中的索引文件是以稀疏索引的方式构造消息的索引,
~~~ 并不保证每一个消息在索引文件中都有对应的索引项。
~~~ 每当写入一定量的消息时,
~~~ 偏移量索引文件和时间戳索引文件分别增加一个偏移量索引项和时间戳索引项。
~~~ 通过修改 log.index.interval.bytes 的值,改变索引项的密度。
### --- 切分文件
~~~ # 当满足如下几个条件中的其中之一,就会触发文件的切分:
~~~ 当前日志分段文件的大小超过了 broker 端参数 log.segment.bytes 配置的值。
~~~ log.segment.bytes 参数的默认值为 1073741824,即 1GB。
~~~ 当前日志分段中消息的最大时间戳与
~~~ 当前系统的时间戳的差值大于 log.roll.ms 或log.roll.hours 参数配置的值。
~~~ 如果同时配置了 log.roll.ms 和 log.roll.hours 参数,那么 log.roll.ms 的优先级高。
~~~ 默认情况下,只配置了 log.roll.hours 参数,其值为168,即 7 天。
~~~ 偏移量索引文件或时间戳索引文件的大小达到 broker 端参数 log.index.size.max.bytes配置的值。
~~~ log.index.size.max.bytes 的默认值为 10485760,即 10MB。
~~~ 追加的消息的偏移量与当前日志分段的偏移量之间的差值大于 Integer.MAX_VALUE ,
~~~ 即要追加的消息的偏移量不能转变为相对偏移量。
~~~ # 为什么是 Integer.MAX_VALUE ?
~~~ 1024 * 1024 * 1024=1073741824
~~~ 在偏移量索引文件中,每个索引项共占用 8 个字节,并分为两部分。
~~~ 相对偏移量和物理地址。
~~~ 相对偏移量:表示消息相对与基准偏移量的偏移量,占 4 个字节
~~~ 物理地址:消息在日志分段文件中对应的物理位置,也占 4 个字节
~~~ 4 个字节刚好对应 Integer.MAX_VALUE ,如果大于 Integer.MAX_VALUE ,
~~~ 则不能用 4 个字节进行表示了。
### --- 索引文件切分过程
~~~ 索引文件会根据 log.index.size.max.bytes 值进行预先分配空间,即文件创建的时候就是最大值
~~~ 当真正的进行索引文件切分的时候,才会将其裁剪到实际数据大小的文件。
~~~ 这一点是跟日志文件有所区别的地方。其意义降低了代码逻辑的复杂性。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor