분석/메시지 브로커

[Kafka] 내부 동작에 대해 알아보자

drillerHyun 2025. 7. 12. 01:27

Kafka 개념

1. Kafka란 무엇인가?

kafka는 분산 이벤트 스트리밍 플랫폼이다.

 

2. Kafka의 구성요소는?

producer는 kafka의 특정 topic으로 메시지를 전송한다.

kafka broker는 메시지를 저장한다. 보통 3대 이상의 cluster로 운영한다.

consumer는 kafka의 특정 topic을 구독하고 메시지를 읽어온다.

 

topic은 메시지를 구분하는 논리적 단위이다.

partition은 topic을 물리적으로 구분한 구분한 단위이며 

하나의 topic은 하나 이상의 partition으로 이루어진다.

partition은 선입선출 구조로 먼저 들어간 record가 consumer에게 먼저 읽힌다.

partition은 한번 늘리면 줄일 수 없으므로 partition 갯수를 신중하게 설정해야한다.

offset은 partition에 메시지가 저장되는 위치를 말한다.

 

Kafka Broker

1. Kafka Broker란 무엇인가?

kafka client와 메시지를 주고 받으며 메시지를 저장하고 관리하는 application이다.

고가용성을 위해 3대 이상의 broker를 묶어서 cluster로 운영한다.

 

2. Replication은 어떻게 이루어지나?

각 partition마다 leader가 존재하며 모든 읽기와 쓰기 연산은 leader를 통해 이루어진다.

follower는 leader의 메시지를 복제한다.

client는 leader와 통신하기 때문에 leader의 위치를 알아야한다.

이를 위해 metadata를 broker로부터 전달받는다.

 

high watermark는 모든 follower partition들이 복제 완료한 마지막 offset 번호로

consumer는 leader partition의 high watermark 이하의 메시지만 읽을 수 있다.

 

ISR 그룹은 leader partition에 장애가 생기면 leader 후보가 될 수 있는 partition들을 모아놓은 리스트이다.

ISR 그룹 정보는 zookeeper에 저장된다.

leader partition은 특정 주기의 시간만큼 복제 요청을 하지 않는 follower partition은 ISR 그룹에서 추방한다.

 

3. LogSegment은 무엇일까?

topic으로 들어오는 메시지는 segment라는 파일로 저장된다.

rolling 전략을 사용하고 있어서 segment 파일의 크기가 커지면 새로운 segment 파일을 생성해서 사용한다.

 

log segment를 관리하기 위해 삭제와 compaction을 사용한다.

가장 마지막 segment 파일은 active segment라하고 active segment는 삭제와 compaction에서 제외된다.

삭제를 하기 위해서 보관 주기나 최대 크기를 지정할 수 있는데

보관 주기가 지나거나 최대 크기를 넘어서면 segment 파일을 삭제할 수 있다.

compaction을 사용하려면 메세지의 key가 필수로 설정되어있어야하고

compaction을 통해 key 값별로 마지막 메시지만 남기고 삭제한다.

 

4. Controller는 무엇일까?

cluster 중 하나의 broker가 controller 역할을 하게 되며 리더 선출 작업을 한다.

controller는 zookeeper에 watch에 걸고 있는데 

leader partition의 장애가 감지되면 새로운 리더를 선출한다.

 

5. 관련 변수는 어떤 게 있을까?

retension.ms

- log segment의 보관 주기

retension.bytes

- log segment의 최대 크기

min.cleanable.dirty.ratio

- active segment를 제외한 segment 중 dirty record의 비율

 

Kafka Producer

1. Partitioner란 무엇일까?

producer가 메시지를 보낼 때 해당 토픽의 어느 partition으로 보낼지 결정하는 부분이다.

 

메시지의 key를 사용해서 보낼 partition을 결정하는데 여러가지 전략이 있다.

1. roud robin 전략은 partition마다 순차적으로 메시지를 할당하는 전략이다.

    batch 전송을 위해서 partition별로 최소 record 갯수를 충족해야 전송을 할 수 있는데

    round robin 전략을 사용하면 전송효율이 떨어질 수 있다.

2. sticky 전략은 하나의 partition을 정하고 batch 전송을 하기 위한 최소 record 갯수를 먼저 채우는 전략이다.

 

