All Articles

Kafka - (6) Offset과 Consumer Group, 그리고 Lag

Offset이란?

  • 각 파티션마다 메시지가 저장되는 위치를 오프셋이라고 한다. 그 위치는 해당 파티션 내에서 유니크하고 순차적인 숫자 형태로 표시된다.(토픽 기준으로는 유니크하지 않다. 파티션이 여러 개이기 때문)
  • 이 오프셋을 이용해 메시지의 순서가 보장되며, 절대 오프셋 순서가 바뀐 상태로 컨슈머가 데이터를 가져갈 수는 없다.

    • 단, 토픽은 여러 파티션으로 이루어져있기 때문에 토픽 차원에서는 기본적으로 메시지 순서가 보장되지 않는다.

Consumer Group이란?

  • 여러 컨슈머를 하나의 그룹으로 묶어서 group을 지정할 수 있는데, 이렇게 그룹으로 묶인 컨슈머끼리는 동일한 데이터를 중복으로 컨슘하지 않도록 설게되어있다.

    • 즉, 서로 다른 그룹의 컨슈머라면 동일한 데이터를 각각 컨슘하게 될 수 있다.
    • [응용] 만일 여러 애플리케이션을 운영한다고 가정할 때, 각 애플리케이션에서 하나 이상의 토픽에 저장된 모든 메시지를 읽어야 할 때는 애플리케이션마다 컨슈머 그룹을 지정해주면 되겠다.

Partition Rebalancing

  • 한 컨슈머로부터 다른 컨슈머로 파티션 소유권을 이전하는 것을 의미한다.
  • 리밸런싱이 자주 일어나면 성능상 이슈가 발생한다. 그 과정에서 컨슈머들이 토픽의 데이터를 읽지 못하기 때문이다.

리밸런싱은 언제 일어나나?

  • 컨슈머가 늘어나거나 컨슈머가 줄어드는 등 변화가 생길 때 group coordinator가 그걸 감지하여 리밸런싱한다.(배포할 때 주의해야겠다.)
  • 각 컨슈머는 그룹 코디네이터에게 자신이 살아있다는 걸 알리기 위해 heartbeat.interval.ms 주기로 heartbeat를 보낸다. 그런데 session.timeout.ms에 해당하는 시간이 지나도록 heartbeat가 오지 않으면 해당 컨슈머가 종료되거나 문제가 있는 걸로 간주하여 리밸런싱이 일어난다.
  • max.poll.interval.ms 내에 poll()을 호출하지 않으면 해당 컨슈머에 문제가 생겼다고 간주하여 리밸런싱이 일어난다.

Lag이란?

아래 명령어를 실행하면 각 컨슈머그룹의 파티션별 lag을 확인 가능하다.

kafka-consumer-groups --bootstrap-server <host:port> --group <group.id> --describe

실행 결과:

TOPIC         PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                      HOST            CLIENT-ID
example.topic 0          6392623366      6392623859      493             consumer-1-f6f6ffb0-1054-46b9-af13-0b254bc14da0  /10.64.69.95    consumer-1
example.topic 1          6394637143      6394637383      240             consumer-10-6c57b320-7742-4418-8e15-b7d735da346e /10.64.69.95    consumer-2
example.topic 2          6397170269      6397170495      226             consumer-19-dbed41a1-42bb-4ecb-bc8f-84e47c74dbe8 /10.64.69.95    consumer-3
example.topic 3          6397170269      6397170495      226             consumer-19-dbed41a1-42bb-4ecb-bc8f-84e47c74dbe8 /10.64.69.95    consumer-4
  • Current offset이란, 각 Consumer Group 에서 각 파티션의 어느 오프셋까지 컨슘했는지를 나타내는(정확히는, 어느 오프셋까지 commit했는지를 나타내는) 값이다.

    • [참고] Kafka 클러스터의 Internal topic인 __consumer_offsets를 통해 관리하며, consumer에서 commit이 일어나면 변경된다.
  • Log end offset이란, 각 파티션의 실제 마지막 offset 값이다.
  • Lag이란, 이 두 값의 차이이다. Lag이 늘어난다면 메시지의 생산 속도를 컨슘 속도가 못따라가고 있다는 의미다.

[참고자료]
고승범 외(2018), 카프카: 데이터 플랫폼의 최강자, 책만.
https://steemit.com/kr/@yjiq150/kafka-consumer-offset-reset
https://jyeonth.tistory.com/30


이전 글

(5) Replication과 ISR

다음 글

(7) Offset Commit