MirrorMaker 2(MM2)는 Kafka Connect 프레임워크 위에 만든 클러스터 간 복제 도구다[1]. 소스 클러스터의 토픽 · 파티션 · 설정 · ACL · 컨슈머 그룹 오프셋을 타깃 클러스터로 옮긴다. 세 종류의 커넥터가 한 조를 이룬다.
| 커넥터 | 역할 |
|---|---|
| MirrorSourceConnector | 소스 토픽의 레코드를 읽어 타깃에 쓴다. 새 토픽 · 파티션을 자동으로 따라 만들고, 소스↔타깃 오프셋 대응을 offset-syncs 토픽에 남긴다 |
| MirrorCheckpointConnector | 소스 컨슈머 그룹의 커밋 오프셋을 타깃 오프셋으로 변환해 checkpoints 토픽에 쓴다. 페일오버 뒤 컨슈머가 이어서 읽을 수 있게 한다 |
| MirrorHeartbeatConnector | 주기적으로 heartbeats 토픽에 써서 복제 경로가 살아 있는지, 지연이 얼마인지 알려 준다 |
타깃 토픽 이름은 기본 DefaultReplicationPolicy 가 소스 클러스터 별칭을 접두사로 붙인다 — 소스 A 의 orders 는 타깃에서 A.orders 가 된다. 양방향(active-active)으로 걸어도 A.orders 는 다시 A 로 돌아가지 않아 순환이 생기지 않는다. 접두사 없이 같은 이름으로 복제하려면 replication.policy.class=org.apache.kafka.connect.mirror.IdentityReplicationPolicy 를 쓴다(단방향만 안전하다).
실행 형태는 두 가지다.
bin/connect-mirror-maker.sh mm2.properties. MM2 가 Connect 워커를 내장해 띄운다. 설정 파일 하나로 끝나 가장 단순하다. 이 문서 트리의 예제는 모두 이 방식이다.MM2 프로세스는 타깃 클러스터 가까이 둔다. 컨슈머(소스 읽기)는 원거리에 강하지만 프로듀서(타깃 쓰기)는 지연에 민감하다[1:1]. 여러 타깃이 있으면 --clusters <타깃 별칭> 으로 노드마다 담당을 나눈다.
bin/connect-mirror-maker.sh mm2.properties --clusters B
MirrorMaker 1(kafka-mirror-maker.sh)은 Kafka 4.0 에서 제거됐다. 3.x 이하 기록은 Kafka Mirror Maker 에 있다.
clusters = A, B
A.bootstrap.servers = a1:9092, a2:9092, a3:9092
B.bootstrap.servers = b1:9092, b2:9092, b3:9092
A->B.enabled = true
A->B.topics = orders.*, events.*
# 새로 만들어지는 타깃 토픽의 복제 계수
replication.factor = 3
# MM2 내부 토픽 복제 계수 (운영은 3)
checkpoints.topic.replication.factor = 3
heartbeats.topic.replication.factor = 3
offset-syncs.topic.replication.factor = 3
# Connect 내부 토픽
offset.storage.replication.factor = 3
status.storage.replication.factor = 3
config.storage.replication.factor = 3
# 컨슈머 그룹 오프셋도 타깃에 반영 (페일오버 준비)
sync.group.offsets.enabled = true
설정을 바꾸면 프로세스를 재시작해야 반영된다. 여러 인스턴스를 같은 설정으로 띄우면 부하를 나눈다[1:2].
전용 클러스터 모드에서는 Connect 상태 토픽이 타깃 클러스터마다 만들어진다. 아래는 A->B 흐름 기준이다.
| 위치 | Topic | 내용 |
|---|---|---|
| 타깃(B) | mm2-configs.A.internal |
Kafka Connect 구성 정보 |
| 타깃(B) | mm2-offsets.A.internal |
Kafka Connect 소스 오프셋(어디까지 읽었나) |
| 타깃(B) | mm2-status.A.internal |
Kafka Connect 커넥터 · 태스크 상태 |
| 소스(A) | mm2-offset-syncs.B.internal |
소스 ↔ 타깃 오프셋 대응 (기본 소스에 둔다. offset-syncs.topic.location=target 으로 옮길 수 있다) |
| 타깃(B) | A.checkpoints.internal |
소스 컨슈머 그룹의 변환된 오프셋 |
| 소스 · 타깃 | heartbeats |
복제 경로 상태 · 지연 확인용 |
mm2-offsets.A.internal 토픽에 레코드를 넣으면 MM2 가 소스를 어디서부터 읽을지 바꿀 수 있다 — Mirror Maker 2 보안 설정 의 오프셋 설정 절 참조.
Kafka 4.3 — Geo-Replication (Cross-Cluster Data Mirroring) — 2026-09-20 확인. https://kafka.apache.org/43/operations/geo-replication-cross-cluster-data-mirroring/ ↩︎ ↩︎ ↩︎