지난 내용에 이어, 오늘은 카프카의 오프셋, 리밸런싱, 컨슈머 그룹에 대해 정리해본다. 먼저, 각 개념에 대해 알아보자.
오프셋이란, 각 파티션마다 메시지가 저장되는 위치를 의미한다.
당연히 오프셋 값은 '파티션 내에서' 고유하고, 순차적으로 표기된다.
테이블의 pk (id) 개념과 비슷하다고 볼 수 있다.
컨슈머가 메세지를 어디까지 읽었는지 저장하고 있기 때문에 다음에 읽을 메시지 정보를 쉽게 알 수 있다.
예를 들어, 현재 offset = 3이라면, 컨슈머가 0~2까지 메시지를 읽은 것이고 다음에 읽어야 하는 메세지 정보는 3번 이라는 것을 의미한다.
이러한 offset을 통해 데이터의 순서가 보장되는 것이다.
말 그대로 컨슈머들의 집합, 여러 컨슈머들이 하나로 묶인 논리적인 그룹이다. 한 컨슈머 그룹 내에서 1번 컨슈머에서 장애가 발생할 경우, 같은 그룹 내의 2번 컨슈머가 이어 받아 데이터를 계속해서 받아올 수 있다.
리밸런싱 관련 검색을 하던 도중 이해하기 쉬운 이미지가 있어 가져왔다. (원본 링크)
리밸런싱이란, 위의 컨슈머 그룹에서 설명한 예와 같이 한 컨슈머로부터 다른 컨슈머가 소유관을 이관받는 작업을 의미한다.
컨슈머 그룹 내의 컨슈머들은 자신들의 파티션 소유권을 서로 공유한다.
이러한 리밸런싱은 컨슈머 그룹의 가용성과 확장성을 높여준다.
리밸런싱이 발생하면 컨슈머들은 메시지를 읽을 수 없어 해당 컨슈머 그룹 전체가 사용 불가 상태가 되어버린다. 리밸런싱이 발생하지 않는 것이 가장 좋지만,
컨슈머 그룹이 생성되면 컨슈머 그룹별로 관리하는 브로커가 지정되는데, 백그라운드 프로세스로 실행되는 이 브로커를 컨슈머 그룹 코디네이터(Consumer Group Coordinator) 라고 한다.
이 코디네이터가 컨슈머 그룹을 관리하면서 다음과 같은 상황이 발생되면 리밸런싱이 실행된다.
1) session.timeout.ms 설정시간에 heartbeat 시그널을 받지 못하는 경우
2) max.poll.interval.ms 설정시간에 poll() 메소드가 호출되지 않는 경우
옵션명 | 설명 | 기본값 |
---|---|---|
session.timeout.ms | 컨슈머와 브로커 사이의 session timeout 시간. 컨슈머가 살아있는 것으로 판단하는 시간으로 이 시간이 지나면 해당 컨슈머는 종료되거나 장애가 발생한 것으로 판단하고 컨슈머 그룹은 리밸런스를 시도한다. 이 옵션은 heartbeat 없이 얼마나 오랫동안 컨슈머가 있을 수 있는지를 제어하며 heartbeat.interval.ms와 밀접한 관련이 있어서 일반적으로 두 속성이 함께 수정된다. |
10000 (10초) |
heartbeat.interval.ms | 컨슈머가 얼마나 자주 heartbeat를 보낼지 조정한다. session.timeout.ms보다 작아야 하며 일반적으로 1/3로 설정한다. | 3000 (3초) |
max.poll.interval.ms | 컨슈머가 polling하고 commit 할 때 까지의 대기시간. 컨슈머가 살아 있는지를 체크하기 위해 hearbeat를 주기적으로 보내는데, 계속해서 heartbeat만 보내고 실제로 메시지를 가져가지 않는 경우가 있을 수 있다. 이러한 경우에 컨슈머가 무한정 해당 파티션을 점유할 수 없도록 주기적으로 poll을 호출하지 않으면 장애라고 판단하고 컨슈머 그룹에서 제외시키도록 하는 옵션이다. |
300000 (5분) |
max.poll.records | 컨슈머가 최대로 가져갈 수 있는 개수이다. 이 옵션으로 polling loop에서 데이터 양을 조정할 수 있다. |
500 |
enable.auto.commit | 백그라운드에서 주기적으로 offset을 commit | true |
auto.commit.interval.ms | 주기적으로 offset을 커밋하는 시간 | 5000 (5초) |
auto.offset.reset | earliest: 가장 초기의 offset 값으로 설정 latest: 가장 마지막의 offset 값으로 설정 none: 이전 offset 값을 찾지 못하면 error 발생 |
latest |