Kafka 를 공부하기 위해 필요한 기본 용어들
이 페이지에서는 Kafka 를 공부하기 위해 필요한 용어들을 정리한다.
이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. ([] 로 표기)
Kafka 를 처음 공부 할 때, 공부해야 할 용어들
[Kafka 를 사용하기 위해 필요한 필수 용어들을 알려줘]
Kafka 에서 사용되는 기본용어들은 아래와 같다.
- 브로커(Broker)
Kafka 서버 한 대를 일컫는다. 메시지를 저장하고 관리하는 역할을 한다. 여러 대의 브로커가 모여 클러스터를 구성하며, 데이터를 분산 저장해 확장성과 내결함성을 제공한다.
- 프로듀서(Producer)
Kafka로 데이터를 보내는 주체이다. 메시지의 생산자 역할을 하며, 애플리케이션이나 서비스가 프로듀서가 되어 브로커에 메시지를 전송한다.
- 컨슈머(Consumer)
Kafka에서 데이터를 읽어가는 주체이다. 메시지의 소비자 역할을 하며, 브로커에서 원하는 토픽의 메시지를 구독하여 가져간다.
- 토픽(Topic)
데이터의 분류 단위이다. 메시지의 카테고리나 주제별로 생성된다. 프로듀서는 특정 토픽에 메시지를 보내고, 컨슈머는 해당 토픽을 구독하여 메시지를 가져간다.
- 파티션(Partition)
토픽을 물리적으로 분할한 단위이다. 하나의 토픽은 여러 파티션으로 구성될 수 있으며, 각 파티션은 여러 브로커에 분산 저장되어 데이터 병렬 처리와 확장성을 높인다.
- 오프셋(Offset)
파티션 내에서 각 메시지의 고유 위치를 나타내는 순차적인 번호이다. 컨슈머는 오프셋을 기준으로 메시지를 읽으며, 어디까지 읽었는지 추적할 수 있다.
- 컨슈머 그룹(Consumer Group)
여러 컨슈머가 하나의 그룹을 이루어 토픽의 파티션을 나누어 병렬로 메시지를 처리하는 구조이다. 하나의 파티션은 한 번에 한 컨슈머 그룹 내의 한 컨슈머에게만 할당된다.
- 주키퍼(Zookeeper)
Kafka 클러스터의 메타데이터와 브로커 상태를 관리하는 분산 코디네이션 서비스이다. 최근에는 주키퍼 없이 동작하는 KRaft 모드가 도입되고 있다.
- 메시지(Message)
Kafka에서 주고받는 데이터의 기본 단위이다. 메시지는 바이트 배열로 구성되며, 키와 값, 그리고 타임스탬프 등의 메타데이터를 가질 수 있다.
이 외에도 클러스터(Cluster), 리플리케이션(Replication), ISR(In-Sync Replica), 배치(Batch) 등 다양한 용어가 있지만, 위 용어들이 Kafka를 이해하고 사용하는 데 기본적으로 꼭 필요한 핵심 개념이다.
위의 용어들과 관련하여 RDBMS 와 비교하여 이해해야 할 사항들 및 기타 추가 내용
필자는 RDBMS 기반으로 DB 공부를 했기에 Kafka 에 대한 이해도를 높이기 위해 RDBMS 내용과 연관 또는 상반된 내용을 결부하여 추가 정리하 필요한 내용을 정리한다.
[위의 내용에서 offset 은 RDBMS 의 rownum 과 비슷한 걸까?]
Kafka의 offset은 RDBMS의 rownum과 일부 유사한 점이 있지만, 완전히 동일한 개념은 아니다.
유사점:
둘 다 데이터의 위치나 순서를 나타내는 숫자다.
RDBMS의 rownum은 쿼리 결과 집합에서 각 행의 순서를 나타내고,
Kafka의 offset은 각 파티션 내에서 메시지의 고유 위치(순번)를 의미한다.
차이점:
rownum은 쿼리 결과 집합이 생성될 때 동적으로 부여되는 번호이며, 데이터베이스 내에서 정렬이나 페이징 등에 주로 사용된다.
offset은 Kafka 파티션에 메시지가 기록될 때 자동으로 증가하는 고유 번호로, 메시지의 영구적인 위치를 나타낸다. 각 파티션마다 0부터 시작하며, 컨슈머가 어디까지 메시지를 읽었는지 추적하는 데 사용된다.
또한, offset은 파티션 단위로 관리되며, 메시지의 순서 보장과 컨슈머의 메시지 처리 위치 추적에 활용된다. 반면 rownum은 일시적인 쿼리 결과에만 적용된다.
"오프셋이란, 각 파티션마다 메시지가 저장되는 위치를 의미한다. 당연히 오프셋 값은 '파티션 내에서' 고유하고, 순차적으로 표기된다. 테이블의 pk (id) 개념과 비슷하다고 볼 수 있다."
따라서, offset은 rownum과 '순서'라는 점에서 비슷하지만, 데이터의 영속성, 사용 목적, 관리 방식 등에서 차이가 있다.
정리하면, Kafka의 offset은 RDBMS의 rownum과 비슷한 역할을 하지만, 완전히 동일한 것은 아니며, 주로 메시지 처리 위치 추적과 데이터 순서 보장에 사용된다.
[Kafka 는 RDBMS 와 다르게 시간순서를 표현 할 수 없어서 offset 을 쓰는걸까?]
Kafka는 RDBMS와 다르게 시간순서를 표현할 수 없어서 offset을 쓰는 것이 아니며, Kafka는 메시지의 순서를 파티션 내에서 offset으로 관리해 순서를 보장한다.
Kafka의 offset은 각 파티션 내에서 메시지의 고유한 위치를 나타내는 연속적인 숫자이며, 이 offset을 통해 소비자는 메시지를 처음부터 끝까지 순서대로 처리할 수 있다.
Kafka는 메시지를 로그 구조로 저장하며, offset은 메시지가 파티션 로그에서 얼마나 떨어져 있는지를 나타내는 값이다.
이 offset 덕분에 Kafka는 소비자가 어디까지 읽었는지 추적하고, 장애 발생 시에도 마지막으로 읽은 위치부터 다시 처리할 수 있다.
Kafka는 파티션 내에서 메시지의 순서를 보장하며, offset이 바로 그 순서를 나타내는 역할을 한다/
RDBMS에서는 rownum이나 timestamp 등으로 순서를 표현하지만, Kafka는 분산 시스템 특성상 여러 파티션에 메시지가 동시에 들어올 수 있으므로, 각 파티션별로 offset을 통해 순서를 관리한다.
즉, Kafka가 offset을 사용하는 이유는 시간순서 표현의 한계 때문이 아니라, 분산 환경에서 효율적이고 신뢰성 있게 메시지 순서와 소비 위치를 관리하기 위해서다.
[Kafka broker 의 기본구조를 그려줘 - Perplexity pro OpenAI engine 사용]
[Zookeeper 는 어디에 위치하는 걸까?]
Zookeeper는 Kafka 브로커와는 별도의 독립적인 서버 또는 서버들의 집합(클러스터)로 구성되며, Kafka 클러스터와 나란히 위치한다. 일반적으로 Kafka 브로커가 여러 대라면, Zookeeper도 여러 대로 구성하여 클러스터 형태로 운영한다. 예를 들어, 3개의 Kafka 브로커가 있다면 3개의 Zookeeper 노드를 함께 구성하는 것이 일반적이다.
Zookeeper는 Kafka 브로커의 메타데이터 관리, 브로커 상태 감시, 클러스터 코디네이션 등 핵심 역할을 담당하며, Kafka 브로커들은 Zookeeper에 접속해 클러스터 정보를 주고받는다. 따라서 Zookeeper는 Kafka 브로커 외부에 별도의 서비스로 존재하며, Kafka 클러스터의 안정적인 동작을 위해 반드시 필요하다.