[Kafka] 1장. 카프카 개요 (도서: 실전 카프카 개발부터 운영까지)

사명기·2022년 6월 15일
0

최근 흥미롭게 읽었던 책인 실전 카프카 개발부터 운영까지 - 고승범을 오늘부터 다시 정리해서 기록해두려고 한다.
중요한 이론과 개인적으로 느낀점을 다룰 예정이며, 실습은 기록하지 않는다.

1장은 카프카가 주요한 특징은 무엇인지, 어떤 곳에서 활용되는지, 버전별로 추가된 주요 기능 등을 가볍게 알아보는 장이었다. 카프카의 등장 배경은 '들어가기'에 나와있으므로 그곳을 읽어보길 추천한다.
그래서 1장은 가볍게 작성하고, 다음장부터 구체적인 구조나 원리에 대해서 얘기할 것이다.
앞으로 작성하는 글에서의 '장'과 하위 '장'(ex.1-1)은 책과 동일하지 않다.

1장. 카프카 개요

1.1 카프카의 주요 특징

높은 처리량과 낮은 지연시간

카프카는 매우 높은 처리량(throughput)과 낮은 지연시간(latency)을 자랑한다.
아래 그림은 카프카, 펄사, 래빗MQ 총 3가지 메시징 시스템을 비교한 자료다.

이 그림을 보면,
처리량은 카프카가 제일 높으며, 지연시간이 제일 낮은 것은 래빗MQ라는 것을 알 수 있다.
하지만 처리량과 응답 속도를 같이 비교했을 때는 카프카가 독보적이다. 이렇게 카프카는 높은 처리량을 바탕으로 다양한 기업들의 요구사항을 만족시켜줄 뿐만 아니라 비교적 낮은 지연시간까지 제공한다.

높은 확장성

위에서 카프카는 높은 처리량이 장점이라고 했지만, 아무리 처리량이 높은 시스템이라 할지라도 그 끝은 존재하기 마련이다. 이러한 문제를 해결하려면 확장이 가능해야하는데, 카프카는 손쉬운 확장이 가능하도록 잘 설계된 애플리케이션이다.

카프카가 손쉬운 확장이 가능하도록 설계된 이유는, 카프카를 만든 링크드인에서 이전에 사용하던 MQ 애플리케이션에서 확장이 어려웠던 문제가 있었기 때문이다.

고가용성

먼저 고가용성이라는 용어의 의미를 알아보자.
고가용성(HA: High Availability)이란, 서버와 네트워크, 프로그램 등의 정보 시스템이 상당히 오랜 기간 동안 지속적으로 정상 운영이 가능한 성질을 말한다. 고가용성을 위해 보통 한 서버나 시스템에 장애가 나더라도 다른 서버가 대체할 수 있도록 이중화를 한다.

카프카 초기 버전에서는 메시지(레코드)를 빠르게 처리하는 것이 목표였으며, 후에 고가용성 측면도 중요시 여기게 되었다. 그래서 카프카는 클러스터 내 리플리케이션(replication) 기능을 추가했고, 이를 통해 카프카 클러스터의 고가용성을 확보했다.

내구성

먼저 내구성이란 스토리지가 안정적으로 데이터를 기억할 수 있는 성질을 말한다.
프로듀서는 카프카로 메시지를 전송할 때, 프로듀서의 acks라는 옵션을 조정하여 메시지의 내구성을 조절할 수 있다. 강력한 메시지의 내구성을 원하면 해당 옵션을 all로 사용하면 된다. 이렇게 프로듀서에 의해 카프카로 전송되는 모든 메시지는 안전한 저장소인 카프카의 로컬 디스크에 저장된다.

전통적인 메시징 시스템의 경우, 컨슈머가 메시지를 가져감과 동시에 저장소에서 삭제된다. 하지만 카프카의 경우에는 컨슈머가 메시지를 가져가더라도, 메시지는 바로 삭제되지 않고 지정된 설정 시간 또는 로그의 크기만큼 로컬 디스크에 보관되므로, 코드의 버그나 장애가 발생하더라도 과거의 메시지를 불러와 처리할 수 있다. 또한 메시지들은 브로커 한 대에만 저장되는 것이 아니라 두 대 또는 세 대의 브로커에 저장되므로, 브로커 중 한 대가 종료되더라도 다른 브로커의 로컬 디스크에 저장된 내용을 바탕으로 복구할 수 있다.

개발 편의성

카프카는 메시지를 전송하는 역할을 하는 프로듀서(producer)와 메시지를 가져오는 역할을 하는 컨슈머(consumer)가 완벽하게 분리되어 동작하고 서로 영향을 주지도 받지도 않는다. 이러한 구성에 따라 프로듀싱을 원하는 개발자는 프로듀서만 개발하면 되고, 컨슈밍을 원하는 개발자는 컨슈머만 개발해 사용하면 된다.

또한 개발 편의성을 제공하기 위해 카프카에서는 카프카 커넥트(Kafka Connect)스키마 레지스트리(Schema Registry) 를 제공한다. 카프카 커넥트는 프로듀서와 컨슈머를 따로 개발하지 않고도 카프카와 연동해 손쉽게 소스와 싱크로 데이터를 보내고 받을 수 있는 별도의 애플리케이션이다. 카프카 레지스트리는 데이터를 파싱하는 데 많은 시간을 소모하는 비효율적인 현실을 보완하고자 스키마를 정의해서 사용할 수 있도록 개발된 애플리케이션이다. 이 두가지는 후에 더 자세히 살펴볼 것이다.

1.2 카프카의 성장

위 그림은 카프카가 출시된 2011년부터 지금까지의 주요 서비스 출시일이다.

