Post
EN

카프카 디자인

링크드인은 활동 스트림 데이터, CPU, I/O 사용율 같은 운영 메트릭과 요청 시간 등을 모니터링하는 요구조건을 JMS와 JMS의 여러 구현체로 해결하려 했으나, JMX의 오버해드와 JMX 아키텍처상의 확장 제약 때문에 카프카를 만들기로 했다.

  • 카프카의 주요 토대는 메시지를 파일 시스템에 저장하고 캐싱(cache)하는 것이다. 데이터는 즉시 OS 커널 페이지에 쓴다. 데이터를 디스크에 캐시하고 flush 하는 것은 설정할 수 있다.

  • 카프카는 필요에 따라 메시지 소비 후 다시 메시지를 소비할 수 있게 메시지의 장기 보관을 지원한다.

  • 카프카는 네트워크 부하를 줄이기 위해 메시지를 그룹으로 묶는 메시지 집합을 사용한다.

  • 메시지 소비에 대한 메타정보가 서버에 저장되는 대부분의 메시지 시스템과 다르게 카프카는 소비자 레벨에서 소비된 메시지의 상태를 가지고 있다. 그러므로 다음과 같은 이슈를 해결할 수 있다.

    • 실패에 따른 메시지 유실

    • 단일 메시지의 복수 전달

  • 기본 설정으로 소비자는 상태를 주키퍼에 저장한다. 또한 카프카는 온라인 트랜젝션 처리 애플리케이션으로 사용하는 다른 스토리지 시스템에 저장할 수 있다.

  • 카프카에서 생산자 소비자는 통상적인 Push-and-Pull 모델 방식으로 동작한다. 생산자가 메시지를 카프카 브로커로 밀어 넣으면 소비자는 브로커로부터 메시지를 끌어온다.

  • 카프카에서 마스터 개념은 없고 모든 브로커를 피어로 다룬다는 점과 브로커 메타데이터를 주키퍼에 보관하고 생산자와 소비자에 공유한다는 점 때문에 카프카 브로커를 언제든지 제거 또는 추가하기 쉽다.

  • 카프카 0.7.x에는 주키퍼 기반의 부하 분한 (load balancing)을 통해 생산자가 브로커를 동적으로 찾는다.

생산자는 브로커 접속 풀을 유지하고 주키퍼 와처 콜백을 사용해 계속 업데이트한다. 그러나 카프카 0.8.x 버전에서는 카프카 메타데이터 API를 사용하고 주키퍼는 이용 가능한 브로커 리스트를 확인하는 데만 쓰인다.

  • 생산자는 메시지를 브로커에 보내는데, 비동기 또는 동기 모드를 선택할 수 있다.

카프카 메시지 압축

카프카 클러스터 미러링

기존 클러스터의 복사본을 만드는 데 사용한다.

카프카 리플리케이션

카프카의 메시지 파티셔닝 전략은 브로커 단에서 사용한다. 어떻게 메시지가 파티션될 것인지는 메시지 생산자에 의해 결정하고 브로커는 메시지가 파티션될 것인지는 메시지 생산자에 의해 결정하고 브로커는 메시지가 들어온 순서대로 저장한다. 파티션의 개수는 브로커 내의 각 토픽에 설정할 수 있다.

카프카는 높은 확장성을 가지고 있지만, 카프카 클러스터의 메시지 견고성과 확장성을 위해서 어떠한 브로커 실패시에도 복제본을 사용해 메시지를 발행하고 소비하는 것을 보장한다.

메시지 전달 보장

리플리케이션에서 메시지 각 파티션은 ‘n’개의 리플리카를 가지고 있고 ‘n-1’메시지 전달을 보장한다. ‘n’개의 리플리카 중 하나의 리플리카는 나머지 리플리카의 리드 리플리카로 행동한다. 주키퍼는 리드 리플리카와 현재 동기된 팔로워 리플리카 정보를 가지고 있다. 각 리플리카는 메시지 일부를 로컬 로그와 오프셋으로 저장하고 주기적으로 디스크에 싱크한다. 이 작업은 또한 메시지가 모든 리플리카에 쓰여지거나 전부 쓰이지 않았다는 것을 보장한다.

리드 리플리카가 메시지 파티션을 자신의 로컬 로그로 쓰는 중이거나 메시지 생산자에 확인 응답을 보내기 전에 실패가 발생하면 생산자는 메시지 파티션을 새로운 리더 브로커에 다시 보낸다.

새로운 리플리카 선출은 모든 동기화 리플리카가 자신을 주키퍼에 등록함으로서 이루어진다. 첫 번째 등록된 리플리카가 새로운 리드 리플리카가 되고 다른 모든 리플리카가 팔로워가 된다.

리플리케이션 모드 종류

- 동기 리플리케이션 : 생산자는 첫 번째로 주키퍼로부터 리드 리플리카를 식별하고 메시지를 발행한다. 메시지를 발행하자마자 리드 리플리카 로그에 쓴다. 그리고 모든 리드 리플리카의 팔로워들은 메시지를 끌어오기 시작한다. 하나의 채널을 사용하기 때문에 메시지의 순서가 보장된다. 각 팔로워 리플리카들이 로그로 쓰는 것을 완료하면 리드 리플리카에 확인 응답을 보낸다. 모든 리플리카가 완료되고 모든 확인 응답을 받으면 리드 리플리카는 생산자에 확인 응답을 보낸다.소비자 쪽에서 모든 끌어오기는 리드 리플리카에서 이루어진다.

- 비동기 리플리케이션: 앞의 모드와 단 한 가지 차이점은 리드 리플리카가 메시지를 자신의 로컬 로그에 쓰자마자 확인 응답 메시지를 메시지 클라이언트에 보내고 팔로워 리플리카로부터 메시지 확인 응답을 기다리지 않는다는 것이다. 이 모드의 단점은 브로커 실패 시 메시지 전달이 보장되지 않는다는 것이다.

This article is licensed under CC BY 4.0 by the author.