Kafka

Kafka

카프카는 메시지를 생산하는 프로듀서와 소비하는 컨슈머, 그리고 그 사이에서 메시지를 저장, 전달하는 브로커로 구성된다.

그러나 각 역할에 대해서 얘기하기전에 기본적으로 알고 넘어가야 하는 개념들이 있다.


메시지

카프카의 브로커는 프로듀서로부터 메시지를 전달받고, 이를 컨슈머로 전달하는 역할을 담당한다.

카프카의 메시지는 Key와 Value로 구성된다.

먼저 메시지의 키는 해당 메시지가 카프카 브로커 내부에 저장될 때, 저장되는 위치와 관련된 요소이다.

기본적으로 카프카는 각 메시지를 파일로 저장한다.

프로듀서가 메시지를 브로커로 전달할 때, 프로듀서 내부의 파티셔너(Partitioner)가 저장 위치를 결정한다.

이 때 키 값을 이용하여 연산하고 그 결과에 따라 저장되는 위치를 결정한다.

메시지의 값(value)는 실제로 그 메시지가 전달하려는 내용물을 의미한다.

단순한 문자열이 될 수도 있고, 객체의 형태로 사용할 수도 있다.

이렇게 다양한 타입의 값을 보낼 수 있는 것은 브로커를 통해 메시지가 발행되거나 소비될 때, 메시지 전체가 직렬화/역직렬화 되기 때문이다.

메시지의 키와 값은 다양한 타입이 될 수 있지만, 특정한 구조인 스키마(schema)를 가진다.

카프카 메시지의 스키마는 데이터베이스의 테이블 스키마와 유사한 개념이다.

프로듀서가 발행하고 컨슈머가 소비할 때, 메시지를 적절하게 처리하기 위해 필요하다.

예를 들어, 프로듀서가 내용(value)이 JSON 형태인 메시지를 발행할 때, 해당 메시지를 소비하는 컨슈머는 프로듀서가 생산한 JSON의 구조를 예상하고, 그에 맞게 메시지를 처리하려고 할 것이다.

이 때 스키마가 겹치지 않는다면 정상적인 처리를 기대하기는 힘들 것이다.


토픽

카프카의 토픽(Topic)은 메시지를 구분하는 논리적인 단위로, 동일한 토픽의 메시지들은 논리적으로 같은 문맥(Context)를 가진다.

예를 들어, 주문에 관한 내용을 담고 있는 메시지를 발행하고, 소비하기 위해서 우리는 order라는 토픽을 생성하고 이 토픽을 기준으로 메시지를 발행, 소비할 수 있다.

이처럼 토픽은 논리적인 단위이자 메시지 흐름의 단위이기도 하다.

다른 토픽이라면, 다른 흐름이라고 볼 수 있고, 다른 큐라고 봐도 무방하다.


파티션

논리적인 단위인 토픽을 기준으로 발행되는 메시지들은 브로커 내부의 물리적인 단위인 파티션으로 나뉜다.

그림을 자세히 살펴보면, T0 토픽은 4개의 파티션으로(P0-P3), T1 토픽은 2개의 파티션(P0-P1)으로 구성되어 있다.

이렇게 하나의 토픽에 대하여 여러 파티션을 구성하는 가장 큰 이유는 분산처리를 통한 성능 향상에 있다.

카프카는 하나의 토픽에 대해 여러 프로듀서가 발행할 수 있고, 여러 컨슈머가 구독할 수 있다.

그렇기 때문에 토픽을 하나의 파티션으로 구성하는 것보다 2개 이상의 파티션을 두는 것이 병렬적으로 처리가 되어 부하를 분산시키고 성능이 더욱 향상될 것이다.

이외에도 파티션의 가장 큰 특징은 하나의 파티션 내에서는 메시지 순서가 보장된다는 것이다.

즉, 파티션은 메시지 순서 보장의 단위이다.

각 파티션의 메시지는 발행되는 순서대로 구독할 수 있다.

따라서 하나의 토픽이 여러 파티션으로 구성되는 경우, 토픽 단위의 메시지 순서는 보장할 수 없다.

이는 파티션 내부에서의 순서는 보장되지만 파티션 간의 순서는 보장되지 않기 때문이다.

파티션 복제

하나의 토픽은 하나 이상의 파티션으로 구성된다.

여기에서 나아가 카프카는 파티션의 복제 기능을 제공하는데, 이를 통해 서비스는 안정화되고 장애 수용도 수월해진다.

하나의 파티션은 1개의 리더 레플리카와 그 외 0개 이상의 팔로어 레플리카로 구성된다.

하나의 토픽이 1개 이상의 파티션으로, 하나의 파티션이 1개 이상의 레플리카로…

리더 레플리카는 파티션의 모든 쓰기, 읽기 작업을 담당한다.

반대로 팔로어 레플리카는 리더 레플리카로 쓰인 메시지들을 그대로 복제하고, 만약 리더 레플리카에 장애가 발생하는 경우 리더를 승계받는다.

파티션의 레플리카 수는 복제 계수를 통해 결정되는데, 만약 복제 계수가 1이라면 파티션은 리더 레플리카로만 구성된다.

이 때, 파티션과 리더 레플리카는 별개인 것이 아니라 동일한 것으로 볼 수 있다.

일반적으로 말하는 물리적인 파티션 = 리더 레플리카

나아가 복제 계수가 2 이상이라면 해당 파티션은 1개의 리더 레플리카와 1개 이상의 팔로워 레플리카로 구성된다.

이 경우 모든 레플리카들은 서로 다른 브로커에 구성된다.

