컴퓨터/아파치 카프카

3. 카프카 기본 개념 설명

sidedoor 2024. 9. 17. 13:26

카프카 브로커는 데이터를 주고 받기 위해 사용하는 주체이자 데이터를 분산해 문제가 생겨도 안전하게 해주는 애플리케이션이다.

프로듀서로 부터 데이터를 전달 받으면 카프카 브로커는 토픽의 파티션에 데이터를 저장하고 컨슈머가 요청할 때 파티션에서 저장된 데이터를 전달한다.

 

카프카는 저장을 할 때 파일시스템에 저장을 하지만 페이지 캐시를 사용해 입출력 속도를 높였다.

하지만 이렇게 하기 위해서 힙 메모리 사이즈를 크게 설정해야한다.

 

데이터복제

데이터 복제는 데이터를 안전하게 사용하기 위해서 사용하는 것으로 파티션 단위로 이뤄진다.

복제된 파티션은 리더와 팔로워가 있는데 프로듀서와 컨슈머와 직접 통신하는 것을 리더라고 하고 나머지를 다 팔로워라고 한다.

이때 리더가 장애가 발생하면 나머지 팔로워 중에 하나가 리더 지위를 넘겨받아 데이터를 주고 받도록 동작을 한다.

 

컨트롤러

클러스터의 브로커중 한 대가 컨트롤러의 역할을 하는데 이는 문제가 생겼을 때 리더 파티션을 재분배한다.

 

데이터 삭제

컨슈머가 데이터를 가져가도 삭제가 되지 않고 오직 브로커만 데이터를 삭제할 수 있다.

이때 특정 데이터만 선별해서 삭제할 수 없고 파일 단위로 삭제를 한다.

 

코디네이터

클러스터의 브로커 중 한대가 수행하는 것으로 컨슈머 그룹의 상태를 체크하고 파티션을 컨슈머와 매칭되도록 분배하는 역할을 한다.

만약 컨슈머가 빠지게 되면 매칭되지 않은 파티션을 정상 동작하는 컨슈머로 할당하여 끊임없이 데이터가 처리되도록 해준다.

 

주키퍼

주키퍼는 카프카의 메타데이터를 관리하는데 사용된다.

토픽과 파티션

토픽은 데이터를 구분하기 위해서 사용하는 단위로 1개 이상의 파티션을 소유하고 있다.

파티션에는 프로듀서가 보낸 데이터가 저장되는데 이때의 데이터를 레코드라고 한다.

프로듀서가 전송한 레코드가 파티션에 저장

파티션을 통해 컨슈머가 레코드를 병렬로 처리할 수 있게 하는데 스케일 아웃을 통해 컨슈머의 수를 늘려 처리량을 키울 수 있다.

레코드

프로듀서가 생성한 레코드가 브로커에 전송되면 오프셋과 타임스탬프가 지정되어 저장된다.

 

 - 타임스탬프

프로듀서에서 해당 레코드가 생성된 시점의 시간이다.

 - 메시지 키

메시지 값을 순서대로 처리하거나 종류를 나태내기 위해서 사용하는것으로 토픽에 레코드를 전송할 때 메시지 키의 해시값을 토대로 파티션에 저장을 한다.

 - 메시지 값

실질적으로 처리할 데이터로 직렬화 역직렬화를 할 때 동일한 형태로 처리를 해야한다.

 - 오프셋

0이상의 숫자로 브로커에 저장될 때 이전에 전송된 레코드의 오프셋  + 1 의 값으로 생성된다.

 - 헤더

레코드의 추가적인 정보를 담는것으로 메타데이터 자장소 용도로 사용한다.

카프카 클라이언트

프로듀서 api

프로듀서는 데이터를 직렬화 하여 카프카 브로커로 보내기 때문에 직렬화는 자바 또는 외부 시스템에서 사용가능하도록 바이트 형태로 데이터를 변환한다.

따라서 자바에서 선언 가능한 모든 형태를 브로커로 전송할 수 있다.

 

프로듀서의 중요 개념

프로듀서는 카프카 브로커로 데이터를 전송할 때 내부저긍로 파티셔너 배치 생성단계를 거친다.

전송할 데이터는 ProducerRecord클래스를 통해 인스턴스 생성할때 필수로 토픽과 메시지 값을 설정해야한다.

추가로 오버로딩을 통해 파티션 번호, 타임스탬프, 메시지 키를 설정할 수 있다.

그리고 send()를 통해 토픽이 어느 파티션으로 전송될지 정해진다.

 

커스텀 파티셔너를 가지는 프로듀서

특정 데이터를 가지는 레코드를 특정 파티션으로 보내야 할 때가 있다.

기본 설정 파티셔너를 사용할 경우 메시지 키의 해시값을 통해 어느 파티션으로 갔는지 알 수 없다.

이때 사용자 정의 파티셔너를 생성하면 메시지 키에 대해서 무조건 파티션 0번으로 지정하도록 설정할 수 있다.

 

컨슈머 api

프로듀서가 전송한 데이터는 카프카 브로커에 적재되는데 컨슈머는 이를 사용하기 위해서 이를 가져와 필요한 처리를 한다.

 

컨슈머의 중요 개념

토픽의 파티션으로 데이터를 가져가기 위해서 1개 이상의 컨슈머로 이루어진 컨슈머 그룹을 운영하거나, 토픽의 특정 파티션만 구독하는 컨슈머를 운영해야한다.

컨슈머를 그룹으로 운영하는 방법은 토픽의 1개 이상 파티션들에 할당되어 데이터를 가져갈 수 있다.

이때 컨슈머의 개수가 가져가고자 하는 토픽의 파티션 수보다 많다면 파티션에 할당이 되지 않은 컨슈머는 스레드만 차지하고 불필요하게 남게 된다.

컨슈머 1개인 경우

컨슈머 그룹은 다른 컨슈머 그룹과 격리되어 서로 영향을 받지 않게 처리할 수 있다.

따라서 다른 저장소에 저장하는 컨슈머를 다른 컨슈머 그룹으로 묶어서 저장소의 장애에 격리되어 운영할 수 있게 하였다.

이때 컨슈머 그룹의 컨슈머에 장애가 생기면 할당된 파티션은 장애가 발생하지 않는 컨슈머에게 소유권이 넘어가는 리밸런싱이 발생한다.

 

컨슈머는 브로커로부터 데이터를 어디까지 가져갔는지 커밋을 통해 기록하여 이슈가 발생했을 때 데이터 처리의 중복 없이 처리할 수 있다.

 

어드민 api

내부 옵션을 확인하는 방법으로 브로커 중 한 대에 접속하여 브로커 옵션을 확인하면 되지만 이는 매우 번거롭다.

이를 위해 카프카 클라이언트는 adminclient를 통해 내부 옵션을 설정하거나 조회할 수 있게 하였다.