본문으로 바로가기

Kafka 학습하기_토픽, 파티션, 레코드

category MQ 2024. 6. 2. 01:04
반응형


[인프런 - 아파치 카프카 애플리케이션 프로그래밍]

 

토픽


카프카에서 데이터를 구분하기 위해 사용되는 단위이다.
토픽은 1개 이상의 파티션을 소유하고 있다.
파티션에는 프로듀서가 보낸 데이터들이 들어가 저장되는데 이 데이터들이 들어가 저장되는데 이 데이터를 레코드라고 부른다.
파티션은 자료구조에서 접하는 큐와 비슷하다.(FIFO)
카프카에서는 레코드를 가져가도 삭제하지 않는다.
여러 컨슈머 그룹들이 토픽의 데이터를 여러번 가져갈수있다.

토픽 생성시 파티션이 배치되는 방법


round-robin 방식으로 리더 파티션들이 생성된다.
리더 파티션이 있는 브로커와 통신하여 데이터를 주고 받으므로 여러 브로커에 골고루 네트워크 통신을 하게 된다.
데이터가 특정 서버와 통신이 집중되는 현상을 막고 선형 확장을 하여 데이터가 많아지더라도 자연스럽게 대응할수 있다.
팔로워 파티션은 리더 파티션이 없는 나머지 브로커에 생성된다.
특정 브로커에 파티션이 몰리는 경우에는 kafka-reassign-partitions.sh 명령으로 파티션을 재분배할 수 있다.

파티션 개수와 컨슈머 개수의 처리량
파티션은 카프카 병렬처리의 핵심으로 그룹으로 묶인 컨슈머들이 레코드를 병렬로 처리할 수 있도록 매칭된다.
컨슈머의 처리량이 한정된 상황에서 많은 레코드를 병렬로 처리하는 가장 좋은 방법은 컨슈머의 개수를 늘려 스케일 아웃하는 것이다.
컨슈머 개수를 늘림과 동시에 파티션 개수도 늘리면 처리량이 증가하는 효과를 볼 수 있다

파티션 개수를 줄이는것은 불가능하다.

레코드

메시지를 담는 가장 작은 크기

 

timestamp, offset, headers, key, value로 구성되어 있다.

 

timestamp
레코드가 프로듀서에서 생성되었을 때 시간 (또는 브로커에 적재된 시간)
offset

프로듀서가 보낸 데이터가 브로커에 저장되었을 때 받는 고유한 번호.

프로듀서가 전송한 레코드가 브로커에 적재될 때 오프셋이 지정된다.
오프셋은 0부터 1씩 증가한다.
컨슈머는 오프셋을 기반으로 처리가 완료된 데이터와 앞으로 처리해야할 데이터로 구분한다.
각 메시지는 파티션별로 고유한 오프셋을 가지므로 컨슈머에서 중복 처리를 방지하기 위한 목적으로도 사용한다.
headers
레코드의 특징을 담는 key/value 저장소
key

데이터를 구분하는 값. 파티셔너는 메시지 키를 토대로 파티션을 지정.

처리하고자 하는 메시지 값의 분류하기 위한 용도로 사용되며 이를 파티셔닝이라 부른다.
파티셔닝에 사용하는 메시지 키는 파티셔너에 따라 토픽의 파티션 번호가 정해진다.
메시지 키는 필수 값이 아니며, 지정하지 않으면 null 처리된다.
value

레코드의 메시지 값은 실질적으로 처리할 데이터가 담기는 공간이다.
메시지 값의 포맷은 제네릭으로 사용자에 의해 지정된다.
브로커에 저장된 레코드의 메시지 값은 어떤 포맷으로 직렬화되어 저장되었는지 알 수 없기 때문에 컨슈머는 미리 역직렬화 포맷을 알고 있어야 한다.

클라이언트 메타데이터


카프카 클라이언트는 통신하고자 하는 리더 파티션의 위치를 알기 위해 데이터를 주고 받기전에 메타데이터를 브로커로부터 전달받는다.
메타데이터는 다음과 같은 옵션을 통해 리프래쉬된다.
metadata.max.age.ms 메타데이터를 강제로 리프래시하는 간격. 기본값은 5분
metadata.max.idle.ms 프로듀서가 유후상태일 경우 메타데이터를 캐시에 유지하는 기간. 특정 토픽으로 데이터를 보낸 이후 지정한 시간이 지나고 나면 강제로 메타데이터를 리프래시. 기본값은 5분

메타데이터 이슈가 발생한 경우
카프카 클라이언트는 반드시 리더 파티션과 통신해야 한다.
메타데이터가 현재의 파티션 상태에 맞게 리프래시되지 않은 상태에서 잘못된 브로커로 데이터를 요청하면 LEADER_NOT_AVAILABLE 익셉션이 발생한다.
클라이언트가 데이터를 요청한 브로커에 리더 파티션이 없는 경우 나타나며 대부분의 경우 메타데이터 리프레시 이슈로 발생한다.
에러가 자주 발생한다면 리프레시 간격을 확인하고 클라이언트가 정상적인 메타데이터를 가지고 있는지 확인해야함.

반응형

'MQ' 카테고리의 다른 글

Kafka 학습하기_컨슈머  (0) 2024.06.05
Kafka 학습하기_프로듀서  (0) 2024.06.04
Kafka 학습하기_브로커와 클러스터  (0) 2024.06.01
Kafka 학습하기_장단점  (0) 2024.06.01
Rabbitmq 이해하기  (0) 2023.05.11