만약 같은 파티션의 레플리카가 동일한 브로커에 구성되는 경우에는 에러가 발생한다.


브로커

브로커는 일반적으로 카프카 서버라고 불린다.

프로듀서와 컨슈머는 별도의 애플리케이션으로 구성되는 반면 브로커는 카프가 자체이기 때문이다.

따라서 ‘카프카를 구성한다’ 혹은 ‘카프카를 통해 메시지를 전달한다’에서 카프카는 브로커를 의미한다.

브로커 내부에는 여러 토픽들이 생성될 수 있고, 이러한 토픽들에 의해 생성된 파티션들이 보관하는 데이터에 대해 분산 저장을 해주거나 장애 발생 시, 안전하게 데이터를 사용할 수 있도록 도와주는 역할을 한다.

카프카 (브로커) 클러스터 구성

브로커는 한 대 이상의 노드로 클러스터를 구성할 수 있다. 여기서 주키퍼가 등장한다.

주키퍼

주키퍼는 아파치 프로젝트중 하나로, 하둡 에코 시스템을 구성한다.

주 역할은 분산 시스템의 메타 정보를 관리하고, 필요시에는 분산 시스템의 마스터를 선출한다.

예를 들어 카프카 클러스터를 구성하면 주키퍼에는 카프카 클러스터의 식별 정보부터 현재 살아있는 브로커 정보, 나아가 권한 정보 등이 저장된다.

또한, 카프카 브로커들 중 일종의 지휘자 역할을 하는 컨트롤러 브로커를 뽑는 역할을 담당한다.

컨트롤러

줄줄이 중요한 개념들이 나온다.

컨트롤러는 클러스터의 여러 브로커 중 하나가 담당하게 되는 역할이다.

클러스터 내의 브로커가 장애 발생으로 사용할 수 없는 경우,

장애가 발생한 브로커의 토픽에 있는 리더 파티션을 같은 클러스터 내의 정상 동작하는 다른 브로커에게 토픽의 리더 파티션 지위를 재분배하는 역할을 한다.

이 때, 컨트롤러의 역할을 하는 브로커에 장애가 발생하는 경우에는 다른 브로커가 컨트롤러의 역할을 한다.

이 또한 주키퍼가 할당해 주는 것이다.

주키퍼는 디렉터리 형태로 데이터를 저장, 관리한다.

그리고 카프카의 메타 정보는 클러스터를 구성할 때 주키퍼 연결 설정에서 지정된 디렉토리 하위에 저장된다.

따라서 동일한 카프카 클러스터는 주키퍼 연결 설정에서 동일한 디렉토리 경로를 가지며, 하나의 주키퍼 클러스터에 여러 카프카 클러스터가 동시에 구성될 수 있다.

잠시 정리…

  • 카프카 클러스터는 하나 이상의 노드(브로커)로 구성된다.

  • 하나의 주키퍼 클러스터에 여러 카프카 클러스터가 구성될 수 있다.

  • 카프라를 구성할 때는 보통 한 대 이상의 주키퍼 클러스터와, 한 대 이상의 브로커로 구성된 브로커 클러스터로 구성된다.

카프카 클러스터는 모든 브로커가 클라이언트의 요청을 처리할 수 있는 Peer-to-Peer(P2P)의 구조를 가진다.

이렇게 P2P가 가능한 것은 클라이언트와 카프카 간 메타 데이터를 전달하는 과정이 있기 때문이다.

다만 염두해야 할 것은 실제로 메시지를 전달받고 저장하는 단위인 파티션은 리더와 팔로워로 나뉘어 작업을 처리한다는 것이다.

하나의 토픽이라도 리더 파티션의 위치에 따라 여러 브로커가 요청 받을 수 있다.

코디네이터

코디네이터(Coordinator)는 클러스터의 여러 브로커 중 하나의 브로커가 코디네이터의 역할을 하게 된다.

코디네이터는 컨슈머 그룹의 상태를 체크하여 컨슈머 그룹 내의 컨슈머가 장애가 발생하여 매칭된 파티션의 데이터를 컨슘할 수 없는 경우, 장애가 발생한 컨슈머에게 매칭된 파티션을 정상 동작하는 컨슈머에게 할당한다.

이 때, 이 재할당해주는 동작을 Rebalance라고 한다.

컨슈머가 죽었을 때 다른 컨슈머에게 재할당해주는 역할 : 코디네이터

브로커가 죽었을 때 다른 브로커에게 리더 파티션 직위를 재분배 하는 역할: 컨트롤러


프로듀서

프로듀서(Producer)는 메시지를 생산(produce)해서 브로커의 토픽으로 메시지를 보내는 역할을 하는 애플리케이션이나 서버 모두를 프로듀서라고 부른다.

프로듀서는 데이터를 전송할 때 리더 파티션을 가지고 있는 카프카 브로커와 직접 통신한다.

컨슈머

컨슈머(Consumer)는 토픽의 파티션에 저장되어 있는 메시지를 소비(consume)하는 역할을 하는 애플리케이션이나 서버 모두를 컨슈머라 부른다.

컨슈머는 데이터를 요청할 때 리더 파티션을 가지고 있는 카프카 브로커와 통신한다.

토픽의 파티션으로부터 데이터를 가져가기 위해 컨슈머를 운영하는 방법은 2가지로, 토픽의 특정 파티션만 구독하는 컨슈머를 운영하는 것과 1개 이상의 컨슈머로 이루어진 컨슈머 그룹을 운영하는 것이 있다.

Last updated