[Kafka] 주요 개념 Offset, Consumer Group, Rebalancing

solved_err.log·2022년 12월 9일
0

지난 내용에 이어, 오늘은 카프카의 오프셋, 리밸런싱, 컨슈머 그룹에 대해 정리해본다. 먼저, 각 개념에 대해 알아보자.

Offset (오프셋)

오프셋이란, 각 파티션마다 메시지가 저장되는 위치를 의미한다.
당연히 오프셋 값은 '파티션 내에서' 고유하고, 순차적으로 표기된다.
테이블의 pk (id) 개념과 비슷하다고 볼 수 있다.

컨슈머가 메세지를 어디까지 읽었는지 저장하고 있기 때문에 다음에 읽을 메시지 정보를 쉽게 알 수 있다.

예를 들어, 현재 offset = 3이라면, 컨슈머가 0~2까지 메시지를 읽은 것이고 다음에 읽어야 하는 메세지 정보는 3번 이라는 것을 의미한다.
이러한 offset을 통해 데이터의 순서가 보장되는 것이다.

Consumer Group (컨슈머 그룹)

말 그대로 컨슈머들의 집합, 여러 컨슈머들이 하나로 묶인 논리적인 그룹이다. 한 컨슈머 그룹 내에서 1번 컨슈머에서 장애가 발생할 경우, 같은 그룹 내의 2번 컨슈머가 이어 받아 데이터를 계속해서 받아올 수 있다.

Rebalancing (리밸런싱)

리밸런싱 관련 검색을 하던 도중 이해하기 쉬운 이미지가 있어 가져왔다. (원본 링크)
리밸런싱이란, 위의 컨슈머 그룹에서 설명한 예와 같이 한 컨슈머로부터 다른 컨슈머가 소유관을 이관받는 작업을 의미한다.

컨슈머 그룹 내의 컨슈머들은 자신들의 파티션 소유권을 서로 공유한다.
이러한 리밸런싱은 컨슈머 그룹의 가용성과 확장성을 높여준다.

리밸런싱이 발생하면 컨슈머들은 메시지를 읽을 수 없어 해당 컨슈머 그룹 전체가 사용 불가 상태가 되어버린다. 리밸런싱이 발생하지 않는 것이 가장 좋지만,

❓ 그렇다면, 리밸런싱은 언제 발생할까?

컨슈머 그룹이 생성되면 컨슈머 그룹별로 관리하는 브로커가 지정되는데, 백그라운드 프로세스로 실행되는 이 브로커를 컨슈머 그룹 코디네이터(Consumer Group Coordinator) 라고 한다.
이 코디네이터가 컨슈머 그룹을 관리하면서 다음과 같은 상황이 발생되면 리밸런싱이 실행된다.

1) session.timeout.ms 설정시간에 heartbeat 시그널을 받지 못하는 경우

2) max.poll.interval.ms 설정시간에 poll() 메소드가 호출되지 않는 경우

  • 컨슈머는 메시지를 가져오기 위해 브로커에 poll()요청을 보내고, 컨슈머는 가져온 메시지를 처리한 후 해당 파티션의 offset을 커밋한다.
    이미지 출처:사람인 기술 블로그
    poll()요청을 보낸 후 다음 요청을 다시 보내기까지의 시간이 [max.poll.interval.ms]의 기본값인 300000(5분) 보다 늦으면 브로커는 컨슈머에 문제가 있다고 판단하여 리밸런싱을 발생시킨다.
옵션명 설명 기본값
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
profile
배우고 기록하는 개발 일기장✍

0개의 댓글