Kafka 中主题和分区的概念

来自姬鸿昌的知识库
跳到导航 跳到搜索

1.主题 topic

主题 topic 在 Kafka 中是一个逻辑的概念,Kafka 通过 topic 将消息进行分类。不同的 topic 会被订阅该 topic 的消费者消费。

但是有一个问题,如果说这个 topic 中的消息非常非常多,多到需要几T来存,因为消息是会被保存到 log 日志文件中的。为了解决这个文件过大的问题,Kafka 提出了 Partition 分区的概念。


2.分区 Partition

1)分区的概念

通过 partition 将一个 topic 中的消息分区来存储。这样的好处有多个:

  • 分区存储,可以解决统一存储文件过大的问题
  • 提高了读写的吞吐量:读和写可以同时在多个分区中进行
分区.png


2)创建多分区的主题

[root@localhost ~]# /usr/local/kafka/kafka_2.11-2.4.0/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic test1
Created topic test1.
[root@localhost ~]#

3.Kafka 中消息日志文件中保存的内容

  • 00000000000000000000.log:这个文件中保存的就是消息
  • __consumer_offsets-49:

Kafka 内部自己创建了 __consumer_offsets 主题包含了50个分区。这个主题用来存放消费者消费某个主题的偏移量。

因为每个消费者都会自己维护着消费的主题的偏移量,也就是说每个消费者会把消费的主题的偏移量自主上报给 Kafka 中的默认主题:__consumer_offsets。

因此 Kafka 为了提升这个主题的并发性,默认设置了50个分区。

提交到哪个分区:通过 hash 函数:hash(consumerGroupId)%__consumer_offsets 主题的分区数

提交到该主题中的内容是:key 是 consumerGroupId+topic+分区号,value 就是 offset 的值

  • 文件中保存的消息,默认保存7天。7天到后消息会被删除。