728x90
반응형

uber에서 Kafka multi-region 관련 글이 올라와 나름 요약해봤습니다.
오프셋 매핑 테이블 아이디어는 재밌네요.
편하게 댓글 달아주세요.

https://eng.uber.com/kafka/

 

Disaster Recovery for Multi-Region Kafka at Uber

Apache Kafka at Uber Uber has one of the largest deployments of Apache Kafka in the world, processing trillions of messages and multiple petabytes of data per day. As Figure 1 shows, today we position Apache Kafka as a cornerstone to Uber’s technology st

eng.uber.com

 

------요약------
Kafka는 Uber에서 굉장히 중요한 기술 스택으로 자리 잡고 있다. "cornerstone"
하루에 수 petabyte, 1조 개 이상의 메시지가 처리되고 있다.

1. Multi-region Kafka at Uber
Kafka 가용성을 보장하기 위해 Multi-region으로 구성하는데 한 Region에는 두개 타입의 클러스터로 구성한다.
하나는 한 Region의 producer가 publish 되는 "Region Clusters", Region cluster 간의 메시지를 복사한 "Aggregated Clusters"가 있다.
각 region의 producer는 동일한 region의 Cluster에 publish 하고 만약 장애가 나면 다른 region의 "Region Clusters"로 publish 한다.
uReplicator를 이용하여 "Region clusters"의 메시지를 "Aggregated clusters"로 복사한다.

2. Consuming from multi-region Kafka clusters
multi-region의 consumer는 producer보다 복잡하다. Multi-region Kafka는 두 개의 all-activeness를 지원한다.

2-1. Active/active consumption
active/active란 각 region 별 동일한 토픽에 대해 동일한 작업을 수행한다.
※ dynamic pricing service, all-active service, Update service 팍! 이해 되지 않아 썼다 지웠어요;;
혹시 원문 보시고 아시는 분 계시면 댓글 달아주세요.

2-2. Active/passive consumers
primary region의 consumer(active consumer)만 "Aggregated cluster"에서 consume 하는 구조다.
consumer offset을 주기적으로 다른 region에 복사 한다. primary region이 박살 나면 다른 region의 consumer가 다시 consume을 진행한다.

여기서 offset 정보의 동기화가 매우 중요하다.
데이터 유실을 방지하기 위해 high watermark에서 시작하면 안 되고 너무 많은 중복 처리를 방지하기 위해 low watermark에서 시작하면 안 된다.
또한 "Aggregated clusters"는 복사하는 구간의 network latency로 인해 순서가 바뀌는 경우도 고려해야 한다.

Figure 4b: 그래서 uReplicator에서 복사를 하는 Region offset과 Aggregated offset 매핑 테이블(checkpoint)을 저장 및 관리하는 서비스(offset manager service)를 개발하였다.
테이블 첫 번째 row를 보면 A-region "Region cluster" offset 1이 A-region "Aggregated cluster" offset 1에 매핑됨을 의미한다.
active consumer가 실패하면 다른 region의 consumer는 offset manager service에서 최근 offset을 가져온 후 진행한다.

Figure 6: passive consumer가 최근 offset을 가져오는 방법
active consumer가 B-region의 offset 6 처리하다 장애 발생했다고 가정
* 테이블 기준 dist-cluster가 B-region이며 src-cluster가 A, B인 최신의 checkpoint 찾음. (처리중 인 offset이 6이니 테이블 기준 6번째 줄이 B-region, 4번째 줄이 A-region)
* A-region "Region clusters" offset 1, B-region "Region cluster" offset 3인 것 확인
* 위에서 찾은 1, 3 기준 A-region의 "Aggregated clusters"에 해당하는 최신 checkpoint 찾음. (테이블에서 첫번째 줄과 일곱번째 줄 해당)
* A-region "Aggregated clusters"는 offset 1, 7 인것 확인
* 둘 중 가장 작은 1 offset부터 passive consumer 시작
* A2, B1, B2 메시지는 중복 처리

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,