Kafka Data Model
카프카는 메세지를 토픽을 통해 구분하며 토픽에 들어오는 메세지를 병렬로 처리하기 위해 파티션을 나눈다. 파티션에서는 메세지의 순서를 보장하기 위해 오프셋으로 메세지를 관리한다.
Topic
카프카에서 데이터를 구분하기 위한 단위
토픽 이름은 249자 미만 영문 숫자 . _ -
를 조합하여 사용 가능
Partition
토픽을 분할한 것
하나의 토픽에 들어오는 메세지를 병렬로 처리하기 위해 파티션을 분할해서 사용한다
다만 병렬로 처리하기 위해 파티션을 분할 했을 때 Round Robbin방식으로 처리하기 때문에 메세지의 순서를 보장할 수 없다
파티션의 증가는 아무때나 가능하지만 파티션을 줄일 수는 없다
파티션을 늘릴 때는 컨슈머가 가져가고 프로듀서가 보내는 서버당 메세지 전송 수와 서버수를 전부 고려한 뒤 파티션의 수를 늘려야한다
카프카에서는 브로커당 약 2000개 정도의 최대 파티션 수를 권장한다
주의사항
- 파일 핸들러 낭비
- 카프카에서는 모든 디렉토리의 파일들에 대해 파일 핸들을 열게 된다
- 각 파티션은 브로커의 디렉토리와 맵핑된다
- 파티션의 수가 많아질 수록 파일 핸들이 많아져 리소스가 낭비된다
- 장애 복구 시간 증가
- 각 파티션마다 리플리케이션이 동작하게 되는데 카프카 클러스터중 하나만 리더이고 나머지는 팔로워가 된다
- 만약 1000개의 파티션의 리더를 맡고있는 브로커가 있는데 이 브로커가 다운되게 되면 1000개의 파티션은 일시적으로 사용 불가가 된다
- 파티션의 리더를 다른 브로커가 있는 곳으로 이동하기 위해 새로운 리더를 선출해야 하는데 이에 소모되는 리소스가 존재하고 그에 따른 시간동안 장애 복구 시간이 늘어나게 된다
Offset
각 파티션마다 메세지가 저장되는 위치를 오프셋이라 한다
오프셋은 파티션 내에서 유니크하고 순차적으로 증가하는 64비트 정수 형태이다
오프셋을 이용해 메세지의 순서를 보장하며 컨슈머는 오프셋의 순서대로만 메세지를 가져갈 수 있다