Kafka 2.4 버전부터 도입된 '가장 가까운 레플리카 읽기(Closest Replica Fetching)' 기능은 멀티 데이터센터 환경에서 Kafka를 운영할 때 레이턴시와 네트워크 비용을 크게 줄일 수 있는 중요한 기능이다.

Kafka 2.4 이전 버전에서는 컨슈머가 항상 파티션의 리더 레플리카에서만 데이터를 읽어왔다. 이러한 구조에서는 다음과 같은 문제가 발생할 수 있다:

Kafka 2.4부터 도입된 가장 가까운 레플리카 읽기 기능을 사용하면 다음과 같은 이점이 있다:
AWS MSK를 사용하는 경우, 가장 가까운 레플리카 읽기를 통해 가용 영역 간 트래픽 비용을 최대 2/3까지 절감할 수 있다.
가장 가까운 레플리카 읽기 기능은 다음과 같이 작동한다:

broker.rack=usw2-az1 # AWS의 경우 가용 영역 ID 사용replica.selector.class=org.apache.kafka.common.replica.RackAwareReplicaSelector컨슈머 구성에 client.rack 속성을 추가하여 컨슈머가 위치한 랙 ID를 지정한다:
client.rack=usw2-az1 # 컨슈머가 실행 중인 데이터센터/가용 영역 ID
더 복잡한 인프라 구조를 가진 환경에서는 멀티 레벨 랙 인식을 구성할 수 있다:
/DC1/Rack1).예를 들어:
/DC1/R1과 /DC2/R3client.rack=/DC1 → /DC1/R1 레플리카 선택client.rack=/DC2/R5 → /DC2/R3 레플리카 선택client.rack=/DC3 → 리더 레플리카 선택 (일치하는 DC가 없음)설정이 제대로 적용되었는지 확인하려면 컨슈머 로깅 레벨을 DEBUG로 설정한다:
log4j.logger.org.apache.kafka.clients.consumer.internals.Fetcher=DEBUG
로그에서 다음과 같은 내용을 확인할 수 있다:
DEBUG [Consumer clientId=consumer-1, groupId=console-consumer-12345] Sending READ_UNCOMMITTED fetch for partitions [order-0] to node b-3.mskcluster.jcojml.c23.kafka.us-east-1.amazonaws.com:9092 (id: 3 rack: use1-az1) (org.apache.kafka.clients.consumer.internals.Fetcher)
이 로그는 컨슈머가 use1-az1 랙에 있는 브로커에서 데이터를 가져오고 있음을 보여준다.
Kafka의 가장 가까운 레플리카 읽기 기능은 멀티 데이터센터 환경에서 레이턴시를 줄이고 네트워크 비용을 절감할 수 있는 강력한 도구다. 특히 클라우드 환경에서 Kafka를 운영할 때 이 기능을 활용하면 상당한 비용 절감 효과를 얻을 수 있다.
Kafka 2.4 이상 버전을 사용하고 있다면, 랙 인식 기능을 설정하여 컨슈머가 가장 가까운 레플리카에서 데이터를 읽도록 구성해보자 특히 대규모 분산 시스템에서 성능과 비용 효율성을 크게 향상시킬 수 있다.