2. 관련 변수는 어떤 게 있을까?

acks

- 0일 경우 leader partition에 메시지가 성공적으로 전송되었는지 확인하지 않는다.

- 1일 경우 leader partition에만 메시지가 성공적으로 전송되었는지 확인한다.

- -1일 경우 leader partition과 follower partition에 메시지가 성공적으로 전송되었는지 확인한다.

min.insync.replicas

- producer가 메시지가 성공적으로 전송되었는지 확인하는 ISR 그룹의 파티션 갯수이다.

buffer.memory

- buffer 메모리 공간 크기 지정

batch.size

- batch 전송을 하기 위한 record 갯수 지정

linger.ms

- batch 전송을 위해 buffer 메모리에서 대기하는 시간 지정

compression.type

- record 전송시 압축 타입

enable.idempotence

- 활성화하면 중복 없는 record 전송이 가능

max.in.flight.requests.per.connection

- 하나의 connection에서 ACK 없이 전송할 수 있는 최대 요청 수 지정

retries

- 재시도 횟수 지정

metadata.max.age.ms

- metadata를 refresh하는 간격

metadata.max.idle.ms

- metadata를 캐싱에 유지하는 시간

 

Kafka Consumer

1. 기본 동작

consumer는 메시지를 어디까지 가졌는지 확인하기 위해 마지막으로 읽은 offset 정보를

__consumer_offsets라는 내부 토픽에 저장한다.

 

2. Group Coordinator이란 무엇일까?

consumer는 consumer group에 속하며 group을 떠나거나 새로 합류할 수 있다.

consumer에 변화가 생겨서 partition을 consumer에게 재분배하는 것을 reblancing이라고 한다.

group coordinator는 consumer group별로 cluster 중 하나의 broker가 역할을 맡고 rebalancing을 감지한다.

group coordinator는 주기적으로 consumer와 heartbeat를 주고 받으면서 작동여부를 확인한다.

 

3. Static Membership이란 무엇일까?

기본적으로 consumer는 group 내에서 식별하기 위한 용도로 아이디를 부여받는다.

consumer가 재시작되면 새로운 consumer로 인식해서 rebalancing이 일어나고 새로운 아이디를 부여받는다.

 

static membership을 사용하면 consumer가 group을 나갔다가 다시 합류해도 rebalancing이 일어나지 않는다.

consumer는 group을 나갈 때 group coordinator에게 알리지 않고 기존의 아이디로 합류하게 된다.

 

consumer를 재시작하고 session.timeout.ms에 지정된 시간동안 group coordinator가 heartbeat를 받지 못한다면 

강제로 rebalancing이 일어나기 때문에 session.timeout.ms 값을 잘 설정해야한다.

 

4. Partition 할당 전략은 어떤 게 있을까?

consumer group의 leader consumer가 할당 전략에 따라 consumer와 partition을 매칭시킨다.

1. range 할당 전략은 partition을 범위를 묶어서 consumer에게 할당한다.

    partition과 consumer를 각각 정렬하고 partition 갯수를 consumer 갯수로 나눈만큼 할당하되

    나머지가 생기면 앞의 consumer가 가져가게 한다.

2. round robin 할당 전략은 번갈아가면서 partition을 consumer에게 할당한다.

3. sticky 할당 전략은 round robin 전략을 사용하지만

    rebalancing이 일어나면 기존 정상적으로 연결되어있는 consumer는 그대로 유지한다.

 

5. 관련 변수는 어떤 게 있을까?

group.id

- consumer가 속한 group을 식별할 수 있는 식별자

heaertbeat.interval.ms

- consumer와 group coodinator 간 heartbeat interval 시간

session.timeout.ms

- consumer가 heartbeat를 받아야하는 시간으로 이 시간이 지나면 consumer가 종료된것으로 간주함

max.poll.interval.ms

- consumer는 주기적으로 poll 메서드를 호출해서 record를 가져오는데

  마지막 poll 메서드 호출후 지정된 시칸만큼 poll 메서드 호출이 없다면 rebalancing이 일어난다.

enable.auto.commit

- 활성화시 주기적으로 자동으로 offset을 commit함

partition.assignment.strategy

- 파티션 할당 전략 지정