아파치 카프카란?
카프카 브로커 · 클러스터 · 주키퍼
Apache Kafka는 분산형 스트리밍 플랫폼으로, 대량의 데이터를 빠르고 신뢰성 있게 처리할 수 있는 기능을 제공한다. Kafka는 브로커, 클러스터 그리고 주키퍼로 구성된다.
데이터 저장, 전송
데이터 저장: Kafka에서 데이터는 주로 토픽(topic)이라는 단위로 저장된다. 토픽은 데이터 스트림의 카테고리라고도 할 수 있다. 각 토픽은 파티션(partition)으로 나뉘며, 파티션은 순차적으로 레코드(record)를 저장한다. 이때 각 레코드는 고유한 오프셋(offset)을 가진다. 파티션을 이용하여 데이터 저장의 병렬 처리가 가능해진다. 보통 파티션 개수만큼 컨슈머를 생성하여 병렬처리한다.
데이터 전송: Kafka 브로커는 프로듀서(producer)로부터 데이터를 받아 토픽의 해당 파티션에 저장한다. 그리고 컨슈머(consumer)는 브로커에서 데이터를 읽는다. 데이터는 프로듀서에서 브로커로, 브로커에서 컨슈머로 전송된다. 이때 데이터의 전송은 기본적으로 비동기 방식으로 처리되어 높은 처리량을 유지한다.
데이터 복제, 싱크
데이터 복제: Kafka는 데이터의 신뢰성을 높이기 위해 데이터 복제를 지원한다. 각 파티션은 리더(leader)와 팔로워(follower) 복제본을 갖는다. 프로듀서는 리더에게 데이터를 전송하고, 리더는 팔로워들에게 데이터를 복제한다. 이러한 복제 메커니즘을 통해 특정 브로커가 장애를 겪더라도 다른 브로커에서 데이터를 손실 없이 사용할 수 있다.
싱크: Kafka는 다양한 외부 시스템과의 데이터 싱크를 지원한다. Kafka Connect를 사용하면 데이터베이스, 파일 시스템, 클라우드 스토리지 등 여러 외부 시스템과 쉽게 데이터를 주고받을 수 있다. 이는 Kafka를 중심으로 데이터 파이프라인을 구성하는데 유용하다.
컨트롤러(controller)
Kafka 클러스터 내에서 컨트롤러는 중요한 역할을 담당한다. 컨트롤러는 주키퍼를 통해 정해지며, 주로 다음과 같은 작업을 수행한다.
- 파티션 리더 선정
- 브로커 추가/제거 시 클러스터 재구성
- 데이터 복제 상태 모니터링 및 관리
컨트롤러는 Kafka 클러스터의 전반적인 상태를 관리하고, 클러스터가 안정적으로 동작하도록 돕는다.
데이터 삭제
Kafka에서 데이터 삭제는 주로 두 가지 방법으로 이루어진다.
- 로그 보관 주기(log retention period): 설정된 기간이 지나면 오래된 데이터는 자동으로 삭제
- 로그 세그먼트 크기(log segment size): 설정된 크기를 초과하는 데이터 세그먼트는 삭제
이러한 메커니즘을 통해 Kafka는 저장 공간을 효율적으로 관리하며, 필요한 데이터만 보관할 수 있다.
컨슈머 오프셋 저장
Kafka에서는 각 컨슈머 그룹이 데이터를 어디까지 읽었는지 추적하기 위해 오프셋(offset)을 저장한다. 이 오프셋은 주키퍼 또는 Kafka 자체의 내부 토픽(__consumer_offsets)에 저장된다. 이를 통해 컨슈머는 데이터 처리 중단 후에도 이어서 데이터를 읽을 수 있다.
코디네이터(coordinator)
Kafka의 코디네이터는 주로 컨슈머 그룹의 관리를 담당한다. 각 컨슈머 그룹은 하나의 코디네이터를 가지며 코디네이터의 역할은 다음과 같다.
- 컨슈머 그룹 멤버십 관리 (새로운 컨슈머 추가/제거)
- 파티션 할당 및 재할당
- 오프셋 커밋 관리
코디네이터는 컨슈머 그룹이 효율적으로 동작할 수 있도록 돕고, 데이터를 안정적으로 처리할 수 있도록 한다.