
분산 시스템에서 데이터 복제(Replication)는 가용성과 내구성을 보장하는 핵심 메커니즘입니다. Apache Kafka는 단일 클러스터 내에서 파티션 간 복제를 통해 데이터를 보호하지만, 여러 Kafka 클러스터 간의 데이터 복제가 필요한 경우에는 어떻게 해야 할까요? 바로 이때 Apache Kafka MirrorMaker 2 (MM2)가 등장합니다.
MirrorMaker 2는 Kafka 2.4.0부터 도입된 차세대 크로스 클러스터 복제 도구로, Kafka Connect 프레임워크를 기반으로 완전히 재설계되었습니다. 초기 버전인 MirrorMaker 1의 한계를 극복하고, 더욱 강력하고 유연한 지오-레플리케이션(Geo-Replication) 기능을 제공합니다.
Apache Kafka MirrorMaker 2 (MM2)는 서로 다른 Kafka 클러스터 간에 토픽, 메시지, 컨슈머 그룹 오프셋을 복제하는 도구입니다. Kafka Connect 프레임워크 위에 구축되어 높은 안정성, 확장성, 그리고 복잡한 지오-레플리케이션 시나리오를 지원합니다.
MirrorMaker 2를 이해하기 위한 주요 용어:
초기 버전인 MirrorMaker 1은 단순히 Kafka Consumer와 Producer 쌍으로 구성되어 소스 클러스터에서 읽어 타겟 클러스터로 쓰는 방식이었습니다. 하지만 다음과 같은 한계가 있었습니다:
MirrorMaker 2는 Kafka Connect를 기반으로 완전히 재설계되어 다음과 같은 혁신을 이뤘습니다:
✅ 동적 설정 변경 지원
✅ 양방향(Bidirectional) 복제
✅ 컨슈머 오프셋 동기화
✅ 향상된 성능 및 확장성
✅ 고급 기능
MirrorMaker 2는 Kafka Connect 기반으로 세 가지 특수 커넥터로 구성됩니다:
역할:
동작 방식:
역할:
주요 기능:
역할:
모니터링:
MirrorMaker 2는 상태 추적을 위해 여러 내부 토픽을 생성합니다:
| 토픽 이름 | 용도 | 위치 |
|---|---|---|
mm2-offset-sync.<target>.internal | 소스-타겟 간 오프셋 매핑 추적 | 소스 클러스터 (기본값) |
<source>.checkpoints.internal | 컨슈머 그룹 오프셋 체크포인트 | 타겟 클러스터 |
mirrormaker2-cluster-offsets | MM2 커넥터 오프셋 저장 | 타겟 클러스터 |
mirrormaker2-cluster-configs | MM2 커넥터 설정 저장 | 타겟 클러스터 |
mirrormaker2-cluster-status | MM2 커넥터 상태 저장 | 타겟 클러스터 |
시나리오:
장점:
아키텍처:
Primary Cluster (Active) → Secondary Cluster (Passive)
↓
Application
시나리오:
구현:
# 특정 토픽만 복제
topics = public.*
# 제외할 토픽 패턴
topics.exclude = .*sensitive.*
시나리오:
토폴로지:
Region A Cluster ──┐
Region B Cluster ──┼─→ Central Analytics Cluster
Region C Cluster ──┘
시나리오:
프로세스:
1. 기존 클러스터에서 신규 클러스터로 복제 시작
2. 애플리케이션을 점진적으로 신규 클러스터로 전환
3. 완전 전환 후 복제 중단
제로 다운타임 마이그레이션 가능!
시나리오:
특징:
MirrorMaker 2의 동작을 이해하기 위한 핵심 규칙들:
각 미러 플로우는 단방향입니다.
Cluster A → Cluster B
하나의 플로우가 여러 토픽을 복제할 수 있습니다.
topics = topic-1, topic-2, topic-3
# 또는 정규 표현식
topics = orders.*
각 소스 토픽은 정확히 하나의 원격 토픽으로 복제됩니다.
타겟 클러스터에 토픽이 없으면 자동 생성됩니다.
기본적으로 소스 클러스터 이름이 접두사로 추가됩니다:
topic-1 (sourceCluster) → sourceCluster.topic-1 (targetCluster)
복잡한 토폴로지 구성 가능:
Fan-out (분산):
Cluster A → Cluster B
Cluster A → Cluster C
Fan-in (집계):
Cluster A → Cluster C
Cluster B → Cluster C
Bidirectional (양방향):
Cluster A ⟷ Cluster B
타겟 클러스터 이름이 포함된 토픽은 해당 클러스터로 복제되지 않습니다.
예시:
# Cluster A에서 생성된 토픽
A.topic-1 (Cluster B) → Cluster A로 복제 안 됨 (무한 루프 방지)
베스트 프랙티스:
MirrorMaker 2는 타겟 클러스터와 같은 네트워크 영역에 배포하는 것이 권장됩니다.
이유:
성능: Kafka Producer는 Consumer보다 지연에 민감함
유연성: 네트워크 제약 없이 프로듀서 튜닝 가능
집계 시나리오: 다중 소스 클러스터 복제 시 유리
다음 경우에만 고려:
사용 시나리오:
1. 복제 효율성: 토픽별로 다른 튜닝 파라미터 필요
주의사항:
이유:
min.insync.replicas 같은 중요 설정 보존도구:
# Kafka CLI 사용
kafka-topics.sh --create \
--bootstrap-server target-cluster:9092 \
--topic sourceCluster.topic-1 \
--partitions 10 \
--replication-factor 3 \
--config min.insync.replicas=2
# 클러스터 정의
clusters = source, target
source.bootstrap.servers = source-kafka:9092
target.bootstrap.servers = target-kafka:9092
# 복제 플로우 정의
source->target.enabled = true
# 복제할 토픽 선택 (정규 표현식)
source->target.topics = .*
# 제외할 토픽
source->target.topics.exclude = .*internal.*, .*checkpoint.*
# 컨슈머 그룹 필터
source->target.groups = .*
source->target.groups.exclude = console-consumer-.*
# 동기화 설정
sync.topic.configs.enabled = true
sync.topic.acls.enabled = false
# 성능 튜닝
tasks.max = 4
replication.factor = 3
clusters = clusterA, clusterB
clusterA.bootstrap.servers = clusterA:9092
clusterB.bootstrap.servers = clusterB:9092
# 양방향 플로우
clusterA->clusterB.enabled = true
clusterB->clusterA.enabled = true
# 동일한 토픽 복제
clusterA->clusterB.topics = orders, inventory
clusterB->clusterA.topics = orders, inventory
# 오프셋 동기화
sync.group.offsets.enabled = true
sync.group.offsets.interval.seconds = 60
# 무한 루프 방지 (기본 활성화)
replication.policy.class = org.apache.kafka.connect.mirror.DefaultReplicationPolicy
복제 지연 (Replication Lag):
record-lag-max
record-lag-avg
처리량 (Throughput):
byte-rate
record-count
오프셋 동기화:
checkpoint-latency-ms
offset-syncs-total
하트비트 토픽 모니터링:
kafka-console-consumer.sh \
--bootstrap-server target:9092 \
--topic heartbeats \
--from-beginning
내부 토픽 확인:
# 오프셋 동기화 상태
kafka-console-consumer.sh \
--bootstrap-server target:9092 \
--topic mm2-offset-syncs.target.internal \
--formatter "org.apache.kafka.connect.mirror.formatters.OffsetSyncFormatter"
타겟 클러스터 근처 배포
수동 토픽 생성
적절한 필터링
모니터링 설정
오프셋 동기화 활성화
점진적 배포
과도한 복제
네트워크 고려 부족
설정 검증 생략
모니터링 부재
원인:
해결:
# Producer 배치 크기 증가
producer.batch.size = 32768
producer.linger.ms = 100
# 압축 활성화
producer.compression.type = snappy
# Task 수 증가
tasks.max = 8
원인:
해결:
원인:
해결:
# 오프셋 동기화 명시적 활성화
checkpoints.topic.replication.factor = 3
sync.group.offsets.enabled = true
emit.checkpoints.interval.seconds = 60
Apache Kafka MirrorMaker 2는 Kafka 클러스터 간 데이터 복제를 위한 강력하고 유연한 솔루션입니다. Kafka Connect 기반의 현대적인 아키텍처로 재설계되어, 다음과 같은 핵심 가치를 제공합니다:
✨ 높은 안정성
✨ 뛰어난 확장성
✨ 유연한 토폴로지
✨ 운영 편의성
MirrorMaker 2는 다음과 같은 경우에 필수적입니다:
MirrorMaker 2를 도입할 때는:
MirrorMaker 2는 복잡한 멀티 클러스터 Kafka 환경을 성공적으로 운영하기 위한 필수 도구입니다. 적절한 설계와 모니터링을 통해 안정적이고 효율적인 지오-레플리케이션을 구현할 수 있습니다.