본문 바로가기

Kafka

Kafka 내부 메커니즘 - 4)스토리지

앞서 Kafka가 요청에 대해 어떻게 쓰고, 읽는지 흐름을 알아 보았다.

그렇다면 실제로 Kafka가 데이터를 어떤식으로 저장하고 있을까? 이 부분에 대해 알아보자

 

카프카의 스토리지 단위

먼저 카프카의 기본적인 스토리지 단위는 파티션이다. 하나의 파티션은 여러 브로커 간에 분할될 수 없다. 따라서 하나의 파티션 크기는 단일 마운트 포인트에 사용 가능한 공간으로 제한된다.

 

카프카 저장공간 설정

카프카를 구성할 때, 파티션이 저장 될 디렉터리 내역을 log.dirs 매개변수에 설정 한다.

(카프카 로그를 저장하는 곳이 아닌 저장공간인 디렉터리를 설정하는 매개변수임을 잊지 말자!! 실제 카프카 에러로그는 log4j.properties파일에 설정되니 참고바란다)

 

스토리지 파악 순서

1) 브로커와 브로커의 디렉터리에 데이터가 저장되는 방법(파티션 할당)

2) 브로커가 파일들을 관리하는 방법과 파일, 인덱스의 형식

3) 로그 압축이 수행되는 방법

 

파티션 할당

토픽을 생성하면 카프카는 제일 먼저 여러 브로커 간에 파티션을 할당하는 방법을 결정하게 된다.

예를 들어 6개의 브로커에, 10개의 토픽을, replication-factor=3으로 파티션을 할당 하게 되면 총 30개의 파티션 레플리카가 6개의 브로커가 고루 할당 되어야 한다.

아래는 파티션을 할당하는 흐름이다

1) 파티션 리플리카 총 30개를 6개의 브로커에 고루 분산 시킨다. 고로 브로커당 5개의 파티션 리플리카를 할당한다

2) 각 파티션의 리플리카는 서로 다른 브로커에 할당 한다

3) 각 브로커의 랙이 서로 다른 랙에 있는 브로커로 할당한다.

위 과정을 통해 파티션과 리플리카의 브로커가 선택되었으면, 새 파티션들에 사용할 디렉터리를 결정해야 한다.

이는 각 파티션마다 독립적으로 수행하면 되고, 각 디렉터리의 파티션 개수를 계산해서 가장 적은 수의 파티션을 갖는 디렉토리에 새 파티션이 추가 하게 된다.

즉, 새로 디스크를 추가하게 되면 당분간은 새 디스크에 파티션이 할당될 것이다.

 

파일 관리(보존 방법)

카프카에서는 retention(보존)은 중요한 개념 중 하나이다. 카프카에서는 토픽별로 retention을 설정하는 방법으로 2가지를 사용한다.

- 보존 기간

- 보존할 데이터의 크기

 

일반적으로 큰 파일에서 특정 메세지를 찾아 제거하는것은 시간이 많이 소요되고 에러가 생길 수 있다. 

이러한 이유로 카프카에서는 각 파티션을 세그먼트(segment)로 나누어 세그먼트를 기준으로 보존 기간 혹은 크기를 설정하게 된다.

기본적으로 각 세그먼트는 최대 1GB의 데이터 또는 1주일 동안 데이터를 보존한다. 카프카 브로커가 파티션에 데이터를 쓸 때 세그먼트의 제한 크기나 보존 기간에 도달하면 해당 파일을 닫고 새로운 세그먼트 파일에 데이터를 쓰게 된다.

 

파일 형식

그렇다면 각 세그먼트는 어떤 내용을 담고 있으며 어떻게 생겼을까?

각 세그먼트는 하나의 데이터 파일로 생성되며, 카프카 메시지와 오프셋들이 저장된다. 그리고 디스크에 수록되는 데이터의 형식은 메시지(프로듀서가 브로커에게 전송하고 이후에 브로커가 컨슈머에게 전송하는)의 형식과 동일하다. 앞의 '읽기 요청'에서 설명했듯이, 카프카는 제로카피(zero-copy) 기법을 사용해 메시지 전송을 최적화 할 수 있다.  즉, 컨슈머에게 메시지를 전송할 때 별도의 버퍼 메모리를 사용하지 않고 디스크에서 바로 네트워크로 전송하며, 프로듀서가 이미 압축해서 전송한 메시지의 압축 해지와 재압출을 하지 않아도 된다.

 

그 외 인덱스, 압축, 압축처리방법 등의 내용이 있으나 카프카의 너무 내부적인 내용인것 같아 일단 넘어가 보기로 한다..