리플리케이션 기능 추가(v0.8)

2013년 12월 0.8버전에서 카프카에 리플리케이션 기능을 추가하면서, 앞서 언급한 고가용성(HA) 구성이 가능해졌다. 따라서 브로커의 장애가 발생해도 리클리케이션 기능으로 인해 데이터 유실 없이 안정적으로 사용할 수 있게 되었다.

스키마 레지스트리 공개(v0.8.2)

카프카를 이용하는 사용자들이 늘어나고 규모가 커지면서 Pub/Sub 모델의 한계 같은 비효율적인 문제가 발생한다는 사실을 깨닫게 되었다. 카프카의 데이터 흐름은 대부분 브로드캐스트 방식이라 컨슈머 입장에서는 데이터를 전송하는 프로듀서를 일방적으로 신뢰할 수 밖에 없는 구조다. 이러한 구조로 인해 데이터를 분석하거나 비정형 데이터를 파싱하는 데 많은 시간을 소모하고 있었기에, 이런 문제를 해결하고자 프로듀서와 컨슈머 간에 서로 데이터 구조를 설명할 수 있는 스키마를 등록 지정해 사용하는 스키마 레지스트리가 2015년 2월 0.8.2 버전에 릴리즈되었다.

프로듀서와 컨슈머는 이 스키마 레지스트리를 이용해 스키마를 등록할 수 있고 이를 통해 스키마에 정의된 데이터만 주고받게 된다. 스키마 레지스트리도 추후에 자세히 알아볼 예정이다.

카프카 커넥트 공개(v0.9)

카프카를 연동해야 하는 시스템이 많아지고 다양해졌기 때문에, 클라이언트를 개발하고 유지보수하는 일은 점점 과중해지고 있었다. 이러한 애로사항을 해결하기 위해 2015년 11월 0.9 버전에서 카프카 커넥트(Kafka Connect)를 공개했다. 카프카 커넥트를 이용해 별도의 코드 작성 없이도 다양한 프로토콜과 카프카를 연동할 수 있게 되었다.

카프카 스트림즈 공개(v0.10)

카프카의 장점 중 하나인 높은 처리량, 빠른 응답 속도를 바탕으로 많은 기업에서 실시간 처리에 대한 니즈는 점점 높아져 가고 있었다. 카프카에서는 이러한 실시간 처리에 대한 니즈를 충족시키고자 2016년 5월 버전 0.10을 발표하면 카프카 스트림즈(Kafka Streams) 공개했고, 이 간단하고 가벼운 클라이언트를 이용해 많은 개발자나 기업에서의 실시간 분석, 처리 등이 가능해졌다.

주키퍼 의존성에서의 해방(v3.0)

대부분 지금까지는 카프카의 토픽, 브로커 등을 관리하는 목적으로 분산 코디네이터 시스템인 주키퍼(Zookeeper)를 사용해왔으나 주키퍼는 그건 카프카가 높은 성능을 갖는 데 장벽이 되었다. 카프카의 주키퍼 의존성을 제거하기 위한 노력의 일환으로 2021년 4월 2.8 버전 발표와 함께 처음으로 주키퍼 없이 동작 가능한 카프카가 공개되었다. 그리고 2021년 9월 21일 어파치 카프카 3.0이 릴리즈 되었다. 주키퍼 의존성이 제거된 정식 카프카 버전에 한걸음 더 나아간 것처럼 보이지만, 아직은 실제 운영 환경에서 사용하는 것을 추천하지는 않는다.

아파치 카프카 3.0의 주용 내용을 살펴보면, 카프카의 메시지 포맷 v0, v1 지원 종료 , 자바8과 스칼라 2.12 지원 종료 등 오래된 버전들에 대한 지원을 종료하려는 움직임이 보인다. 또한 주키퍼의 의존성을 제거하면서 새롭게 도입한 합의 프로토콜인 크래프트를 카프카 전반에 적용하려는 양상이 두드러진다.

그뿐만 아니라 프로듀서의 전송 보장에 대해 '중복 없는 전송(멱등성)' 방식을 기본값으로 채택했고, 컨슈머의 session.timeout.ms 기본 값을 늘려 컨슈머의 안정성을 한층 높였다.

1.3 카프카의 사용 사례

카프카를 단순하게 pub/sub 모델로만 활용하는 데 그치지 않고, 데이터 통합, 메시지 버스, 실시간 데이터 처리, 실시간 데이터 분석 등 여러 용도로 카프카와 카프카 커넥트, 스키마 레지스트리 등을 활용하고 있다.
여기에서는 넷플릭스 사례만 볼 것이며, 더 다양한 사례가 궁금하다면 책을 읽어보면 좋을 것 같다.

데이터 파이프라인: 넷플릭스 사례

넷플릭스는 전 세계에 걸쳐 커다란 규모로 데이터를 수집, 통계, 처리, 적재하기 위해 파이프라인들이 연결되어 있어 이러한 파이프라인을 연결해주는 역할로 카프카를 사용하고 있다.

사용자의 넷플릭스 비디오 시청 활동, 유저 인터페이스 사용 빈도, 에러 로그 등의 모든 이벤트는 데이터 파이프라인을 통해 흐르므로, 넷플릭스는 이런 내용을 분석해 사용자의 경험을 예측해 능동적으로 대응할 수 있으며 오류 발생 시에도 실시간으로 대응이 가능하다.

정리

이번 장에서는 카프카의 주요 특징, 주요 버전별 추가된 기능, 사용 사례를 살펴봤다.
다음 장에서는 카프카 기본 개념과 구조에 대해 살펴보도록 한다.




참고 자료

도서: 실전 카프카 개발부터 운영까지 - 고승범

0개의 댓글