苏州实力做网站公司有哪些,怎么自己设计房子效果图,视频剪辑在哪里学,常州网站制作czyzj文章目录 1. 分区和副本的存储结构1. 分区和副本的分布2. 存储目录结构3. 文件描述 2. 相关配置3. 数据文件类型4. 数据定位原理LogSegment 类UnifiedLog 类 5. 副本数据同步HW水位线LEO末端偏移量HW更新原理 6. 数据清除 1. 分区和副本的存储结构
在一个多 broker 的 Kafka 集… 文章目录 1. 分区和副本的存储结构1. 分区和副本的分布2. 存储目录结构3. 文件描述 2. 相关配置3. 数据文件类型4. 数据定位原理LogSegment 类UnifiedLog 类 5. 副本数据同步HW水位线LEO末端偏移量HW更新原理 6. 数据清除 1. 分区和副本的存储结构
在一个多 broker 的 Kafka 集群中topic 的分区和副本在各个 broker 上的存储文件夹分布如下
假设有以下设置
一个 Kafka 集群包含 3 个 brokerbroker 0, broker 1, broker 2。一个 topic my-topic有 3 个分区partition 0, partition 1, partition 2。每个分区有 2 个副本。
1. 分区和副本的分布
Kafka 会在多个 broker 之间分配分区和副本。假设分配如下
partition 0 leader: broker 0follower: broker 1 partition 1 leader: broker 1follower: broker 2 partition 2 leader: broker 2follower: broker 0
2. 存储目录结构
每个 broker 的数据目录结构如下假设 log.dirs 配置为 /var/lib/kafka/data
Broker 0 (/var/lib/kafka/data)
/var/lib/kafka/data
└── my-topic-0 # partition 0 leader├── 00000000000000000000.log├── 00000000000000000000.index├── 00000000000000000000.timeindex
└── my-topic-2 # partition 2 follower├── 00000000000000000000.log├── 00000000000000000000.index├── 00000000000000000000.timeindexBroker 1 (/var/lib/kafka/data)
/var/lib/kafka/data
└── my-topic-0 # partition 0 follower├── 00000000000000000000.log├── 00000000000000000000.index├── 00000000000000000000.timeindex
└── my-topic-1 # partition 1 leader├── 00000000000000000000.log├── 00000000000000000000.index├── 00000000000000000000.timeindexBroker 2 (/var/lib/kafka/data)
/var/lib/kafka/data
└── my-topic-1 # partition 1 follower├── 00000000000000000000.log├── 00000000000000000000.index├── 00000000000000000000.timeindex
└── my-topic-2 # partition 2 leader├── 00000000000000000000.log├── 00000000000000000000.index├── 00000000000000000000.timeindex3. 文件描述
每个分区目录包含多个文件
.log 文件存储实际的消息数据。.index 文件存储消息偏移量索引以便快速定位消息。.timeindex 文件存储消息时间戳索引以便基于时间进行查找。
2. 相关配置
在 Apache Kafka 中消息到达 leader broker 后实际上是先写入操作系统的页缓存然后由操作系统决定何时将数据刷入磁盘。
Kafka 允许通过配置参数来控制消息何时刷入磁盘。主要有以下几个重要的参数
log.flush.interval.messages指定在写入多少条消息后强制将数据刷入磁盘。默认为 Long.MAX_VALUE即不基于消息数量进行刷盘。log.flush.interval.ms指定时间间隔以毫秒为单位强制将数据刷入磁盘。默认为 Long.MAX_VALUE即不基于时间进行刷盘。log.flush.scheduler.interval.ms默认值为 3000 毫秒。这只是一个检查的频率实际的刷盘行为是由 log.flush.interval.ms 决定的。当调度器检查时如果发现已经超过了 log.flush.interval.ms 设置的时间间隔就会触发刷盘操作。log.segment.bytes控制单个日志段文件的最大大小当一个日志段文件达到指定大小时Kafka 会创建一个新的日志段文件默认值1G。log.segment.delete.delay.ms控制日志段文件在被删除之前的延迟时间。当一个日志段文件被标记为删除后Kafka 会等待指定的延迟时间才会真正删除该文件。这为潜在的恢复操作提供了缓冲时间。默认值60000 ms。log.roll.ms 和 log.roll.hours控制日志段文件的滚动时间间隔无论日志段文件的大小如何当达到指定的时间间隔时Kafka 会创建一个新的日志段文件。log.roll.hours默认值168 小时7 天。
3. 数据文件类型 .index 文件 描述这是 Kafka 的偏移量索引文件。它用于快速查找消息在日志文件中的位置。命名格式00000000000000000000.index作用通过这个索引文件Kafka 可以快速定位消息在日志文件中的物理位置以便更快地读取消息。 .log 文件 描述这是 Kafka 的日志文件存储实际的消息数据。命名格式00000000000000000000.log作用包含了生产者发送的消息内容。每个日志文件是一个分区的一部分日志文件的命名表示消息的起始偏移量。 .timeindex 文件 描述这是 Kafka 的时间戳索引文件存储消息的时间戳索引。命名格式00000000000000000000.timeindex作用通过这个文件Kafka 可以根据时间戳快速查找消息。这个文件对于实现基于时间的消息查找非常重要。 .snapshot 文件 描述这是 Kafka 的快照文件记录了日志段的元数据快照。命名格式00000000000000000016.snapshot作用用于恢复日志段的元数据保证在崩溃恢复时能够正确地重建索引和时间戳数据。 leader-epoch-checkpoint 文件 描述这是 Kafka 用于记录 leader 选举周期的检查点文件。作用记录了分区的 leader 副本在不同的选举周期中的偏移量信息帮助 Kafka 在故障恢复时确定正确的 leader 和消息偏移量。 partition.metadata 文件 描述这是 Kafka 的分区元数据文件。作用存储分区的基本元数据信息如分区的 leader、replica 列表等用于分区的管理和协调。
4. 数据定位原理
log等文件直接打开会乱码使用以下工具可以解析到控制台。
kafka-run-class.sh kafka.tools.DumpLogSegments --files /path/to/log-file.log --print-data-log一个log文件里面有如下内容
Kafka 日志文件中的内容并不是简单的按行排列的消息而是采用了批处理batch的方式来存储消息。
那么.index文件中可能是如下内容
offset: 3 position: 95.index 文件并不会为每一条消息都记录映射关系而是每隔一定的字节数由配置 log.index.interval.bytes 决定默认4096记录一次。
如上图
LogSegment 类
LogSegment 主要负责一个段的日志管理。它包括
日志文件.log存储实际的消息数据。偏移量索引文件.index存储消息偏移量到物理位置的映射。时间戳索引文件.timeindex存储消息时间戳到物理位置的映射。
UnifiedLog 类
UnifiedLog 管理一个分区的所有日志段。它通过跳表(ConcurrentSkipListMap)实现多个 LogSegment 日志的连续存储。UnifiedLog 的主要职责包括
消息写入将消息追加到当前活动的 LogSegment 中。如果当前日志段已满滚动到新的日志段。消息读取根据偏移量或时间戳查找并读取消息可能跨越多个日志段。日志截断根据保留策略如日志保留时间或大小截断过期或不需要的日志段。数据恢复在 broker 重启或故障恢复时从日志段中恢复数据。
如图要查询偏移量为7的数据 通过跳表定位到对应的LogSegment 通过.index经由二分法等高效定位指定偏移量的位置如果没记录则使用最大的小于偏移量位置 按照指定位置快速定位到偏移量7的位置或更前面一些
5. 副本数据同步 follower会定时向leader拉取数据。
HW水位线 水位线HW是 Kafka 中每个分区的一个偏移量它表示已经被所有同步副本leader 和 follower确认并复制的最高偏移量。 数据一致性HW 确保只有那些已经被所有同步副本成功复制的消息才会对消费者可见。这样可以防止数据不一致的问题防止读取到未被完全复制的消息。 数据可靠性HW 确保了在系统发生故障时数据不会丢失并且消费者读取到的数据是可靠的。如果设置了 acksall那么只有当所有同步副本都确认收到消息后HW 才会更新。这确保了数据已经被多个副本存储防止数据丢失。 故障恢复当 leader 副本故障时Kafka 会从同步副本中选举一个新的 leader 副本。新的 leader 会从 HW 位置开始确保它拥有所有已提交的消息。 提高数据处理的可靠性和简化系统设计。生产者和消费者不需要处理复杂的数据一致性逻辑只需依赖 Kafka 的 HW 机制。消费者读取的数据都是已经被确认的可靠数据避免处理未确认数据带来的复杂性和错误。
LEO末端偏移量
LEOLog End Offset是 Kafka 中的一个重要概念代表一个分区的日志末端偏移量。具体来说LEO 是指分区中下一条待写入消息的偏移量。
HW更新原理
Leader会记录所有副本的LEO以及HW。
Follower会记录自己的LEO以及HW。 消息来到LeaderLeader更新自身LEO。 Follower向Leader同步数据同步发送自身LEOLeader更新LEO数据并更新HW。 Leader将数据返回到Follower并携带HWFollowe同步HW的值并更新自身LEO。
如此反复LEO和HW就在不断地更新。
6. 数据清除
log.retention.hourslog.retention.minuteslog.retention.ms日志保留的时间。超过这个时间的日志文件将被删除。log.retention.hours默认值为168即 7 天log.retention.check.interval.ms指定 Kafka Broker 多长时间检查一次日志文件并根据配置的日志保留策略删除或压缩过期的日志文件。默认值300000 毫秒即 5 分钟.log.retention.bytes每个分区保留的最大日志大小超过这个大小的日志将被删除。默认值-1表示没有大小限制。log.cleanup.policy日志清理策略支持 delete 和 compact 两种模式。delete 模式表示根据保留策略删除旧日志compact 模式表示日志压缩。默认值为delete。log.cleaner.min.cleanable.ratio日志分段中可以被清理的最小比例。仅当分段中可清理的日志比例超过此值时才会触发日志压缩。log.cleaner.delete.retention.ms被标记为删除的记录在清理前的保留时间以毫秒为单位。在此时间之后记录将从日志中永久删除。
关于 log.cleanup.policycompact因为数据会丢失所以这种策略只适用于保存数据最新状态的特殊场景。压缩步骤如下 标记旧数据 Kafka会通过定期扫描日志分段log segment来查找每个key的最新值。对于同一个keyKafka会将旧的值标记为删除通常是通过在记录上设置一个删除标记。 合并过程 Kafka在后台运行一个合并过程compaction process这个过程会将分段中旧的key值对删除保留最新的key值对。合并过程是增量进行的Kafka并不会在每次写入消息时都触发这个过程。 实际删除 被标记为删除的key值对并不会立即从日志分段中删除。Kafka的压缩过程是定期进行的时间间隔和触发条件可以通过配置参数来调整。默认情况下Kafka会在后台线程中异步执行这个压缩过程。