Kafka Broker
Last updated
Last updated
카프카 클라이언트와 데이터를 주고받기 위해 필요하며 데이터를 분산 저장하여 장애 발생 시에도 안전하게 사용할 수 있도록 하는 프로세스이다.
하나의 서버에 한 개의 카프카 브로커 프로세스를 실행할 수 있다.
프로듀서로부터 데이터를 받으면 토픽의 파티션에 데이터를 저장하고, 컨슈머로부터 요청 받으면 파티션에 저장된 데이터를 전달한다.
데이터 저장 시 메모리, 데이터베이스, 캐시를 사용하는 대신 페이지 캐시와 파일 시스템을 사용해 안전하고 빠르게 데이터에 접근할 수 있다.
데이터 복제는 파티션 단위로 이루어지며, 토픽 생성 시 파티션의 복제 개수를 지정할 수 있다.
프로듀서, 컨슈머와 직접 통신하는 파티션을 리더라고 하고, 복제 데이터를 가지는 나머지 파티션들을 팔로워라고 부른다.
팔로워 파티션들은 리더 파티션의 오프셋과 현재 자신이 가지는 오프셋을 비교하여 차이가 나는 경우 리더 파티션의 데이터를 가져와서 저장한다.
클러스터에 속하는 브로커 중 하나는 컨트롤러 역할을 담당한다.
다른 브로커들의 상태를 확인하고 브로커가 클러스터에서 빠지는 경우 해당 브로커에 존재하는 리더 파티션을 재분배한다.
컨트롤러 역할을 하는 브로커에 장애가 생기면 다른 브로커가 컨트롤러 역할을 한다.
컨슈머나 프로듀서는 직접 데이터를 삭제할 수 없으며 브로커에 삭제 요청을 보내야 한다.
데이터 삭제는 로그 세그먼트라는 파일 단위로 이루어지며, 세그먼트에는 다수의 데이터가 들어있어 특정 데이터를 선별해 삭제할 수 없다.
따라서 세그먼트 단위의 용량과 유지 기간에 대한 옵션을 신중히 설정해야 한다. 세그먼트 파일 용량을 작게 줄이면 데이터를 저장하는 동안 자주 새롭게 열고닫기 때문에 부하가 발생할 수 있다.
데이터를 삭제하지 않고 메시지 키를 기준으로 오래된 데이터를 압축할 수도 있다.
컨슈머 오프셋이란 토픽이 특정 파티션으로부터 데이터를 가져가 처리할 때 어느 레코드까지 가져갔는지 확인하기 위해 커밋하는 값이다. 오프셋을 커밋하면 __consumer_offsets 토픽에 저장된다.
컨슈머들은 이 오프셋을 기반으로 하여 다음 레코드를 조회한다.
클러스터에 속하는 브로커 중 하나는 코디네이터 역할을 한다.
컨슈머 그룹의 상태를 체크하고 파티션을 컨슈머와 매칭되도록 분배한다.
만약 컨슈머가 그룹에서 빠질 경우 매칭이 해제된 파티션을 다른 컨슈머에 재할당하는 리밸런스 기능을 제공한다.