-
02. 카프카 아키텍처(Kafka Architecture)BackEnd/kafka 2021. 10. 30. 18:00반응형
주키퍼(Zookeeper)
주키퍼는 카프카의 메타데이터를 관리하는 데 사용됩니다. 카프카 브로커에 대한 정보를 확인할 수 있습니다(어떤 보안 규칙으로 통신하는지, jmx port 상태 정보, host 정보 등). 또한 컨트롤러 역할을 하는 브로커 및 저장된 토픽들을 확인할 수 있습니다. 주키퍼 쉘 명령어를 통해 사용할 수 있는 내부 명령어들에 대한 설명은 주키퍼 공식 문서 홈페이지에서 확인할 수 있습니다.
브로커(Broker)
카프카 브로커는 카프카 서버라고도 하며 카프카 클라이언트와 데이터를 주고받기 위해 사용하는 주체이자, 데이터를 분산 저장하여 장애가 발생하더라도 안전하게 사용할 수 있도록 도와주는 애플리케이션입니다. 하나의 서버에는 한 개의 카프카 브로커 프로세스가 실행됩니다. 데이터를 안전하게 보관하고 처리하기 위해 3대 이상의 브로커 서버를 1개의 클러스터로 묶어서 운영하는 것을 권장합니다.
토픽(Topic)과 파티션(Partition)
토픽은 카프카에서 데이터를 구분하기 위해 사용하는 단위입니다. 토픽은 1개 이상의 파티션을 소유하며, 파티션에는 프로듀서가 보낸 데이터들이 저장되는데 이 데이터를 '레코드(record)'라 부릅니다.
레코드(Record)
레코드는 타임스탬프, 메시지 키, 메시지 값, 오프셋, 헤더로 구성되어 있습니다. 프로듀서가 생성한 레코드가 브로커로 전송되면 오프셋과 타임스탬프가 지정되어 저장됩니다. 브로커에 한 번 적재된 레코드는 수정할 수 없고 로그 리텐션 기간 또는 용량에 따라서만 삭제됩니다.
타임스탬프(Timestamp)
프로듀서에서 해당 레코드가 생성된 시점(CreateTime)의 유닉스 타임이 설정됩니다. 프로듀서가 레코드를 생성할 때 임의의 타임스탬프 값을 설정할 수 있고, 토픽 설정에 따라 브로커에 적재된 시간(LogAppendTime)으로 설정될 수 있다는 점을 유의해야 합니다.
메시지 키(Key)
메시지 값을 순서대로 처리하거나 메시지 값의 종류를 나타내기 위해 사용합니다. 메시지 키를 사용하면 프로듀서가 토픽에 레코드를 전송할 때 메시지 키의 해시값을 토대로 파티션을 지정하게 됩니다. 다만 어느 파티션에 지정될지 알 수 없고 파티션 개수가 변경되면 메시지 키와 파티션 매칭이 달라지게 되므로 주의해야 합니다. 메시지 키를 선언하지 않으면 null로 설정되며 프로듀서 기본 설정 파티셔너에 따라 파티션에 분배되어 적재됩니다.
메시지 값(Value)
실질적으로 처리할 데이터가 들어갑니다. 메시지 키와 값은 직렬화되어 브로커로 전송되기 때문에 컨슈머가 이용할 때는 직렬화한 형태와 동일한 형태로 역직렬화를 수행해야 합니다.
오프셋(Offset)
0 이상의 숫자로 이루어져 있습니다. 오프셋은 직접 지정할 수 없고 브로커에 저장될 때 이전에 전송된 레코드의 오프셋 +1 값으로 생성됩니다. 컨슈머가 데이터를 가져갈 때 사용됩니다.
헤더(Header)
레코드의 추가적인 정보를 담는 메타데이터 저장소 용도로 사용합니다. 헤더는 키/값 형태로 데이터를 추가하여 레코드의 속성(스키마 버전 등)을 저장하여 컨슈머에서 참조할 수 있습니다.
카프카 브로커 역할
1. 데이터 저장, 전송
프로듀서로부터 데이터를 전달받으면 카프카 브로커는 프로듀서가 요청한 토픽의 파티션에 데이터를 저장하고 컨슈머가 데이터를 요청하면 파티션에 저장된 데이터를 전달합니다.
2. 데이터 복제, 싱크
카프카의 데이터 복제는 파티션 단위로 이루어집니다. 토픽을 생성할 때 파티션의 복제 개수(replication factor)도 같이 설정되는데 직접 옵션을 선택하지 않으면 브로커에 설정된 옵션 값을 따라갑니다. 복제된 파티션은 프로듀서 또는 컨슈머와 직접 통신하는 리더(leader)와 나머지 복제 데이터를 가지고 있는 팔로워(follower)로 구성됩니다.
3. 컨트롤러(controller)
클러스터의 다수 브로커 중 한 대가 컨트롤러의 역할을 합니다. 컨트롤러는 다른 브로커들의 상태를 체크하고 브로커가 클러스터에서 빠지는 경우 해당 브로커에 존재하는 리더 파티션을 재분배합니다. 만약 컨트롤러 역할을 하는 브로커에 장애가 생기면 다른 브로커가 컨트롤러 역할을 합니다.
4. 데이터 삭제
카프카는 다른 메시징 플랫폼과 다르게 컨슈머가 데이터를 가져가더라도 토픽의 데이터는 삭제되지 않습니다. 또한, 컨슈머나 프로듀서가 데이터 삭제를 요청할 수도 없습니다. 오직 브로커만이 데이터를 삭제할 수 있습니다. 데이터 삭제는 파일 단위로 이루어지는데 이 단위를 '로그 세그먼트(log segment)'라고 부릅니다.
5. 컨슈머 오프셋 저장
컨슈머 그룹은 토픽이 특정 파티션으로부터 데이터를 가져가서 처리하고 이 파티션의 어느 레코드까지 가져갔는지 확인하기 위해 오프셋을 커밋합니다. 커밋한 오프셋은 __consumer_offsets 토픽에 저장합니다.
6. 코디네이터(coordinator)
클러스터의 다수 브로커 중 한 대는 코디네이터의 역할을 수행합니다. 코디네이터는 컨슈머 그룹의 상태를 체크하고 파티션을 컨슈머와 매칭되도록 분배하는 역할을 합니다. 컨슈머가 컨슈머 그룹에서 빠지면 매칭되지 않은 파티션을 정상 동작하는 컨슈머로 할당하여 끊임없이 데이터가 처리되도록 도와줍니다. 이렇게 파티션을 컨슈머로 재할당하는 과정을 '리밸런스(rebalance)'라고 부릅니다.
토픽 이름 제약 조건
카프카는 토픽 이름 변경을 지원하지 않습니다.
- 빈 문자열 토픽 이름은 지원하지 않는다.
- 토픽 이름은 마침표 하나(.) 또는 마침표 둘(..)로 생성될 수 없다.
- 토픽 이름의 길이는 249자 미만으로 생성되어야 한다.
- 토픽 이름은 영어 대소문자와 숫자 0~9 그리고 마침표(.), 언더바(__), 하이픈(-) 조합으로 생성할 수 있다. 이외의 문자열이 포함된 토픽 이름은 생성 불가하다.
- 카프카 내부 로직 관리 목적으로 사용되는 2개 토픽(__consumer_offsets, __transaction_state)과 동일한 이름으로 생성 불가능하다.
- 카프카 내부적으로 사용하는 로직 때문에 토픽 이름에 마침표(.)와 언더바(_)가 동시에 들어가면 안 된다. 생성은 할 수 있지만 사용 시 이슈가 발생할 수 있기 때문에 마침표(.)와 언더바(_)가 들어간 토픽 이름을 사용하면 WARNING 메시지가 발생한다.
- 이미 생성된 토픽 이름의 마침표(.)를 언더바(_)로 바꾸거나 언더바(_)를 마침표(.)로 바꾼 경우 신규 토픽 이름과 동일하다면 생성할 수 없다. 예를 들어, to.pic 이름의 토픽이 생성되어 있다면 to_pic 이름의 토픽을 생성할 수 없다.
반응형'BackEnd > kafka' 카테고리의 다른 글
06. 카프카 클라이언트(Kafka Client with JAVA) (0) 2021.11.05 05. 카프카 컨슈머(Kafka Consumer) (1) 2021.11.04 04. 카프카 프로듀서(Kafka Producer) (0) 2021.11.02 03. 토픽(Topic)과 파티션(Partition) (0) 2021.11.02 01. 카프카(Kafka) (0) 2021.10.30