关于Kafka分区与分段的几个问题

本文来说下Kafka分区(Partition)与分段(Segment)相关的几个问题


关于Kafka分区

每个分区都是一个有序、不可变的消息序列,后续新来的消息会源源不断地、持续追加到分区的后面,这相当于一种结构化的提交日志(类似于Git的提交日志)。

分区中的每一条消息都会被分配一个连续的id值(即offset),该值用于唯一标识分区中的每一条消息。


分区的重要作用

  • 分区中的消息数据是存储在日志文件中的,而且同一分区中的消息数据是按照发送顺序严格有序的。分区在逻辑上对应一个日志,当生产者将消息写入分区中时,实际上是写到了分区所对应的日志当中。而日志可以看作是一种逻辑上的概念,它对应于磁盘上的一个目录。一个日志文件由多个Segment(段)来构成,每个Segment对应于一个索引文件与一个日志文件。
  • 借助于分区,我们可以实现Kafka Server的水平扩展。对于一台机器来说,无论是物理机还是虚拟机,其运行能力总归是有上限的。当一台机器到达其能力上限时就无法再扩展了,即垂直扩展能力总是受到硬件制约的。通过使用分区,我们可以将一个主题中的消息分散到不同的Kafka Server上(这里需要使用Kafka集群),这样当机器的能力不足时,我们只需要添加机器就可以了,在新的机器上创建新的分区,这样理论上就可以实现无限的水平扩展能力。
  • 分区还可以实现并行处理能力,向一个主题所发送的消息会发送给该主题所拥有的不同的分区中,这样消息就可以实现并行发送与处理,由多个分区来接收所发送的消息。

Segment(段)

一个分区(partition)是由一系列有序、不可变的消息所构成的。一个partition中的消息数量可能会非常多,因此显然不能将所有消息都保存到一个文件当中。因此,类似于log4j的rolling log,当partition中的消息数量增长到一定程度之后,消息文件会进行切割,新的消息会被写到一个新的文件当中,当新的文件增长到一定程度后,新的消息又会被写到另一个新的文件当中,以此类推;这一个个新的数据文件我们就称之为segment(段)。

因此,一个partition在物理上是由一个或者多个segment所构成的。每个segment中则保存了真实的消息数据。


关于partiton与segment之间的关系

每个partition都相当于一个大型文件被分配到多个大小相等的segment数据文件中,每个segment中的消息数量未必相等(这与消息大小有着紧密的关系,不同的消息所占据的磁盘空间显然是不一样的),这个特点使得老的segment文件可以很容易就被删除掉,有助于提升磁盘的利用效率。

每个partition只需要支持顺序读写即可,segment文件的生命周期是由Kafka Server的配置参数所决定的。比如说,server.properties文件中的参数项log.retention.hours=168就表示7天后删除老的消息文件。


关于分区目录中的4个文件的含义与作用

  • 00000000000000000000.index:它是segment文件的索引文件,它与接下来我们要介绍的00000000000000000000.log数据文件是成对出现的。后缀.index就表示这是个索引文件。
  • 00000000000000000000.log:它是segment文件的数据文件,用于存储实际的消息。该文件是二进制格式的。segment文件的命名规则是partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。没有数字则用0填充。由于这里的主题的消息数量较少,因此只有一个数据文件。
  • 00000000000000000000.timeindex:该文件是一个基于消息日期的索引文件,主要用途是在一些根据日期或是时间来寻找消息的场景下使用,此外在基于时间的日志rolling或是基于时间的日志保留策略等情况下也会使用。实际上,该文件是在Kafka较新的版本中才增加的,老版本Kafka是没有该文件的。它是对*.index文件的一个有益补充。.index文件是基于偏移量的索引文件,而.timeindex则是基于时间戳的索引文件。
  • leader-epoch-checkpoint:是leader的一个缓存文件。实际上,它是与Kafka的HW(High Watermark)与LEO(Log End Offset)相关的一个重要文件。

本文小结

本文详细介绍了Kafka分区与分段相关的知识与内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka 分区数与 brokers(Kafka 服务节点)之间有一定的关系,具体体现在以下几个方面: 1. 分区分布:Kafka 的主题(Topic)被分为多个分区,每个分区都会被分配到不同的 broker 上。分区数决定了一个主题可以被分配到多少个 broker 上进行并行处理。如果分区数小于 brokers 数量,那么部分 broker 可能会没有分配到分区,造成资源浪费;如果分区数大于 brokers 数量,那么每个 broker 上可能会有多个分区,增加了并行处理的能力。 2. 吞吐量和并行度:Kafka分区数也会影响消费者(Consumer)的吞吐量和并行度。每个消费者可以独立地消费一个或多个分区的消息,因此增加分区数可以提高消费者的并行度,从而提高整体的吞吐量。 3. 容错性:Kafka 使用分区副本(Replica)来实现容错性。每个分区都可以有多个副本分布在不同的 broker 上,以防止数据丢失。在创建主题时,可以设置副本因子(Replication Factor)来决定一个主题的每个分区应该有多少个副本。通常建议将副本因子设置为不小于 brokers 数量的值,以确保每个 broker 都能存储主题的副本。 需要根据应用程序的需求和系统环境来设置适当的分区数和 brokers 数量,并保持它们之间的平衡。 总结起来,Kafka 分区数与 brokers 之间的关系主要体现在分区分布、吞吐量和并行度以及容错性方面。分区数的设置应考虑到消费者的并行度、吞吐量需求和副本的容错性要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值