ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kafka 101] 컨슈머 그룹 리밸런싱 (Consumer Group Rebalance)
    개발자 라이프/카프카 2020. 1. 14. 20:11
    반응형

    들어가며

     카프카를 운영하다 보면 여러 상황을 맞이하게 됩니다. 특히 성능 향상을 위해 특정 토픽의 파티션 수를 증가하거나 혹은 컨슈머 그룹에 컨슈머를 추가하는 경우가 있습니다. 하지만 운영 중인 카프카에 위와 같은 작업을 아무런 인정사정없이(?) 실시하면 일시적인 메시지 처리 불가 등 예상치 못한 상황을 맞이할 수 있습니다. 이와 관련된 것이 리밸런싱(Rebalance, Rebalancing)입니다.

    본 글에서는 리밸런싱에 대해 알아보고, 어떤 상황에서 발생하는 지 알아봅니다. 그리고 나아가 관련한 유의점에 대해 설명합니다.

    Consumer Group Rebalance

    1. 리밸런싱이란?

    컨슈머 그룹 내의 컨슈머들은 자신들이 읽는 파티션의 소유권을 공유합니다. 즉, 하나의 컨슈머 그룹에서 컨슈머 A가 담당하던 파티션 읽기 작업을 컨슈머 B가 이관받아 작업을 처리할 수 있습니다. 이와 같은 컨슈머 그룹 내의 소유권 이관 작업을 리밸런싱(Rebalance, Rebalancing)라고 합니다. 이처럼 리밸런싱은 컨슈머의 파티션 소유권을 조정할 수 있기 때문에 컨슈머 그룹의 확장성과 가용성을 높여줍니다.

    2. 컨슈머 그룹 코디네이터 (Consumer Group Co-ordinator)

     컨슈머 그룹 코디네이터(GroupCoordinator) GroupCoordinator 인스턴스를 백그라운드 프로세스로 실행하며 특정 컨슈머 그룹을 관리하는 브로커입니다. 즉, 컨슈머 그룹 별로 관리하는 브로커가 지정되는데, 이 브로커가 해당 컨슈머 그룹의 코디네이터가 됩니다.

     그룹 코디네이터는 아래와 같은 정보를 추적하고 관리하는데 만약 해당 정보에 대해 변경이 발생하면 리밸런싱을 실시합니다.

    • 컨슈머 그룹의 멤버십 변화 :컨슈머 그룹 내의 컨슈머가 제외되거나 추가됐을 경우
    • 새로운 파티션의 추가 혹은 변경 : 컨슈머 그룹이 구독하고 있는 토픽의 파티션이 추가 혹은 변경(re-assign) 된 경우

    2.1. 컨슈머 그룹의 멤버십 변화

    컨슈머 그룹의 컨슈머는 폴링(polling)하거나 커밋(commit)할 때 하트비트(Heartbeat) 메시지를 그룹 코디네이터에게 전달합니다. 그룹 코디네이터는 하트비트를 성공적으로 전달한 컨슈머를 정상 작동 중이라 판단합니다. 하지만 그룹 코디네이터가 일정 기간(session.timeout.ms) 동안 컨슈머의 하트비트를 받지 못하면, 해당 컨슈머는 어떠한 이유(장애, 종료 등)로 작업이 불가한 것으로 판단하고 해당 컨슈머의 파티션 소유권을 다른 컨슈머로 이관합니다. 즉, 리밸런싱을 실시합니다.

    반대로 컨슈머 그룹에 컨슈머가 추가된 경우도 리밸런싱이 발생합니다. 추가된 컨슈머는 그룹 코디네이터에 joinGroup 메세지를 전송하고, 메세지를 전달받은 그룹 코디네이터는 해당 컨슈머를 포함하여 리밸런싱을 실시합니다.

    2.2. 새로운 파티션의 추가 및 변경

    특정 토픽의 파티션이 증가하거나 re-assign으로 변경이 발생하면 해당 파티션에 대한 소유권을 재조정해야 합니다. 그렇기 때문에 리밸런싱을 통해 컨슈머 그룹 내의 컨슈머가 추가된 파티션을 구독할 수 있도록 합니다.

    3. 컨슈머 그룹 리밸런싱 과정

     그룹 코디네이터가 변경 사항을 감지하고 리밸런싱을 발생시키면 다음과 같이 소유권이 재조정됩니다.

    1. 그룹 코디네이터는 컨슈머 그룹 내의 모든 컨슈머들의 파티션 소유권을 박탈한 뒤, 컨슈머들의 JoinGroup 요청을 일정 시간 기다립니다.
    2. 그룹 코디네이터는 제일 먼저 JoinGroup을 요청한 컨슈머를 그룹 리더로 지정하고 그룹 리더에게 파티션 정도와 컨슈머 목록을 전달합니다.
    3. 그룹 리더는 전달받은 정보를 바탕으로 파티션 소유권을 재조정하고, 이를 그룹 코디네이터에게 다시 전달합니다.
    4. 그룹 코디네이터는 재조정된 파티션 소유권을 각 컨슈머에게 알리고 리밸런싱을 종료합니다.

    조금 더 자세한 리밸런싱 과정 (출처 : https://chrzaszcz.dev/2019/06/kafka-rebalancing/)

    4. 리밸런싱의 위험

     리밸런싱은 컨슈머의 소유권을 재조정하는 일입니다. 그렇기 때문에 리밸런싱이 발생한 컨슈머 그룹 내의 모든 컨슈머의 읽기 작업은 중단됩니다. 그래서 컨슈머 측의 일시적인 서비스 중단이 발생할 수 있습니다.

     앞서 언급된 것처럼 리밸런싱은 컨슈머의 멤버십의 변화는 물론 파티션 수가 증가할 때도 발생합니다. 리밸런싱은 컨슈머 쪽의 서비스 상태에 일시적인 영향을 줄 수 있으므로 컨슈머, 파티션의 추가가 필요하다면 충분한 고려 후에 추가하는 것을 추천합니다.

    추가로 하트비트 전송 주기를 결정하는 heartbeat.interval.ms 설정과 앞서 언급한 session.timeout.ms설정(기본값 3초)은 원치 않는 리밸런싱 발생에 영향을 미치므로 적절하게 설정할 필요가 있습니다. 대체로 heartbeat.interval.ms : session.timeout.ms = 1 : 3으로 설정하는 것은 권장합니다.

    마무리

    본 글은 통해 리밸런싱에 대해 알아봤습니다. 리밸런싱은 컨슈머의 가용성과 확장성을 제공하는 중요한 역할을 담당하는 작업입니다. 하지만 중요한 만큼 그 영향력이 상당히 큽니다. 그렇기 때문에 운영에 있어서 리밸런싱은 반드시 알아야 하는 작업입니다.

    참고

    반응형

    댓글

Designed by Tistory.