想象你同时管理着两座城市的邮局系统。A城的市民不断往不同信箱里投信——订单、支付、日志——而B城的同事们眼巴巴等着看这些信。你不能把A城邮局整个拆了搬过去,也不能让两边的市民自己跑去对方城市取信。最优雅的办法,是成立一支专业的“邮政转运队”:它负责从A城的每个信箱里取信、分拣、装车、跨城运输,再投递到B城的对应信箱。Kafka生态里的 MirrorMaker 2(简称 MM2)就是 Kafka 官方组织的这样一支转运队。这支转运队怎么设计邮路、怎么写操作手册、怎么贴新地址、怎么记对账本、怎么避开马路坑、怎么定期体检,就是这篇文章要讲的全过程。
掌握 MirrorMaker 2,你就能独立设计 Kafka 跨集群容灾、多活和迁移方案。这是 Kafka 运维和数据管道工程师的核心加分项,也是大厂数据平台岗的常考技能。
可视化演示
动态演示Kafka MirrorMa的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Kafka MirrorMa:一Mir 一、MirrorMaker 2 二、跨集群复制模式与容灾场景 核心机制可视化 Kafka MirrorMa整体架构与关键组件
MM2核心原理
想象你管理着两座城市的邮局系统。A城的市民不断往不同信箱里投信,B城的同事眼巴巴等着看这些信。你不能把A城邮局整个拆了搬过去,于是成立了“邮政转运队”:从A城每个信箱取信、分类、装车、跨城运输、投递到B城对应信箱。转运队的效率,决定了B城市民多久能看到A城的新消息。在 Kafka 的世界里,这支转运队就是 MirrorMaker 2(MM2)——Kafka 官方的跨集群复制工具。
MM2 和它的前辈 MirrorMaker 1 有本质区别:MM1 是一个独立的搬运进程,而 MM2 搭在 Kafka Connect 框架上。Connect 框架相当于转运公司的总部,负责调度和容错;Connector 是调度员,负责把复制任务拆解成一份份工作;Task 是真正的搬运工,从源集群的 Topic(信箱)里消费消息,再写入目标集群的 Topic。一个复制任务内部就是“消费+生产”的组合:Task 以消费者身份拉取消息,再以生产者身份发送到目标端。
多个 Task 可以并行干活,每个 Task 负责一部分分区(信箱里的格子),就像多个搬运工各管几排信箱。为了让总部知道每支队伍还活着,MM2 还会周期性向内部心跳 Topic 发送“报平安”的消息,这些心跳同时被用来测量复制链路是否健康。理解了这个架构,我们就能用一条延迟公式拆解“消息为什么慢了”:
B城市民感受到的“消息延迟”,其实是这三段时间之和。转运队再快也有物理极限——当消息变慢时,先拆解是卡在取信、分拣还是路上,才能对症下药。
- 总复制延迟 L指一条消息从源集群被生产出来,到最终写入目标集群的总耗时,相当于“一封信从寄出到被签收的全过程时间”。
- 轮询耗时 t_poll消费者从源集群拉取一批消息所花的时间,相当于“搬运工走到信箱前,把一批信取出来的时间”。
- 处理耗时 t_process消息在 Task 内部做序列化、转换等处理的耗时,相当于“分拣员盖戳、按地址分类的时间”。
- 发送耗时 t_send生产者把消息批量写入目标集群的时间,相当于“装车、跑高速、卸货的时间”。
架构规划模式
建转运队之前,先要决定铺几条“邮路”。如果A城只需要单向备份给B城,铺一条单向专线就够了;如果两城要互相看到对方的数据,就得铺双向对开的线路;如果两城都要把信件汇总到总部,还要设计星形汇聚的拓扑。邮路设计错了,轻则浪费资源,重则数据打架。MM2 的架构规划正是这个道理。
最常见的模式是主备容灾(active-passive):业务只写主集群,MM2 把数据单向复制到备集群,主集群故障时切换流量到备集群,这是容灾成本最低的方案。第二种是双活(active-active):两个集群都接受业务写入,MM2 双向复制,两边数据最终一致,但业务侧必须做 Topic 拆分,避免两边同时写同一个 Topic 造成覆盖冲突。第三种是聚合模式:多个边缘集群的数据汇聚到一个中心集群,做统一分析和数据仓库供给。
更复杂的网状全互联拓扑虽然灵活,但复制流数量会爆炸式增长。N 个集群两两全互联,每个集群都要向其余 N-1 个集群复制数据,总复制流数量可以精确算出来:
邮路规划决定后续所有成本。选单向专线,维护简单但切换有风险;选全互联,灵活但维护粒度像蜘蛛网一样复杂。多数公司实际用的是“主备 + 聚合”的组合方案,而不是一上来就全互联。
- 复制流总数 C需要配置的 MM2 复制流(一条源到目标的通路)的总数量,相当于“需要常年维护的邮路总条数”。
- 集群个数 N参与复制的 Kafka 集群数量,相当于“这座城市里一共有多少家邮局”。
- 每源的目标数 N-1每一个集群作为数据源时,需要把数据同步给除自己之外的所有集群,所以每个源对应 N-1 个目标。
- 总和关系把 N 个集群各自的 (N-1) 条复制需求相加,就得到总条数 N×(N-1)。
配置参数详解
转运队定下来后,你得给调度员写一本详细的“操作手册”:多久去信箱巡查一次,一次最多搬多少封信,信箱列表变化了要不要立刻开新线路,每跑一趟要不要记交接单。手册写得越细,转运队运行越稳定。MM2 的配置文件 mm2.properties 就是这本手册,它以 Kafka Connect 的 connector 配置格式书写。
核心配置段包括:connector.class 指定使用 MirrorSourceConnector 作为连接器类型;source.cluster.alias 和 target.cluster.alias 给源、目标集群起别名,并分别配置两套 bootstrap.servers 地址;topics 通过正则表达式圈定要复制的 Topic 范围;replication.factor 指定目标端新建 Topic 的副本数。这些参数决定了转运队“为谁服务、跑哪条线、怎么建信箱”。
几个关键参数值得细调。refresh.topics.interval.ms 控制多久扫描一次源集群的 Topic 列表,默认 5 分钟,调小能让新 Topic 更快出现在目标端,但也会增加源集群负担;emit.checkpoints.interval.ms 控制多久把消费者组进度写成 checkpoint,默认 5 秒,太大会让偏移同步变慢,太小增加写压力;sync.topic.acls.enabled 决定是否把源集群的 ACL 权限配置同步过去,适合安全管控严格的环境。当复制积压时,追平时间与积压量和“净消费速度”的关系如下:
操作手册上的每个数字都对应成本:调小刷新间隔,新 Topic 发现快但也更频繁地打扰源集群;调大批次,单次搬得多但更占网络带宽。你需要按业务节奏找平衡点。
- 追平时间 T把源端积压的消息全部复制到目标端所需的时间,相当于“邮局门口排队等装车的信件全部运完需要多久”。
- 积压量 B源集群中还没被复制走的消息条数,即“停在邮局门口排队等待装车的信件总数”。
- 消费速率 R_consumeMM2 每秒从源集群消费并复制出去的消息条数,相当于“装车师傅每秒搬上车的信数”。
- 生产速率 R_produce业务每秒新写入源集群的消息条数,相当于“市民源源不断投进来的新信”。
- 净消化速度消费速率减去生产速率,才是真正能“清空积压”的净速度;如果 R_consume 小于等于 R_produce,队列只会越排越长。
Topic映射规则
信件到了B城,不能直接投进和A城完全同名的信箱。为什么?如果是双向对开邮路,A城发出的信件在B城落地时叫“来自A的X信箱”,如果B城再把“来自A的X信箱”寄回A城,A城一看这名字不认识,又可能转发回B城……信就永远在路上打转。所以转运队必须给每封信贴一个新地址,并把“外来的信件”在回头路上拦下来。
MM2 对应有一套 Topic 映射机制。默认情况下,源集群的 orders 复制到目标集群后,名字会变成 <目标集群别名>.<源Topic名>,比如 clusterB.orders。这个“加别名前缀”的动作就是贴新地址。DefaultReplicationPolicy(默认复制策略)靠这个前缀区分消息来源,同时它会自动过滤掉源端中带有本集群别名的 Topic,从而切断循环复制链路。
实际生产中,topics 用正则圈定复制范围,比如 orders.* 只复制订单相关主题;topics.exclude 可以排除内部 Topic 或不关心的主题。如果业务对目标端命名有特殊要求,可以实现 ReplicationPolicy 接口,重写 formatRemoteTopic 方法,完全掌控命名规则。映射关系可以用一个函数表示:
地址贴对,路径才对。双活场景尤其要检查“外来信件”是否会被回头路拦截,否则数据会像永远打转的信一样,在两个集群间反复横跳,把磁盘和带宽都拖垮。
- 源主题名 source_topic源集群里的原始 Topic 名,如
orders,对应“A城信箱上的原名”。 - 重命名函数 f_rename把源名变换成目标名的规则。MM2 的默认实现是
f(x) = 目标集群别名 + "." + x,你还可以自定义实现完全不同的规则。 - 目标主题名 target_topic复制后落在目标集群里的新名字,如
clusterB.orders,对应“B城新贴的地址”。
偏移同步机制
转运队干活不能闷头搬,得有一本“记账本”:A城知道每格信箱已经产生了第几封信(生产偏移),转运队知道已经搬走了第几封(消费偏移),B城还要知道业务消费者读到了第几封。三笔账一对,就能看出信有没有积压、消费者有没有落后。MM2 用几个内部 Topic 承担记账功能。
mm2-offset-syncs.<alias> 记录源集群和目标集群各分区 offset 的对应关系,用于跨集群的“消费位置换算”;mm2-checkpoints.<alias> 周期记录每个消费者组在源端的消费进度、以及它对应到目标端的偏移,这样业务若从 B 集群切换过来,能从上一次同步点继续消费而不是从头来;mm2-heartbeats.<alias> 是心跳消息,既报平安也用于测量延迟。
复制链路中,源端 Task 消费消息写入目标端后,会周期性发出 checkpoint。目标端的消费者想“接续”源端某个消费者组的进度,就查这个 checkpoint。如果业务在源端产生消息的速度超过了复制消费的速度,源端偏移就会越拉越远,形成积压。复制滞后量可以用一个差值精确刻画:
有了记账本,你随时能查到“信送到哪了”。监控系统里看到的复制延迟,本质上就是这三笔账的差值——账对不上,一定有环节出了问题。
- 复制滞后 Δ判断复制是否健康的核心指标,相当于“A城信箱里还堆着多少封没被运走的信”。
- 源端最新偏移 offset_source源集群该分区当前最新一条消息的偏移量,等于“A城这个信箱已经产生的总信件数”。
- 已同步偏移 offset_syncedMM2 已经复制到目标端的最大偏移量,等于“转运队已经搬走并签收的信件数”。
- 差值 Δ 的意义两数相减得到未复制的消息数,这个值持续增长就说明复制跟不上生产,需要扩容或调优。
常见坑与调优
运转久了,转运队会遇到几类经典麻烦:两城互寄的信因为地址规则没设计好,在途中反复回转出不去;两个搬运工被安排去抢同一个信箱,导致重复取信;A城门口堆积的信越来越多,转运队却还在按老步调慢悠悠地搬。这些坑几乎每个跑 MM2 的团队都会踩一遍。
第一个坑是循环复制。双向复制时如果没搞清默认策略的过滤机制,clusterB.orders 这类已经带别名的 Topic 会被 B→A 复制流当作普通 Topic 复制回 A,形成 A→B→A 的死循环。解决办法:使用 DefaultReplicationPolicy,它会自动过滤带本集群别名的 Topic,同时复制流的 topics 正则也别写成无脑的 .*。第二个坑是“脑裂”:双活模式下两个集群同时写同一个业务 Topic 且没有做业务域拆分,两边数据互相覆盖,对账时一片混乱。
第三个坑是积压排查方向错误。积压时先看 MM2 任务是否正常运行(通过 Connect REST 接口查任务状态)、目标集群有没有写入瓶颈、poll 批量大小是否太小,不要一上来就盲目加 Task。加 Task 也有限度——一个分区的消息只能被一个 Task 消费,所以实际并行度有上限:
调优的顺序是:先确认没有循环和脑裂这样的“方向性问题”,再看路上有没有堵点(目标端瓶颈),最后才考虑加人手(扩容 Task)。方向错了,车跑得越快,错得越离谱。
- 实际并行任务数 tasks真正同时在跑的 Task 数量,相当于“转运队里真正在干活的搬运工人数”。
- 总分区数 partitions_total所有被复制 Topic 的分区数量之和,相当于“所有装了信件的信箱格子的总数”。
- 最大任务数 max_tasks配置文件里给 connector 设置的任务数量上限,相当于“转运队最多能雇多少名搬运工”。
- 取最小值并行能力由两者较小的值决定,因为一个格子只能有一个人取信,加人再多也突破不了格子数的限制。
监控与实战
一支成熟的转运队必须定期体检:一封信从A城信箱到B城信箱到底花了多少毫秒,A城门口积压的信件是否在安全水位,有没有搬运工请假、调度员失联。更重要的是,每年都得做一次“全城演习”:模拟A城停电,看B城能不能在几十分钟内接住所有业务。MM2 的监控与容灾演练,正是这套体检与应急预案。
MM2 的监控数据通过 JMX 暴露,核心指标都带 kafka.connect.mirror 前缀。replication-latency-ms 直接度量复制延迟(消息从源端生产到目标端写下的时间差);record-age-ms 表示消息落进目标端时已经“出生”了多久,反映端到端的陈旧程度;byte-rate 和 record-count 反映复制吞吐量。健康检查方面,可以直接调 Connect 的 REST 接口 /connectors/{name}/status 查看连接器和任务状态。
故障演练的目标是验证切换预案:正常时业务读写源集群,演练时把读写流量切到目标集群,观察业务是否正常、数据是否还在持续同步。平滑迁移场景中,经典做法是:让 MM2 先跑一段时间完成数据追平,业务侧灰度切读、双写验证,确认数据一致后再逐步停掉旧集群。端到端延迟是检验整个链路的最重要指标:
体检指标齐全、应急预案演练过,转运队才算真正上岗。没有监控的复制链路像没有仪表盘的飞机——飞是能飞,但你不知道它什么时候会掉下去。
- 端到端延迟 D业务用户真实感受到的“消息从发出到可见”的滞后,是衡量复制链路整体体验的最终指标。
- 源端生产时间 t_source_produce消息在源集群被生产者写入时记录的时间戳,相当于“A城市民把信投进信箱的时刻”。
- 目标端消费时间 t_target_consume业务消费者在目标集群读到该消息时的时间戳,相当于“B城市民拆开信封的时刻”。
- 差值 D_e2e 的意义两时刻相减,就得到从投信到读信的完整时间差,这才是容灾切换和延迟告警真正该盯的数字。
AI 应用场景
双机房容灾切换
阶段:数据管道与容灾保障
解决的问题:传统容灾靠人工定期导数据或直接同步存储卷,主库故障时恢复时间长达数小时甚至天级。MM2 单向复制到备机房后,主集群出现故障时,数据平台团队只需把业务读写流量切换到备集群,分钟级完成容灾切换。
具体案例:某电商平台在北京主机房和上海备机房各部署一套 Kafka 集群,主集群 orders、payments 等 Topic 通过 MM2 实时复制到备集群,同时配置 replication-latency-ms 告警。一次机房光纤中断演练中,团队在 8 分钟内将读写流量全部切到上海集群,业务无感知。
多地域数据聚合
阶段:数据采集与汇聚
解决的问题:跨国企业在各区域部署独立 Kafka 集群,总部无法看到全局数据,分析报表需要各区域手动上报。用 MM2 聚合模式把所有区域集群的数据复制到中心集群,统一供数据仓库和 AI 训练平台消费。
具体案例:某出海游戏公司在美、欧、亚三地各有一套 Kafka,每套集群的 game-events Topic 通过 MM2 汇聚到新加坡中心集群,BI 团队在中心集群跑实时看板,玩家行为分析延迟控制在 10 秒内。
集群平滑迁移
阶段:数据迁移与替换
解决的问题:老集群版本低、磁盘紧张,无法停机迁移业务。MM2 能在不中断业务的情况下把数据从旧集群复制到新集群,业务侧灰度切换读写流量,验证一致后再下线旧集群。
具体案例:某金融公司从 Kafka 2.3 迁移到 3.6,先用 MM2 把核心 Topic 全量追平,然后业务先切读后切写,观察 mm2-checkpoints 中记录的消费进度差持续归零后,平稳下线旧集群,全程零数据丢失。
Python 演示
"""MirrorMaker 2 健康检查小工具扫描 MM2 内部 Topic 并估算平均复制延迟依赖: pip install kafka-python"""import jsonfrom kafka import KafkaConsumer BOOTSTRAP = 'localhost:9092'OFFSET_PREFIX = 'mm2-offset-syncs.' def find_mm2_topics(bootstrap_servers): """借助临时 Consumer 拉取集群 Topic 列表并筛选 MM2 内部 Topic""" probe = KafkaConsumer(bootstrap_servers=bootstrap_servers) topics = sorted(t for t in probe.topics() if t.startswith(OFFSET_PREFIX)) probe.close() return topics def estimate_replication_delay(bootstrap_servers, checkpoint_topic): """读取 checkpoint 消息, 输出最近记录的复制延迟(毫秒)""" consumer = KafkaConsumer( checkpoint_topic, bootstrap_servers=bootstrap_servers, auto_offset_reset='earliest', consumer_timeout_ms=3000, ) delays = [] for record in consumer: try: value = json.loads(record.value.decode('utf-8')) delay = value.get('delay', 0) if delay: delays.append(delay) except (KeyError, ValueError): continue if len(delays) >= 20: break consumer.close() if delays: return sum(delays) / len(delays) return None def main(): mm2_topics = find_mm2_topics(BOOTSTRAP) if not mm2_topics: print('未发现 MM2 内部 Topic, 复制流可能未启动') return print('发现 MM2 内部 Topic:') for topic in mm2_topics: print(' -', topic) checkpoint_topics = [ t for t in mm2_topics if t.startswith('mm2-checkpoints.') ] if checkpoint_topics: avg_delay = estimate_replication_delay(BOOTSTRAP, checkpoint_topics[0]) if avg_delay is not None: print('平均复制延迟: %.2f ms' % avg_delay) else: print('checkpoint 中暂无延迟数据') if __name__ == '__main__': main()
KafkaConsumer(bootstrap_servers=bootstrap_servers)创建一个临时消费者探针,相当于借一张门禁卡进邮局大厅查看信箱列表。probe.topics()拉取集群全部 Topic 名称,拿到所有信箱的完整清单。t.startswith(OFFSET_PREFIX)过滤出 MM2 专有的 offset-syncs 内部 Topic,就像在清单里只挑出转运队的“交接单”。auto_offset_reset='earliest'从最早的记录开始读 checkpoint,确保能扫到最近的延迟数据。json.loads(record.value.decode('utf-8'))checkpoint 消息是 JSON 格式,先解码再解析成 Python 字典,相当于打开交接单读内容。value.get('delay', 0)从记录里取出 delay 字段,这是 MM2 写入 checkpoint 时自己算好的复制延迟。
常见误区
误区我在老项目里用 MirrorMaker 1 的配置跑得很顺,换成 MM2 时直接把原来的配置文件丢过去,以为换个启动命令就行,结果连接器根本起不来。
正解MM1 是独立进程,配置里写的是“消费哪个集群、生产到哪个集群”;MM2 是基于 Kafka Connect 的 connector,配置必须按 Connect 规范写成源/目标集群别名加 topics 正则,还要定义两套 bootstrap.servers。两者配置格式完全不同,不是版本升级,是彻底重构。
为何常见:MM1 和 MM2 名字太像,又都叫 MirrorMaker,很容易让人以为只是大版本号变了,忽略了底层框架从“独立进程”到“Connect 框架”的差异。
误区配好了 A→B 和 B→A 两条复制流,看到数据在两个集群间互相出现,以为同步成功。结果重复数据越来越多,磁盘疯涨。
正解MM2 的默认复制策略会给目标 Topic 加“目标集群别名”前缀,并且复制流会过滤掉源端中带本集群别名的 Topic,从而切断循环。你需要确认复制流用的是 DefaultReplicationPolicy,且 topics 正则不要把已经带别名的 Topic 也圈进去。
为何常见:大家习惯把“能看到数据”当作同步成功的标准,忽略了消息的“来源方向”也需要被管理和过滤。
误区配好 MM2 后觉得数据应该像打电话一样秒达,业务方问下游数据为什么还缺,我说等等就好,结果一直等不到。
正解MM2 本质是批量的“消费-生产”管道,有轮询间隔、批量大小、checkpoint 间隔等参数,默认情况下通常有几秒到分钟级的延迟。应该用 replication-latency-ms 和 record-age-ms 做量化监控,而不是用“实时”的预期去看它。
为何常见:“实时同步”这个词在宣传里被用滥了,实际工程里都是准实时,任何分布式复制都有可量化的延迟上界。
误区为了省两台机器,把 MM2 的 connector 直接加在现有的 Connect 集群上,结果某天业务数据同步突然变慢,一查是 MM2 的高吞吐把 worker 的 CPU 和网络都占满了。
正解MM2 复制会产生很高的网络和 CPU 开销,和业务 Connect 混部会互相干扰。生产环境应当单独部署一套 Connect 集群专职跑 MM2,或用资源隔离手段限制 worker 的并发数和内存配额。
为何常见:省成本是人的直觉,Kafka 基础设施又多又杂,能共用就共用,但忽略了 IO 密集型任务对延迟敏感型任务的“噪声干扰”。
误区我发现 `mm2-checkpoints` 这个内部 Topic 一直在涨,占了大量磁盘,但没人告诉我它要怎么清理。
正解MM2 内部 Topic 需要按天级保留时间配置清理策略,比如 checkpoints 保留 1 天即可,offset-syncs 保留几天。这些 Topic 只在复制链路运行时有用,历史数据没有保留价值,应提前设置 log.retention.ms 或通过集群策略统一管理。
为何常见:内部 Topic 不在业务视野里,启动 MM2 时没有规划,等磁盘告警才发现问题。
面试题
Q1. MirrorMaker 2 基于以下哪个框架实现?
- A.Kafka Connect框架← 正确答案
- B.Kafka Streams框架
- C.Flink流处理框架
- D.Spark流处理框架
答案:A。MM2 不是从零写的独立进程,而是搭在 Kafka Connect 之上,就像邮政转运队挂靠在大型物流集团下,复用集团的调度和任务管理能力。Streams 是流处理 API,Flink 和 Spark 是外部流计算框架,都不是复制工具的底座。
Q2. MM2 默认的目标 Topic 命名规则是什么?
- A.原Topic名不变
- B.目标集群名加前缀← 正确答案
- C.源集群名加前缀
- D.随机生成新名称
答案:B。默认策略是给目标 Topic 加“目标集群别名”前缀,比如源端 orders 复制到 clusterB 后变成 clusterB.orders。这个前缀同时承担防循环复制的功能,相当于 B 城信件贴上的“新地址”。
Q3. 以下哪个内部 Topic 用于记录消费者组跨集群同步的进度?
- A.mm2-offset-syncs
- B.mm2-checkpoints← 正确答案
- C.mm2-heartbeats
- D.mm2-status
答案:B。mm2-checkpoints 记录消费者组在源集群的消费进度对应到目标端的偏移位置,相当于转运队的“交接单”。offset-syncs 负责分区偏移对应关系,heartbeats 是报平安,status 不是 MM2 的标准内部主题。
Q4. 双向复制时,MM2 防止循环复制的核心机制是什么?
- A.调低副本因子数量
- B.使用默认复制策略← 正确答案
- C.关闭目标自动建Topic
- D.手动清理回传Topic
答案:B。DefaultReplicationPolicy 会给远程 Topic 加别名前缀,并过滤掉源端中带本集群别名的 Topic,从机制上切断循环。靠调副本数、关闭自动建 Topic 或手动清理都是治标不治本,方向性问题必须靠策略兜底。
Q5. 以下哪些做法能有效提升 MM2 复制吞吐?
- A.增加复制任务数量← 正确答案
- B.调大一次性拉取批次← 正确答案
- C.缩小复制流Topic范围← 正确答案
- D.减少Topic分区数量
答案:ABC。增加 Task 能把活分给更多搬运工(但不能超过分区总数),调大 poll 批次让每次取信更多,缩小 topics 正则把不必复制的主题排除掉、减少总量。减少分区数会降低并行度,反而拖慢吞吐。
Q6. A→B 单向复制中,A 集群 orders 某分区的源端最新偏移为 10000,MM2 checkpoint 记录 B 端已同步到偏移 9500,此时该分区的复制积压是多少?
- A.500条消息← 正确答案
- B.5000条消息
- C.9500条消息
- D.10000条消息
答案:A。复制积压 = 源端最新偏移 − 已同步偏移 = 10000 − 9500 = 500 条,这是偏移对账最直观的量化。5000 是把两个数减反了,9500 和 10000 只取了单边数据,都没算清“还堆在源端没搬走的信”。
Q7. MM2 的 checkpoint 记录的核心信息是什么?
- A.源集群完整数据内容
- B.消费者组复制进度映射← 正确答案
- C.目标集群磁盘剩余量
- D.连接器任务CPU使用
答案:B。checkpoint 本质是“消费者组跨集群的进度映射”,把源端消费位置翻译成目标端位置,业务切换后可以接续消费。它不存数据内容、磁盘信息或 CPU 指标,只关心“这组消费者看到了哪封信”。
Q8. 以下哪些指标适合监控 MM2 的复制延迟?
- A.复制延迟毫秒指标← 正确答案
- B.消息年龄毫秒指标← 正确答案
- C.检查点中的delay字段← 正确答案
- D.源集群磁盘配额大小
答案:ABC。replication-latency-ms 直接测复制延迟,record-age-ms 看消息在目标端落地时的“年龄”,checkpoint 中的 delay 字段是周期性对账结果。磁盘配额属于容量维度,不是延迟指标,看它无法回答“信到底慢了多久”。
Q9. 假设 N 个 Kafka 集群要做两两全互联复制,共需要多少条独立的复制流?
- A.正好N条独立复制流
- B.N(N-1)条独立复制流← 正确答案
- C.N²条独立复制流
- D.N(N-1)/2条独立复制流
答案:B。N 个集群两两复制,每个集群作为源要向另外 N-1 个集群各发一条复制流,所以总数是 N×(N-1)。N 只算了单方向,N² 把“自己复制给自己”也算进去了,N(N-1)/2 是“双向往返算一次”的误算。
Q10. 以下哪些是 MirrorMaker 2 的典型应用场景?
- A.跨机房容灾备份← 正确答案
- B.业务迁移到新集群← 正确答案
- C.多地域聚合成中心← 正确答案
- D.替代Broker间复制
答案:ABC。容灾备份、迁移换集群、多地域聚合都是 MM2 的经典场景。Broker 间副本同步是 ISR 机制,属于集群内部高可用,不归 MM2 管——MM2 是跨集群的转运队,不是集群内的保安。