Kafka Topic

Kafka Topic(主题) 是 Kafka 中数据存储和管理的核心单元。生产者将消息发送到主题,消费者从主题中读取消息。Kafka 的主题设计是分布式、高吞吐量和高可靠性的基础。

1. 什么是 Kafka Topic?

Kafka 的 主题 是一个逻辑分类,用于存储和组织消息。每个主题可以分为多个 分区(Partitions),每个分区中的消息是有序的。主题提供了以下核心特性:

  • 分区(Partitioning): 一个主题由多个分区组成,每个分区是一个有序的消息队列。
  • 复制(Replication): 分区可以被复制到多个 Kafka Broker 上,提供容错能力。
  • 日志结构(Log): 消息以追加方式存储到分区的日志中,每条消息都有唯一的 偏移量(Offset)

2. Kafka Topic 的架构

  1. 主题和分区:每个主题可以分为多个分区。分区内的消息是有序的,但不同分区之间没有顺序保证。
  2. 偏移量(Offset):消息在分区中的唯一编号,用于标识消息的顺序。消费者使用偏移量跟踪消费进度。
  3. 复制(Replication):每个分区可以有一个或多个副本。一个副本为主分区(Leader),其他副本为副本分区(Follower)。生产者和消费者只与主分区交互。

3. Kafka Topic 的管理

Kafka 提供了多种命令行工具和 API 来管理主题,包括创建、查看、删除和修改主题的配置。

3.1 创建主题

使用 kafka-topics.sh 创建主题:

bin/kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 2

参数说明:

  • --topic: 主题名称。
  • --partitions: 分区数,决定消息的分布。
  • --replication-factor: 副本因子,决定每个分区的副本数量。

3.2 查看主题

查看所有主题列表:

bin/kafka-topics.sh --list --bootstrap-server localhost:9092

查看特定主题的详细信息:

bin/kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092

输出示例:

Topic: my-topic  PartitionCount: 3  ReplicationFactor: 2
Partition: 0  Leader: 1  Replicas: 1,2  Isr: 1,2
Partition: 1  Leader: 2  Replicas: 2,3  Isr: 2,3
Partition: 2  Leader: 3  Replicas: 3,1  Isr: 3,1

字段解释:

  • Leader: 负责处理读写请求的主分区。
  • Replicas: 分区的所有副本。
  • Isr (In-Sync Replicas): 当前与 Leader 同步的副本。

3.3 删除主题

删除主题:

bin/kafka-topics.sh --delete --topic my-topic --bootstrap-server localhost:9092

4. Kafka Topic 的配置

Kafka 主题支持多种配置,可以通过 CLI 或 API 设置。

4.1 常见配置项

cleanup.policy

设置日志清理策略:

delete

compact

delete

retention.ms

消息的保留时间(毫秒)。

604800000

(7天)

retention.bytes

消息的最大存储容量(字节)。

无限制

segment.bytes

单个日志分段的最大大小(字节)。

1073741824

(1GB)

segment.ms

日志分段的最长保留时间(毫秒)。

无限制

min.insync.replicas

必须同步的副本数量,用于控制写入的可靠性。

1

max.message.bytes

单条消息的最大大小(字节)。

1048576

(1MB)

4.2 修改主题配置

可以使用 kafka-configs.sh 修改主题配置:

bin/kafka-configs.sh --alter --bootstrap-server localhost:9092 --entity-type topics --entity-name my-topic --add-config retention.ms=259200000

查看主题配置:

bin/kafka-configs.sh --describe --bootstrap-server localhost:9092 --entity-type topics --entity-name my-topic

5. Kafka Topic 的日志管理

Kafka 的日志管理主要通过以下方式控制:

5.1 日志清理策略

  1. 删除(Delete):默认清理策略,超过保留时间或大小的消息将被删除。配置:cleanup.policy=delete
  2. 压缩(Compact):基于键的清理策略,只保留每个键的最新值。配置:cleanup.policy=compact

5.2 消息保留策略

  1. 基于时间:使用 retention.ms 设置消息的保留时间。示例:保留 3 天的消息。
  2. 基于大小:使用 retention.bytes 设置日志的最大存储大小。示例:限制主题存储为 1GB。

6. Kafka Topic 的分区管理

分区是 Kafka 提高并发性和扩展性的关键。

6.1 增加分区

可以动态增加主题的分区数:

bin/kafka-topics.sh --alter --topic my-topic --bootstrap-server localhost:9092 --partitions 5

注意:增加分区可能导致消息顺序被打乱,因为 Kafka 不会自动将现有数据重新分配到新分区。

6.2 分区的分配策略

Kafka 的分区可以通过以下方式分配:

  1. 轮询(Round Robin): 默认策略,消息均匀分布到所有分区。
  2. 基于键的分区(Key-based Partitioning): 使用消息键的哈希值选择分区。
  3. 自定义分区器(Custom Partitioner): 自定义分区逻辑。

7. Kafka Topic 的监控

Kafka 提供多种工具和指标,用于监控主题的状态和性能。

7.1 使用 CLI 工具

查看主题的分区状态:

bin/kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092

7.2 使用 JMX 监控

通过 JMX 暴露 Kafka 的主题指标,例如:

  • UnderReplicatedPartitions: 未同步的分区数。
  • MessagesInPerSec: 每秒写入的消息数。
  • BytesInPerSec: 每秒写入的字节数。
  • BytesOutPerSec: 每秒读取的字节数。

7.3 使用 Prometheus 和 Grafana

通过 Kafka Exporter 和 JMX Exporter 集成 Prometheus 和 Grafana,监控主题的性能。

8. Kafka Topic 的设计与优化

8.1 分区数的选择

  • 根据生产者和消费者的并发需求选择分区数。
  • 分区过少可能导致性能瓶颈,分区过多会增加管理开销。

8.2 副本因子的选择

  • 通常设置为 2 或 3,以确保高可用性。
  • 副本因子不应超过 Kafka Broker 的总数。

8.3 消息清理策略

  • 使用删除策略(delete)处理历史数据。
  • 使用压缩策略(compact)处理需要保留最新状态的场景。
Kafka碎碎念 文章被收录于专栏

Kafka的一些碎碎念,哈哈哈哈哈

全部评论
m
点赞 回复 分享
发布于 2025-01-14 22:39 陕西

相关推荐

老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本 专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴 快手 去哪儿 小鹏汽车 不知名的一两个小厂其中字节13场 两次3面挂 两次2面挂 一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂 最后一次到录用评估 至今无消息滴滴三面完 没几天挂了 所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通 至今无消息小鹏汽车hr 至今无消息美团2面挂 然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂 这个是我菜,面试官太牛逼了拼多多二面挂 3道题也全写了 也没问题是回答不出来的 泡一周后挂腾讯面了5次 一次2面挂 三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
不知名牛友_:爸爸
秋招你被哪家公司挂了?
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务