
当 Kafka 生产者尝试向被配置为“只读镜像主题”(read-only mirror topic)的 Topic 发送消息时,会抛出 InvalidRequestException: Cannot append records to read-only mirror topic 异常;此类主题仅允许从源集群单向同步数据,禁止直接写入。
当 kafka 生产者尝试向被配置为“只读镜像主题”(read-only mirror topic)的 topic 发送消息时,会抛出 `invalidrequestexception: cannot append records to read-only mirror topic` 异常;此类主题仅允许从源集群单向同步数据,禁止直接写入。
在 Kafka 多集群架构(如 Confluent Cluster Linking 或 MirrorMaker 2)中,镜像主题(Mirror Topic) 是通过跨集群复制机制自动生成的目标端只读副本,其核心设计原则是:仅接收来自源集群的同步数据,不接受客户端直接生产。因此,当你调用 kafkaTemplate.send("hello-topic", ...) 时,若 hello-topic 实际是一个由其他集群镜像而来的只读主题(例如通过 MM2 配置的 source-cluster.hello-topic → target-cluster.hello-topic),Kafka broker 将主动拒绝写入请求,并返回上述异常。
✅ 正确做法是:
-
定位原始源主题:确认
hello-topic的真实源头(例如source-cluster中的同名主题); - 向源集群生产:修改生产者配置,使其连接至源 Kafka 集群(而非当前镜像所在集群);
-
保持消费不变:消费者仍可正常从本地镜像主题消费(如你的
@KafkaListener工作正常),这正是镜像设计的优势——读写分离、就近消费。
? 示例:假设源集群地址为 PLAINTEXT://source-kafka:9092,需更新 Spring Boot 的 application.yml:
spring:
kafka:
bootstrap-servers: source-kafka:9092 # ✅ 指向源集群,非镜像集群
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
⚠️ 注意事项:
- 不要试图通过修改 Topic 配置(如
--alter)取消只读属性——镜像主题的mirror.topic标识由 Kafka 内部维护,强制修改将破坏复制一致性; - 可通过 Kafka 命令行验证主题属性:
bin/kafka-topics.sh --bootstrap-server target-broker:9092 --describe --topic hello-topic
若输出中包含
mirror.topic=true或topic.configs: mirror.topic=true,即确认其为镜像主题; - 若业务需双写或多写,应评估是否真的需要镜像架构,或改用主备切换、分区路由等方案,而非绕过镜像只读约束。
总结:镜像主题的“只读性”不是配置缺陷,而是多活/灾备场景下的关键安全机制。开发者需明确数据流向——写入源,读取镜像,才能兼顾高可用与数据一致性。










