
위 그림은 Kafka의 가장 단순하고 핵심적인 구조를 보여준다.
Producer들이 데이터를 보내면, Kafka Cluster 내부의 여러 Broker가 이를 받아 저장하고, Consumer들은 저장된 데이터를 가져가는 형태다.
카프카를 깊게 이해하는 첫 단계는 이 단순한 그림 뒤에서 메시지가 실제로 어떻게 저장되고 관리되는지를 정확히 파악하는 것이다. 카프카는 메시지를 일시적으로 전달하는 단순 큐가 아니다.
내부적으로는 분산 로그 저장 시스템이며, 메시지를 디스크에 효율적으로 저장하고 복제하는 구조를 기반으로 높은 처리량, 안정성, 확장성을 제공한다.
이 글에서는 Topic, Partition, Broker 같은 기본 요소부터 Partition 내부의 Segment·Index 파일 구조, 메시지가 저장되는 흐름, Leader–Follower 복제 구조까지 핵심 동작 원리를 체계적으로 정리한다.
Kafka에서 데이터는 Topic 단위로 관리되며, Topic은 단지 이름만 존재하는 논리적 구분이다.
실제 메시지가 저장되는 물리적 단위는 Partition이다.
Topic은 Partition을 여러 개 가질 수 있고, Partition은 Broker 여러 대에 분산 저장된다.
이 덕분에 카프카는 메시지 처리량을 물리적으로 확장할 수 있는 구조를 갖는다.

그림으로 다시보자.
브로커는 하나의 Kafka 서버를 의미하며, 그 안에는 Topic이라는 논리적 이름 공간이 구성된다.
Topic은 실제 데이터를 저장하는 단위가 아니며, 내부적으로 여러 개의 Partition으로 나뉘어 있다.
이 Partition이 바로 메시지가 순차적으로 기록되는 물리적 저장 단위이며, 각 파티션은 브로커의 디스크에 실제 파일 형태로 저장되고 관리된다.
Partition은 내부적으로 append-only 구조의 로그다.
즉, 새로운 메시지가 오면 기존 데이터를 수정하거나 끼워넣지 않고 무조건 파일 끝에 추가된다.
이 방식은 다음과 같은 장점을 제공한다.
카프카의 성능은 결국 처음 설계된 저장 방식에서 나온다.

그림으로 다시 보자.
Producer가 보낸 메시지가 Kafka Broker 내부의 Partition에 offset 순서대로 차곡차곡 append되는 과정을 보여준다.
새로운 메시지는 항상 Partition의 가장 끝(offset 4) 에 추가되며, Consumer는 이 로그 스트림을 offset 순서대로 읽어 간다. 즉, Kafka Partition이 append-only 로그로 동작하며 순서를 강하게 보장하는 구조임을 설명한다.
Partition을 하나의 큰 파일로 운영하면 관리가 어렵다.
그래서 카프카는 Partition을 여러 Segment 파일로 나누어 저장한다.
예를 들어 segment size가 1GB라면,
Partition이 커질 때마다 다음과 같은 파일이 생성된다:
00000000000000000000.log
00000000000000000000.index
00000000000000000000.timeindex
00000000000001000000.log
00000000000001000000.index
...
Segment를 나누는 이유는 크게 두 가지다:

그림으로 다시보자.
Kafka는 .timeindex → .index → .log 순서로 매핑된 구조를 이용해 timestamp 기반 탐색을 내부적으로 수행한다.
즉, 특정 시각 이후의 메시지를 찾을 때는 timeindex에서 offset을 찾고, index에서 해당 offset의 byte 위치를 확인한 뒤, log 파일의 해당 위치로 바로 jump하는 방식이다.
하지만 일반적인 메시지 소비는 timestamp가 아니라 offset을 기준으로 이루어진다.
예를 들어 offset=100까지 읽었다면, 파일 포인터는 이미 그 위치에 있으며,
그 다음 메시지는 자연스럽게 바로 뒤에 있는 offset=101을 순차적으로 읽는 구조다.
Producer가 메시지를 전송하면 Broker는 다음 순서로 저장한다.
Producer는 Leader broker로 요청을 보낸다.
Broker는 메시지를 직접 파일에 바로 쓰지 않고 OS 파일 시스템 캐시를 활용한다.
이 덕분에 디스크 I/O를 최소화하면서도 높은 처리량을 유지할 수 있다.
Append-only 구조이므로 파일 끝에 바로 추가하면 된다.
Broker 자체가 디스크를 직접 “sync write” 하는 것이 아니다.
대부분 OS의 write-back 캐시 메커니즘을 활용한다.
Follower는 다음과 같은 흐름으로 Leader의 메시지를 동기화한다:
이 구조는 카프카가 높은 성능과 안정성을 동시에 유지하는 핵심이다.

그림으로 다시보자.
Replication Factor = 3
환경에서 하나의 파티션이 3개의 브로커(Leader 1개, Follower 2개)에 복제되는 구조를 보여준다.
Producer는 오직 Leader 브로커에만 메시지를 쓰고, Followers는 Leader에서 새로운 데이터를 읽어와 동일한 파티션 내용을 복제한다.
Consumer는 Leader(또는 설정에 따라 Follower)에서 메시지를 읽어가며, 세 브로커는 항상 동일한 offset의 동일한 데이터를 유지한다.

그림으로 다시보자.
사용자가 파일을 읽으려고 하면 커널이 먼저 PageCache에 해당 데이터가 있는지 확인하는 구조를 보여준다.
PageCache에 없으면(Miss) 커널은 디스크에서 데이터를 읽어 PageCache에 저장하고, 그 데이터를 사용자에게 반환한다.
즉, 이 그림은 디스크 읽기 요청이 PageCache를 통해 최적화되는 OS의 기본 동작 방식을 설명한다.
Partition은 여러 개의 복제본(replica)을 가질 수 있는데, 그중 하나는 Leader이고 나머지는 Follower다.
Kafka의 replication은 push 방식이 아니라 pull 방식이다.
즉, Follower가 Leader에게 접근해 필요한 메시지를 직접 가져가는 구조다.
이 방식은 장애 상황에서도 Replica 간 비동기 동작을 유지하며 확장성을 가지게 한다.
카프카의 성능 구조는 단순히 클러스터 구조 때문이 아니라
저장 방식 자체가 고성능을 만들어내는 구조이기 때문이다.
이 모든 요소가 결합되어 디스크 기반 로그 시스템임에도
메모리 기반 메시지 시스템 수준의 높은 처리량을 낼 수 있다.
Kafka 기본 구조의 핵심은 다음과 같다:
이 저장 구조를 이해하면 다음 단계인 Offset, Consumer Group, Replication, ACK, Retention 등의 개념이 자연스럽게 연결된다.