- 카프카 브로커와 클러스터
- 카프카 클러스터와 주키퍼
- 카프카 브로커의 역할들
- 브로커 로그와 세그먼트
- 세그먼트와 삭제 주기 (cleanup.policy)
- 복제 (Replication)
- ISR (In-Sync-Replicas)
- 토픽과 파티션
- 레코드
- 레코드-메시지 값
- 유지보수하기 좋은 토픽 이름 정하기
- 클라이언트 메타데이터와 브로커 통신
- Reference
이 글의 코드 및 정보들은 강의 내용을 바탕으로 작성하였습니다.
카프카 브로커와 클러스터
주키퍼
-
주키퍼는 카프카 클러스터를 운영하기 위해 필요한 어플리케이션이다.
-
카프카 2.x -> 반드시 필요 O
카프카 3.x -> 반드시 필요 X, 하지만 완벽히 대체하지 못하여 아직까진 주키퍼가 있는 게 안전하다.
브로커
- 하나의 서버(=인스턴스)에는 한 개의 카프카 브로커 프로세스가 실행된다.
클러스터
- n개의 브로커를 묶어놓은 형태를 뜻한다.
카프카 클러스터와 주키퍼
- 230917 : 별 내용 X
카프카 브로커의 역할들
컨트롤러, 데이터 삭제
-
시간이나 용량을 기준으로 삭제가 진행된다.
또한 compact 명령어를 사용하여 삭제가 가능하다.
컨슈머 오프셋 저장, 코디네이터
-
__consumer_offsets은 인터널 토픽이라고 부르고
특별히 볼 일도 없고
내부 매커니즘에 의해 자동 생성되어 사용된다.
브로커 로그와 세그먼트
-
브로커는 데이터를 파일 시스템에 저장한다.
-
위에서 말하는 메시지란
프로듀서가 보낸 레코드 1개의 데이터를 뜻하며
레코드라 부르기도 한다.
-
데이터는 1개의 파일에 연속적으로 저장되는 것이 아니라 나뉘어 저장된다.
-
나뉘는 기준은 바이트, 시간 2가지 조건이 있다.
-
해당 조건이 충족되면
프로듀서가 전송하는 데이터는 기존 파일이 아닌 새로운 파일에 적재된다.
-
파일명에 사용되는 번호는 오프셋 번호이다.
( 오프셋 = 레코드의 고유한 번호 )
세그먼트와 삭제 주기 (cleanup.policy)
cleanup.policy = delete
-
액티브가 아닌 세그먼트 단위로 삭제가 이뤄진다.
-
삭제를 하는 방법은 크게 2가지가 있는데 첫 번째 방법은 delete 옵션을 설정하는 것이다.
-
인스턴스의 Disk 크기를 보고 retension 값을 정해야 한다.
ex) Disk 크기는 작은데 retension을 너무 길게 가져가면 안 된다.
cleanup.policy = compact
테일/헤드 영역, 클린/더티 로그
min.cleanable.dirty.ratio
복제 (Replication)
-
카프카의 데이터 복제는 파티션 단위로 이루어진다.
-
토픽 생성 시 파티션의 복제 개수도 같이 설정한다.
-
옵션을 선택하지 않으면 브로커에 설정된 옵션 값을 따라가는데
일반적으로는 2,3으로 설정한다.
-
위 예시는 Replication Factor = 3으로 설정되어 있고
1GB 데이터를 보내면 총 3GB 디스크가 필요하다.
브로커에 장애가 발생할 경우
-
토픽마다 복제 수를 다르게 설정하여 운영한다.
-
데이터 처리 속도가 중요하다면 1 또는 2로 설정하고
금융 정보와 같이 중요한 정보는 복제 수를 높은 값으로 설정한다.
ex) 1로 설정하는 경우는 matrix 데이터
ISR (In-Sync-Replicas)
- 토픽 단위로 설정이 가능하다.
토픽과 파티션
-
토픽은 1개 이상의 파티션으로 구성되어 있다.
-
다양한 목적을 가진 여러 컨슈머 그룹들이 토픽의 데이터를 여러 번 가져갈 수 있다.
토픽 생성 시 파티션이 배치되는 방법
- 라운드 로빈 방식으로 리더 파티션을 생성한다.
특정 브로커에 파티션이 쏠린 현상
파티션 개수와 컨슈머 개수의 처리량
-
2개 파티션을 1개의 컨슈머가 컨슘 하는 건 가능하나
1개의 파티션에 대해 2개의 컨슈머가 컨슘 하는 건 불가능하다.
-
프로듀서가 초당 10개를 펍 하면
파티션의 수는 최소 10개 이상으로 설정한다.
그리고 컨슈머 수도 최소 10개 이상이 되어야 한다.
일반적으로는 초당 10개 펍이 이뤄난다면 20개 정도 여유롭게 설정한다.
파티션 개수를 줄이는 것은 불가능
- KIP-694 = 카프카 운영보수를 위한 지라 티켓
레코드
-
프로듀서는 오프셋과 타임스탬프를 갖고 있지 않고
저 값은 브로커가 레코드 생성 시 설정한다.
레코드-타임스탬프
- 토픽 단위로 설정 가능
레코드-오프셋
레코드-헤더
레코드-메시지 키
-
메시지 키는 필수 값이 아니다.
-
키 값을 지정하지 않으면 null로 세팅되고 라운드 로빈 방식으로 파티션에 매핑된다.
키 값을 지정하면 해쉬값에 의해 특정 파티션에 매핑되어 전달된다.
레코드-메시지 값
유지보수하기 좋은 토픽 이름 정하기
- 개인적으로 가장 앞에 Env를 지정하는 게 좋아보인다.
클라이언트 메타데이터와 브로커 통신