---
title: "Cluster Linking vs MirrorMaker 2 for Kafka replication"
description: "Confluent Cluster Linking mirrors orders at identical offsets with no translation table, while Kafka MirrorMaker 2 re-produces payments and keeps an offset map."
url: https://monedula.dev/kafka-simulator/scenarios/cluster-linking-vs-mm2/
---

# Cluster Linking vs MirrorMaker 2 for Kafka replication

Scenario 10.2.3 · Cluster Linking vs MirrorMaker 2: when to use which. Disaster recovery · Advanced · about 4 min · Apache Kafka 4.3.

Same topology, two replication models side by side: a cluster link mirrors offset-preserving into a read-only mirror (no translation table); MM2 re-produces and maintains a source→target offsetMap.

Run it: https://monedula.dev/kafka-simulator/playground/?scenario=10.2.3

## What you start with

This scenario runs the two cross-cluster replication models side by side on the same topology. Cluster Linking mirrors offset-preserving into a read-only mirror with no translation table, while MirrorMaker 2 re-produces records through Connect and maintains a source→target offset map.

## Step by step

1. **Two links, two models** (t+0.000s): Same topology, two replication models: orders is mirrored by a CLUSTER LINK (kind 'cluster-link') into a read-only mirror primary.orders (mirrorState 'mirror'); payments is mirrored by MIRRORMAKER 2 (the default) into primary.payments (just mirrored, no promote lifecycle). [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=10.2.3&t=0)
2. **Both mirroring in progress** (t+0.500s): The cluster link copies orders OFFSET-PRESERVING (destination offset == source offset, no translation table). MM2 RE-PRODUCES payments and starts building a source→target offsetMap. Both destinations trail the source by the mirror cadence. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=10.2.3&t=1)
3. **Contrast: offsetMap vs none** (t+0.900s): Steady state. CLUSTER LINK cl-orders: offsetMap UNDEFINED (offsets preserved), destination primary.orders read-only (mirrorState 'mirror'). MM2 mm-payments: offsetMap {0:{0:0,1:1,2:2}}, the simulator's per-record table (real MM2 keeps sparse offset syncs, so its translation can land a little early), and no mirrorState. Pick Cluster Linking for broker-native offset-preserving DR/migration inside Confluent; pick MM2 to bridge clusters that don't speak the linking protocol. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=10.2.3&t=2)

## The takeaway

Reach for Cluster Linking when you want identical offsets and a simple managed mirror (DR, migration); reach for MirrorMaker 2 when you need Connect-based flexibility and accept offset translation.

## Further reading

- [Confluent documentation](https://docs.confluent.io/platform/current/multi-dc-deployments/cluster-linking/index.html)
