kafka 기술문서

그룹 코디네이터

saay-hi 2024. 6. 25. 11:05

컨슈머 그룹에서 각 컨슈머들에게 작업을 균등하게 분해하는 동작을 '컨슈머 리밸런싱'이라고 부르거나 '컨슈머 리밸런싱이 일어났다'라고 표현

안정적인 컨슈머 그릅 관리를 위해 별도의 코디네이터가 존재 ( 그룹 코디네이터라고 부름)

  • 그룹 코디네이터의 목적 : 컨슈머 그룹이 구독한 토픽의 파티션들과 그룹의 멤버들을 트래킹하는 것

→ 따라서 파티션 또는 그룹의 멤버에 변화가 생기면 작업을 균등하게 재분배하기 위해 컨슈머 리밸런싱 동작이 발생함

그룹 코디네이터는 각 컨슈머 그룹별로 존재하며, 이러한 그룹 코디네이터는 카프카 클러스터 내의 브로커 중 하나에 위치함

그룹 코디네이터와 컨슈머 그룹 관계

 

컨슈머 그룹이 브로커에 최초 연결 요청을 보내면 브로커 중 하나에 그룹 코디네이터가 생성되고, 이 그룹 코디네이터는 컨슈머 그룹의 컨슈머 변경과 구독하는 토픽파티션 변경 등에 대한 감지를 시작함

토픽 파티션과 그룹의 멤버 변경이 일어나면 변경된 내용을 컨슈머들에게 알려주기도 함

 

컨슈머 그룹 등록 과정 

① 컨슈머는 컨슈머 설정값 중에서 bootstrap.brokers 리스트에 있는 브로커에게 컨슈머 클라이언트와 초기 커넥션을 연결하기 위한 요청을 보낸다

② 해당 요청을 받은 브로커는 그룹 코디네이터를 생성하고 컨슈머에게 응답을 보낸다. 컨슈머 그룹의 첫 번째 컨슈머가 등록될 때까지 아무 작업도 일어나지 않음

③ 그룹 코디네이터는 group.inintial.rebalance.delay.ms의 시간 동안 컨슈머의 요청을 기다림

④ 컨슈머는 컨슈머 등록 요청을 그룹 코디네이터에게 보낸다. 이 때 가장 먼저 요청을 보내는 컨슈머가 컨슈머 그룹의 리더가 됨

⑤ 컨슈머 등록 요청을 받은 그룹 코디네이터는 해당 컨슈머 그룹이 구독하는데 토픽 파티션 리스트 등 리더 컨슈머의 요청에 응답을 보냄

⑥ 리더 컨슈머는 정해진 컨슈머 파티션 할당 전략에 따라 그룹 내 컨슈머들에게 파티션을 할당한 뒤 그룹 코디네이터에게 전달하 

⑦ 그룹 코디네이터는 해당 정보를 캐시하고 각  그룹 내 컨슈머들에게 성공을 알림

⑧ 각 컨슈머들은 각자 지정된 토픽 파티션으로부터 메시지들을 가져옴

 

실제로 컨슈머그룹과 그룹 코디네이터가 서로 긴밀하게 내용을 주고 받으며 컨슈머 그룹이 안정적으로 메시지를 읽어갈 수 있도록 유지함

 

컨슈머들의 변경을 감지하기 위해 그룹 코디네이터와 컨슈머들은 서로 하트비트를 주고 받음. 이렇게 하트비트를 주기적으로 주고받으면서 컨슈머가 살아있는지 , 잘 동작하는지 확인함

하트비트와 관련된 옵션
heartbeat.interval.ms 3000 기본값은 3000이며, 그룹 코디네이터와 하트비트 인터벌 시간임. 해당 시간은 session.timeout.ms보다 낮게 설정해야 하며, 3분의 1 수준이 적절함
session.timeout.ms 10000 기본값은 10000임. 어떤 컨슈머가 특정 시간 안에 하트비트를 받지 못하면 문제가 발생했다고 판단해 컨슈머 그룹에서 해당 컨슈머는 제거되고 리밸런싱 동작이 일어남
max.poll.interval.ms 300000 기본값은 300000dla. 컨슈머는 주기적으로 poll()을 호출하여 토픽으로부터 레코드들을 가져오는데, poll()호출 후 최대 5분간 poll()호출이 없다면 컨슈머가 문제가 있는 것으로 판단해 리밸런싱 동작이 일어남

컨슈머 리밸런싱 동작은 경우에 따라 매우 높은 비용이 지출되므로 가급적 리밸런싱이 자주 발생하지 않도록 주의.

옵션값들을 조금씩 변경해 컨슈머 다운을 더 빠르게 혹은 더 느리게 감지하도록 조정할 수 있음

하지만 옵션값들의 시간을 일부 변경해 그룹 코디네이터가 컨슈머의 다운을 빠르게 감지하도록 설정해둔다면, 일시적인 컨슈머의 타임아웃이나 일시적인 TCP 패킷 손실로 인해 원하지 않은 리밸런싱이 빈번하게 일어나는 현상이 발생할 수 있음.

반대로 그룹 코디네이터가 컨슈머 다운을 늦게 감지하도록 설정해두면 그 시간만큼 해당 파티션의 메시지를 읽지 못하는 현상이 발생할 수 있음

가능하면 기본 설정을 유지하기를 권장