Kafka 데이터 영속화
카프카는 아래 요건을 충족 시키기 위해 브로커에 보낸 메시지를 디스크에 영속화하고 있다.
- 임의의 타이밍에 데이터를 읽는다.
- 메시지를 잃지 않는다. (단, 고장에 의한 최근 메시지 손실 회피 목적은 아님)
메시지 큐에서도 데이터 영속화를 실시하는 제품이 있지만 실시간 접속에만 중점을 두고 있는 경우가 많으며 기본적으로 장기 보존을 가정하지 않는다. 배치 처리의 경우에는 데이터를 일정 기간마다 모아야 할 필요가 있기 때문에 데이터를 메모리에서만 유지하는 것은 용량 면에서 불가능하다. 따라서 카프카의 메시지 영속화는 디스크에서 이루어진다. 카프카는 디스크에 영속화함에도 불구하고 높은 처리량을 제공
한다는 특징이 있다.
또한 속속 들어오는 데이터를 받아들이면서 한 묶음으로 장기 보존을 목적으로 영속화할 수 있기 때문에 카프카를 스토리지 시스템
으로도 간주할 수 있다. 이러한 특징을 활용하는 예로는 처리 순서대로 로그를 계속 남기는 커밋 로그를 축적하기 위한 스토리지 위한 스토리지 시스템 등을 들 수 있다.
카프카에서 영속화 목적
일반적으로 데이터 영속화라고 하면 데이터를 잃지 않는, 즉 데이터 자체에 대한 내장애성 향상을 위한 수단으로 여기는 경우가 많다고 생각한다. 하지만 카프카에서는 브로커의 메모리에 실리면 송신 완료(메모리에서 디스크로의 flush는 OS에게 맡김)
라는 사상을 가지고 있기 때문에, 카프카에 있어서 데이터 영속화는 반드시 내장애성을 의식한 것은 아니라고 이해할 수 있다. 카프카는 단일 브로커의 고장이 발생하더라도 즉시 데이터 손실로 이어지지 않도록 복제 구조를 갖추고 있다. 따라서 브로커 내에서의 최근 데이터 손실 방지는 메시지의 복제로 구현한다고 파악하는 것이 자연스럽다. 적어도 몇 개의 복제본이 브로커 내에 존재하고 있다며 그 메시지를 컨슈머에서 사용 가능하도록 설정할 수 있다.
참고로 디스크로의 flush 간격을 OS에 완전히 맡기지 않고 카프카 파라미터로 지정하는 기능도 있다. 내장애성을 어디까지 요구할지는 사용 용도에 강하게 의존하기 때문에 이 부분 설정은 사용자의 요구에 유연하게 대응하도록 되어 있다.