目录

一、消息和日志的关系

二、查看Kafka主题(Topic)情况

三、查看Kafka数据存储(Log)情况

日志分段存储


一、消息和日志的关系

可以理解Topic是一个类别的名称,同类消息发送到同一个Topic下面。对于每一个Topic,下面可以有多个分区(Partition)日志文件:

Partition是一个有序的message序列(消息队列),这些message按顺序添加到一个叫做commit log的文件中。每个partition中的消息都有一个唯一的编号,称之为offset,用来唯一标示某个分区中的message

每个partition,都对应一个commit log文件。一个partition中的messageoffset都是唯一的,但是不同的partition中的message的offset可能是相同的。

kafka一般不会删除消息,不管这些消息有没有被消费。只会根据配置的日志保留时间(log.retention.hours)确认消息多久被删除,默认保留最近一周的日志消息。kafka的性能与保留的消息数据量大小没有关系,因此保存大量的数据消息日志信息不会有什么影响。

每个consumer是基于自己在commit log中的消费进度(offset)来进行工作的。在kafka中,消费offset由consumer自己来维护;一般情况下我们按照顺序逐条消费commit log中的消息,当然我可以通过指定offset来重复消费某些消息,或者跳过某些消息。这意味kafka中的consumer对集群的影响是非常小的,添加一个或者减少一个consumer,对于集群或者其他consumer来说,都是没有影响的,因为每个consumer维护各自的消费offset

二、查看Kafka主题(Topic)情况

创建多个分区的主题:

bin/kafka-topics.sh --create --zookeeper 192.168.3.33:2181 --replication-factor 1 --partitions 2 --topic test-1

查看下topic的情况:

bin/kafka-topics.sh --describe --zookeeper 192.168.3.33:2181 --topic test-1

以下是输出内容的解释,第一行是所有分区的概要信息,之后的每一行表示每一个partition的信息。

  • Leader节点负责给定Partition的所有读写请求。
  • Replicas表示某个Partition在哪几个Broker上存在备份。不管这个几点是不是”Replicas“,甚至这个节点挂了,也会列出。
  • IsrReplicas的一个子集,它只列出当前还存活着的,并且已同步备份了该Partition的节点。

我们可以运行相同的命令查看之前创建的名称为”test“的Topic

bin/kafka-topics.sh --describe --zookeeper 192.168.3.33:2181 --topic test

之前设置了Topic的Partition数量为1,备份因子为1,因此显示就如上所示了。

//本部分只是演示了一个Broker的情况,有关集群版可以看集群部分的内容

三、查看Kafka数据存储(Log)情况

进入kafka的数据文件存储目录,查看test和test-1主题的消息日志文件:

消息日志文件主要存放在分区文件夹里的以.log结尾的日志文件里,如下是test-1主题对应的分区0的消息日志:

当然我们也可以通过如下命令增加topic的分区数量(目前kafka不支持减少分区):

bin/kafka-topics.sh -alter --partitions 3 --zookeeper 192.168.3.33:2181 --topic test

可以这么来理解Topic,Partition和Broker

一个Topic,代表逻辑上的一个业务数据集,比如按数据库里不同表的数据操作消息区分放入不同Topic,订单相关操作消息放入订单Topic,用户相关操作消息放入用户Topic。对于大型网站来说,后端数据都是海量的,订单消息很可能是非常巨量的,比如有几百个G甚至达到TB级别,如果把这么多数据都放在一台机器上可定会有容量限制问题,那么就可以在Topic内部划分多个Partition来分片存储数据,不同的Partition可以位于不同的机器上,每台机器上都运行一个Kafka的进程Broker

为什么要对Topic下数据进行分区存储

(1)commit log 文件会受到所在机器的文件系统大小的限制,分区之后可以将不同的分区放在不同的机器上,相当于对数据做了分布式存储,理论上一个Topic可以处理任意数量的数据。

(2)为了提高并行度。

日志分段存储

Kafka 一个分区的消息数据对应存储在一个文件夹下,以topic名称+分区号命名,消息在分区内是分段(segment)存储,每个段的消息都存储在不一样的log文件里,这种特性方便old segment file快速被删除,kafka规定了一个段位的 log 文件最大为 1G,做这个限制目的是为了方便把 log 文件加载到内存去操作:

00000000000000000000.index

部分消息的offset索引文件,kafka每次往分区发4K(可配置)消息就会记录一条当前消息的offset到index文件(稀疏索引),如果要定位消息的offset会先在这个文件里快速定位,再去log文件里找具体消息

00000000000000000000.timeindex

消息的发送时间索引文件,kafka每次往分区发4K(可配置)消息就会记录一条当前消息的发送时间戳与对应的offset到timeindex文件(稀疏索引),如果需要按照时间来定位消息的offset,会先在这个文件里查找。

# 消息存储文件,主要存offset和消息体
00000000000000000000.log
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