본문 바로가기
카프카

카프카 톺아보기 - 기본개념

by pius712 2024. 2. 25.

애플리케이션 개발자의 입장에서 카프카에 대해서 간단하게 살펴보고자 한다. (깊게는 필자도 잘 모른다.)

아파치 카프카는 분산 이벤트 스트리밍 플랫폼이다.

일반적인 pub/sub 구조의 rabbitMQ, redis pub/sub 과 달리 메시지를 저장한다는 특징이 있다.

 

1. 브로커

데이터를 쓰는 producer 와 데이터를 읽는 consumer 는 broker 를 통해서 데이터를 주고 받는다. 그리고 broker 는 발행된 데이터를 저장하는 공간이기도 하다.

브로커는 하나의 서버에서 작동하며, 각기 다른 서버에서 작동하는 여러 브로커를 묶어서 클러스터로 구성할 수 있다.

 

 

카프카에서 브로커는 여러 역할을 하는데 크게 아래와 같은 역할을 한다. 해당 역할들에 대해서는 아래에서 추가적으로 살펴볼 것이다.

  • 컨트롤러
  • 데이터 저장, 삭제
  • 컨슈머 오프셋 저장
  • 그룹 코디네이터
  • 복제

2. 토픽과 파티션

토픽

topic 은 데이터를 구분하는 단위이다.

그러니까, 회원 탈퇴 이벤트가 발생하면 회원 탈퇴 이벤트와 관련된 topic 이 있고 해당 topic 에 이벤트를 발행하게 된다.

토픽은 파티셔닝이 되어, 여러 파티션으로 나뉜다. 아래 그림은 하나의 topic 이 3개의 파티션으로 구분되어 있다.

producer 나 consumer 는 특정 topic 에 이벤트를 쓰거나 읽을때, 아래의 파티션으로 분산처리된다.

 

파티션

파티션은 리더와 팔로워로 구성이된다. 조금 헷갈릴 수도 있는데, topic 자체는 파티셔닝 되어 여러 파티션을 가질 수 있는데, 파티션은 리더와 팔로워로 구성되어 있다.

파티션이 할당될때는 클러스터 내의 브로커에 라운드 로빈 방식으로 할당이 된다.

그리고, 각 파티션은 다른 브로커에 팔로워 파티션을 추가한다.

아래 그림을 예로 설명하면, 파티션이 3개가 있으면, 초록색 파티션이 순서대로 좌측부터 할당된다. 그리고 그 외의 브로커에는 각 파티션의 팔로워들을 추가하게 된다.

 

 

기본적으로 producer 와 consumer 는 리더 파티션과 통신을 하게 된다. 아래 그림은 각 브로커에 파티션들이 할당되어 있고, 해당 브로커의 파티션은 리더 파티션이 된다.

그림에 나와있지 않지만, partition 1 의 경우 다른 브로커에 팔로워 파티션이 존재하게 된다.

 

 

 

참고로, 하나의 파티션은 하나의 컨슈머만 연결될 수 있다. 그렇기 때문에, 컨슈머의 처리량을 늘리기 위해서는 파티션의 개수를 늘려야한다. 파티션의 개수를 늘린 뒤에는 줄일 수 없기 때문에 신중하게 선택해야한다.

3. 브로커의 역할

복제

카프카는 브로커 하나가 장애가 날 때를 대비해서, 데이터를 복제해둔다. 위에서 설명했듯, 파티션은 리더와 팔로워가 있고 브로커에 분산되어 있는데 팔로워는 리더가 저장한 메시지의 오프셋과 비교하여, 오프셋이 차이가 있다면 리더로부터 데이터를 복제하게 된다.

만약, 특정 브로커가 죽는다면 해당 브로커가 아닌 다른 브로커의 파티션들이 리더로 승격하게 된다. 브로커가 많다면 이 모든 브로커에 복제할 수는 없으므로, replication factor 를 통해서 얼마나 많은 팔로워에 복제할 것인지를 결정할 수 있다.

데이터 저장, 삭제

처음에 설명했던 것처럼, 다른 pub/sub 구조의 메시징 시스템과는 다르게 카프카는 데이터를 저장한다.

메모리에 잠시 올려두는 것이 아니라 디스크를 통해 저장을 하는데, 디스크에는 토픽 + 파티션 을 구분 값으로 하여 디렉터리를 생성하고 해당 디렉터리에 데이터들을 저장한다.

카프카는 위와 같이 데이터를 디스크에 저장하는데, 세그먼트라는 단위로 저장을 하게 된다. 따라서 개별적인 메시지를 삭제하거나 수정하지는 못한다.

카프카의 경우 디스크가 무한하지 않기 때문에, 데이터를 주기적으로 룰에 따라 삭제하게 된다.

컨슈머 오프셋 저장

컨슈머는 메시지를 읽고 처리한 후에, 읽은 메시지 오프셋에 대해 커밋을 하게 된다. 브로커는 커밋 메시지를 받으면 메시지를 읽은 컨슈머 그룹에 대해 오프셋 커밋을 기록한다.

오프셋을 저장하는 이유는 컨슈머가 어디까지 데이터를 읽었는지 기록해두어, 같은 컨슈머 그룹이 같은 파티션에 메시지를 읽으려고 할때는 읽은 데이터 이후의 데이터를 읽을 수 있도록 해준다.

컨트롤러

여러 브로커 중에 한대가 컨트롤러의 역할을 한다. 브로커의 상태 (health) 를 체크하다가 특정 브로커가 죽으면 해당 브로커 내부의 리더 파티션들을 다른 정상적인 브로커로 재분배하는 역할을 한다.

아파치 카프카는 분산 이벤트 스트리밍 플랫폼이다.

일반적인 pub/sub 구조의 rabbitMQ, redis pub/sub 과 달리 메시지를 저장한다는 특징이 있다.