지난 포스팅에 이어서, 아파치 카프카(Apache Kafka)의 브로커, 클러스터, 그리고 주키퍼 등의 기본 개념에 대해 알아보겠습니다. 주키퍼는 카프카 클러스터를 운영하기 위해 필요한 Application이고 1개의 클러스터는 n개의 브로커루 구성되어 있습니다. 일반적으로 장애에 대비하여 최소 3개 이상의 브로커 서버를 클러스터로 그룹핑하여 사용합니다.
용어 설명
이해를 돕기 위해 각 용어의 간단한 설명으로 시작하고 본론에서 상세 설명을 시작하겠습니다.
- 주키퍼: 카프카 클러스터 관리, 동기화를 담당합니다.
- 클러스터: 여러 브로커로 이루어진 카프카 서버 그룹을 의미합니다.
- 브로커: 카프카 클러스터를 구성하는 서버로, 데이터를 분산 저장하고 클라이언트 간에 데이터 전달을 중재하는 역할을 합니다
N개의 카프카 클러스터가 연결된 주키퍼
예시로 고객 팀, 수신 팀, 여신 팀 등이 각자의 클러스터를 운영할 때, 하나의 주키퍼 앙상블로 동시에 운영할 수 있습니다. 각기 다른 주키퍼 앙상블을 사용할 수도 있지만, 상황에 따라서 리소스 낭비를 대비하여 공통으로 운영하곤 합니다.
- 서로 다른 znode에 클러스터를 지정.
- root znode에 각 클러스터별 znode 생성 후, 클러스터 실행 시 하위 znode로 설정.
- 카프카 3.0부터는 주키퍼가 없어도 클러스터가 동작 가능하지만, 아직은 주키퍼의 완전한 대체제가 되지 못하여 주키퍼를 사용중.
브로커의 역할
브로커 컨트롤러
다수의 브로커 중 한 대가 컨트롤러 역할을 합니다. 해당 브로커는 데이터를 지속적으로 처리할 것을 목적으로, 다른 브로커들의 상태를 모니터링 하다가 비정상 브로커 발견 시, 클러스터에서 제외시키고 대체제를 지정합니다. 만약, 컨트롤러 역할을 하는 해당 브로커에 장애가 생기면, 다른 브로커가 컨트롤러 역할을 대체하게 됩니다. (※양방향으로 주기적으로 확인)
데이터 관리
브로커는 데이터를 분배하여 적재하고, 삭제하는 역할을 합니다. 이전 시간에 컨슈머가 데이터를 가져가더라도 토픽의 데이터는 삭제되지 않는다고 했습니다. 컨슈머나 프로듀서는 데이터 삭제를 요청할 수 없습니다. 오직 브로커만이 데이터를 “로그 세그먼트(log segment)”단위로 삭제할 수 있습니다.
컨슈머 오프셋 저장
컨슈머 그룹이 특정 파티션에서 데이터를 가져갈 때, 어느 레코드까지 가졌는지 확인하기 위해 오프셋을 커밋합니다. 커밋한 오프셋은 __consumer_offsets라는 자동 생성 토픽에 저장되는데, 해당 토픽에 있는 오프셋을 기준으로 다음 레코드를 인덱싱합니다.
그룹 코디네이터
컨슈머 그룹의 상태를 체크하고 문제 시 리밸런스(rebalnace)를 수행합니다. 리밸런스란, 특정 컨슈머에 문제가 발생하여 특정 그룹에서 제외되면, 정상 동작하는 컨슈머로 재할당 하는 과정을 말합니다.
마치며
이번 시간에는 각종 기본 개념과 작동 방식에의 기본에 대해 알아보았습니다. 그중 브로커의 역할에 대해 다양하지만, 간략하게 설명했는데요. 다음 시간에는 복제(Replication)에 대해 분석해보도록 하겠습니다.
답글 남기기