카프카 브로커란 카프카 인스턴스 각각 어플리케이션을 지칭 한다. 브로커는 프로듀서로부터 메세지를 받아 저장하고, 컨슈머들의 요청에 따라 메세지를 제공하며 각 컨슈머들이 어느지점까지 메세지를 읽었는지 오프셋을 관리한다.
컨트롤러
클러스터의 브로커중 한대가 컨트롤러의 역할을 한다. 컨트롤러는 다음과 같은 역할을 한다.
- 파티션 리더 선출 및 재배치
- 브로커 상태 모니터링 및 관리
- 메타데이터 업데이트 및 일관성 유지
- 토픽 및 파티션 정보
- 브로커 정보
- ISR 상태
- 클러스터 설정
- 파티션 재배치를 통한 부하 분산
토픽
메세지를 발행할 논리적인 기본 그룹 이다. RDB에서 데이터 Row를 테이블에 저장하듯이, 메시지는 토픽에 저장 된다.
파티션
토픽에 저장되는 메세지들은 키값 기준으로 분리되어 저장할 수 있다. 일종의 샤딩 기법을 사용했다고 볼 수 있다. 파티션의 개수는 처리량을 늘리는 것과 깊은 관계가 있다. 하나의 파티션에는 하나의 컨슈머가 붙어 처리할 수 있으므로, 토픽이 20개의 파티션을 통해 메세지들이 나뉘어져 있다면, 20개의 컨슈머가 붙어 병렬적으로 처리할 수 있게 된다.
컨슈머 그룹
파티션이 모여 하나의 토픽이 되듯, 동일한 기능을 하는 컨슈머들이 모여 하나의 컨슈머 그룹을 이룬다. 그리고 토픽의 메세지가 얼마나 소비되었는지에 대한 정보를 컨슈머 그룹 단위로 관리한다.
컨슈머 오프셋
카프카는 전통적인 메세지큐와 다르게 컨슈머가 메세지를 소비했다고 해서 메세지를 삭제하지 않는다. 컨슈머가 어느지점까지 메세지를 가지고 가서 소비했는지를 알기 위해 컨슈머는 자신이 읽은 오프셋을 commit하고, 카프카는 커밋된 컨슈머 오프셋을 토픽으로 관리한다. (__consumer_offsets)
레플리카
다른 분산 시스템과 비슷하게 카프카 또한 토픽 파티션에 대해 레플리카를 지원한다. 하나의 브로커가 모종의 사유로 중단된다면, 다른 브로커에 복제되어있는 레플리카 파티션을 이용해 계속해서 서비스하여 고가용성(HA)을 유지한다.
ISR (In Sync Replica)
앞서 말했던 레플리카 설정으로 한 파티션에 3개의 레플리카를 적용하면, 1개의 리더파티션과 2개의 팔로워파티션으로 구성이 된다. 리더파티션은 프로듀서, 컨슈머와 소통하는 중요한 역할을 한다. 팔로워 파티션은 고가용성을 위해 존재하는 복제본으로, 리더파티션의 메세지를 지속적으로 복제해야 한다.
ISR은 리더파티션의 메세지를 잘 따라잡고 있는 레플리카를 말한다. replicas.lag.time.max.ms 설정 값 주기로 리더는 팔로워에 데이터를 복제 하는지 확인한다. 만약 더 긴 시간동안 팔로워가 데이터를 가져가지 않는다면, 팔로워 파티션에 문제 발생으로 인지하고 ISR그룹에서 제외한다.
ISR그룹의 파티션만이 리더로 선출 될 자격이 있다.
세그먼트
카프카는 메세지들을 파일로써 관리한다. 메세지가 보관된 파일은 하나의 파일로 관리되지 않고, 설정값에 따른 크기로 분할되어 관리된다. 이것을 세그먼트 라고 한다. log.segment.bytes 설정 또는 log.segment.ms 설정 으로 하나의 세그먼트 크기 및 유지를 결정한다. 세그먼트는 파티션마다 별개로 생성되며, 현재 활성화된 세그먼트를 엑티브 세그먼트라 한다. 세그먼트를 관리하는 정책에는 삭제정책과 압축정책이 있다.
삭제정책과 압축정책
카프카는 토픽 데이터가 다른 컨슈머가 가져가더라도 삭제되지 않는다. 데이터 삭제는 세그먼트 단위로 이루어진다.
log.segment.bytes(세그먼트 파일 최대 크기) 또는 log.segment.ms 옵션에 다다르면 파일이 닫힌다.
파일의 삭제는 log.retention.bytes 또는 log.retention.ms 옵션의 설정값이 넘어가면 삭제된다.
닫힌 세그먼트 파일을 삭제하는 간격은 log.retention.check.interval.ms 를 따른다.
또는 삭제하지 않고 압축하여 보관하는 정책을 따를 수 있다.
- 브로커의 log.retention.ms는 브로커 레벨에서의 설정이다.
- 토픽에서 retention.ms는 토픽 레벨에서 설정이고, 브로커 설정보다 우선시 된다.
토픽 삭제 정책
log.cleanup.policy=delete
삭제 정책이 실행되는 시점은 시간 또는 용량이 기준이된다.
log.retention.ms를 통해 토픽 데이터를 유지하는 기간을 설정할 수 있다.
log.retention.bytes는 토픽의 최대 크기를 제어한다. 토픽의 전체 데이터 크기가 retention.bytes를 넘어가면, 가장 오래된 세그먼트 파일부터 삭제된다.
토픽 압축 정책
log.cleanup.policy=compact
zip이나 tar같은 압축이 아니라, 동일한 키에 대해서 오래된 데이터들을 삭제한다는 의미이다.
1이라는 키로 4, 5, 6 데이터가 있다면, 가장 오래된 4, 5가 삭제 된다는 말이다.
압축 정책은 액티브 세그먼트를 제외한 나머지 세그먼트들에 한해서만 데이터를 처리한다.
min.cleanable.dirty.ratio 옵션을 통해 압축정책이 얼마나 자주 실행될지에 대해서도 설정할 수 있다.