← 학습 카테고리

Learn

Kafka

84개 모듈 · 현재 74번째

Kafka 모듈 74/84 kafka-learn-74

MirrorMaker 2 오프셋 변환 — 페일오버 후 '어디서부터 다시 읽을지'를 알아낸다

Kafka Streams Grace Period 및 MirrorMaker 2 Offset Translation 공식 문서·기술 블로그 종합 (웹 리서치, 2026) — Apache Kafka 공식 Javadoc(TimeWindows), KIP-382(MirrorMaker 2.0), Kafka 공식문서 MirrorMaker KIP-382: MirrorMaker 2.0

이 모듈을 다 읽으면

  • Checkpoint Connector가 왜 필요한지, 왜 오프셋을 그대로 복사할 수 없는지 설명할 수 있다
  • translateOffsets()가 양방향으로 동작해 페일오버·페일백 로직이 대칭적일 수 있는 이유를 설명할 수 있다

kafka-learn-16에서 다룬 DR 페일오버(시작 오프셋 결정이 핵심 난제였다)와 kafka-learn-17의 MirrorMaker 동작 원리를 전제로, MirrorMaker 2가 이 '시작 오프셋 결정' 문제를 구체적으로 어떻게 자동화하는지를 정리한다.

왜 오프셋을 그대로 못 쓰는가 — 원본과 미러 토픽의 오프셋은 다르다

소스 클러스터의 토픽과 그걸 미러링한 대상 클러스터의 토픽은 오프셋 체계가 서로 다르다 — 같은 메시지라도 소스에서의 오프셋 번호와 미러 쪽에서의 오프셋 번호가 다를 수 있다. 그래서 컨슈머가 소스 클러스터에서 읽던 것을 페일오버로 미러 클러스터로 옮겨가려면, '소스의 오프셋 X는 미러 쪽의 오프셋 몇 번에 해당하는가'를 알아내는 변환이 필요하다 — kafka-learn-16에서 다룬 '페일오버 시 시작 오프셋을 어떻게 정할 것인가'라는 문제의 구체적인 실체가 바로 이것이다.

핵심 포인트

  • 소스 토픽과 미러 토픽은 오프셋 번호 체계가 서로 다름 — 같은 메시지라도 오프셋 값이 다를 수 있음
  • 페일오버 시 '소스의 오프셋 X가 미러 쪽 몇 번에 해당하는가'를 변환해야 함 — kafka-learn-16의 시작 오프셋 결정 문제의 구체적 실체

Checkpoint Connector — 컨슈머 그룹 오프셋 변환을 전담한다

MirrorMaker 2는 세 가지 커넥터로 구성된다 — 데이터 자체를 복제하는 Source Connector, MirrorMaker 2 인스턴스의 헬스체크용 Heartbeat Connector, 그리고 컨슈머 그룹 오프셋 변환을 전담하는 Checkpoint Connector다. Checkpoint 토픽에는 각 컨슈머 그룹의 소스 쪽 오프셋과 미러 쪽(다운스트림) 오프셋이 함께 기록되는데, 다운스트림 오프셋은 오프셋-동기화 스트림을 기반으로 계산된다. RemoteClusterUtils 자체는 변환을 직접 하지 않고, Checkpoint Connector가 이미 해놓은 변환 결과를 조회하는 창구 역할만 한다.

핵심 포인트

  • MirrorMaker 2의 세 커넥터: Source(데이터 복제)/Heartbeat(헬스체크)/Checkpoint(컨슈머 그룹 오프셋 변환 전담)
  • Checkpoint 토픽에 소스 오프셋+다운스트림(미러) 오프셋을 함께 기록 — RemoteClusterUtils는 이 변환을 직접 안 하고 조회만 대신함

양방향 변환 — 페일오버와 페일백이 대칭적으로 동작한다

translateOffsets()는 소스→미러 방향뿐 아니라 미러→소스 방향으로도 동작한다 — 즉 페일오버(소스가 죽어 미러로 전환)든 페일백(복구된 소스로 다시 전환)이든 같은 메커니즘으로 오프셋을 변환할 수 있다는 뜻이다. 이 덕분에 컨슈머가 어느 방향으로 전환하든 '전환 전에 처리하던 지점부터 정확히 이어서' 재개할 수 있는 대칭적인 로직을 짤 수 있다. 실무에서는 이 변환을 수동으로 매번 호출하는 대신, 소스에서 대상으로 컨슈머 오프셋을 주기적으로 동기화하는 백그라운드 작업을 둬서, 전환이 실제로 필요한 순간엔 이미 최신 오프셋이 준비돼 있게 만드는 방식도 쓰인다.

핵심 포인트

  • translateOffsets()는 소스→미러, 미러→소스 양방향 모두 동작 — 페일오버와 페일백에 같은 메커니즘 적용 가능(대칭적 로직)
  • 실무에서는 주기적 백그라운드 동기화로 미리 오프셋을 맞춰둬, 실제 전환 순간엔 최신 오프셋이 준비돼 있게 하는 방식도 사용