介绍
主题不只是传给生产者的名称。分区组织事件日志,副本描述存储拷贝,保留设置管理已存储记录可以保留多久。读取进度属于消费者,是独立的问题。
你将创建两个主题,检查元数据,为两者指定明确保留策略,再只修改其中一个。这样无需等待实际删除或改变代理全局配置,就能单独理解主题特定覆盖配置的含义。
预配置的单代理已就绪,两个主题名称独立于之前实验。基本终端操作即可,无需 Python 或 Java 编程。一份副本适用于这个只有一个代理的学习环境。请使用终端。
创建两个主题并读取元数据
在这一步中,你将比较两种明确分区数。进入工作目录:
cd /home/labex/project
--bootstrap-server 提供预配置代理地址。创建有两个分区的 orders-retained,以及一个分区的 orders-control。环境只有一个代理,因此两者都使用一份副本:
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic orders-retained --partitions 2 --replication-factor 1
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic orders-control --partitions 1 --replication-factor 1
列出主题并分别保存描述。Shell 的 > 创建本地文件或替换原有内容:
kafka-topics.sh --bootstrap-server localhost:9092 --list
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders-retained > /home/labex/project/output/orders-retained-description.txt
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders-control > /home/labex/project/output/orders-control-description.txt
cat /home/labex/project/output/orders-retained-description.txt
cat /home/labex/project/output/orders-control-description.txt
找到 PartitionCount: 2 与 1,以及两者的 ReplicationFactor: 1。每个分区都有 leader 条目。leader 代理标识符不是分区数,两个分区也不意味着两台代理机器。
一个主题可以在同一代理上有多个分区。副本数描述每个分区跨代理的拷贝数,不是为每个消费者各复制一份。接下来,你将改变存储保留设置,不改变这两个属性。
为每个主题明确设置一天的保留期限
在这一步中,你将区分继承的默认值与主题特定设置。kafka-configs.sh 管理配置资源。--entity-type topics 选择主题资源,--entity-name 选择受影响的单个主题。--describe 通常显示主题覆盖配置;没有覆盖值不意味着代理没有默认值。
修改前先查看 retained 主题:
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders-retained --describe
retention.ms 是毫秒时长。一天为 24 × 60 × 60 × 1000 = 86400000 毫秒。--alter --add-config 设置指定覆盖项。分别为两个主题独立设置相同明确策略:
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders-retained --alter --add-config retention.ms=86400000
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders-control --alter --add-config retention.ms=86400000
读取实际覆盖配置,并保存观察结果:
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders-retained --describe > /home/labex/project/output/retained-one-day-config.txt
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders-control --describe > /home/labex/project/output/control-one-day-config.txt
cat /home/labex/project/output/retained-one-day-config.txt
cat /home/labex/project/output/control-one-day-config.txt
为每个指定主题找到 retention.ms=86400000。客户端也可能打印配置来源或敏感性详情;这些细节和格式可能变化。
保留是代理的存储策略,不是消费者读取后立即擦除记录的指令。记录年龄与日志段清理决定删除资格和时机;这个时长不保证某条消息在精确瞬间消失。本练习检查已配置覆盖值,不等待清理。
只改变一个主题并确认边界
在这一步中,你将把 orders-retained 改为两天,orders-control 保持一天。预测哪些元数据应改变:retained 主题的保留覆盖值,两个分区数和副本数均不变。
两天为 172800000 毫秒。只对指定 retained 主题应用该值:
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders-retained --alter --add-config retention.ms=172800000
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders-retained --describe > /home/labex/project/output/retained-final-config.txt
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders-control --describe > /home/labex/project/output/control-final-config.txt
cat /home/labex/project/output/retained-final-config.txt
cat /home/labex/project/output/control-final-config.txt
预期 orders-retained 为 retention.ms=172800000,orders-control 为 retention.ms=86400000。共用代理地址不会让主题覆盖配置变为全局设置。
再次描述 retained 主题:
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders-retained
它应仍有两个分区、一份副本。改变保留设置没有创建新主题、增加分区、复制消费进度或消费任何事件。你同时验证了目标变化与不受影响的相邻主题。接下来,键将把订单身份与分区联系起来。
总结
你创建了分区数和副本数明确的主题,检查元数据,并以毫秒设置保留覆盖配置。修改一个主题后,另一个保持不变,区分了主题存储策略和消费者进度。接下来,你将通过键路由相关事件,并检查分区内偏移量。



