Kafka 中主题和分区的概念
Jihongchang(讨论 | 贡献)2022年8月22日 (一) 12:05的版本
1.主题 topic
主题 topic 在 Kafka 中是一个逻辑的概念,Kafka 通过 topic 将消息进行分类。不同的 topic 会被订阅该 topic 的消费者消费。
但是有一个问题,如果说这个 topic 中的消息非常非常多,多到需要几T来存,因为消息是会被保存到 log 日志文件中的。为了解决这个文件过大的问题,Kafka 提出了 Partition 分区的概念。
2.分区 Partition
1)分区的概念
通过 partition 将一个 topic 中的消息分区来存储。这样的好处有多个:
- 分区存储,可以解决统一存储文件过大的问题
- 提高了读写的吞吐量:读和写可以同时在多个分区中进行
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天到后消息会被删除。