3.2 카프카의 핵심 개념
3.2.1 분산 시스템
- 분산 시스템 특징
- 높은 성능
- 하나의 서버/노드가 다운되어도 다른 서버/노드가 대신하기에 장애 대응이 탁월
- 높은 부하 시 시스템 확장이 용이하다.
- 카프카 클러스터는 이런 분산 시스템의 특징을 활용할 수 있다.
- 높은 메시지 처리량 필요 시 브로커 추가로 확장이 가능 (추가가 간단)
- 폭발적인 트래픽 증가엔 브로커를 30, 50대 이상 확장할 수도 있다.
3.2.2 페이지 캐시
- 카프카는 페이지 캐시로 높은 처리량을 얻는다.
- 페이지 캐시는 물리 메모리 중 애플리케이션이 사용하지 않는 일부 잔여 메모리를 활용한다.
- 직접 디스크에 읽고 쓰는 것을 피하는 것
- 디스크 I/O를 줄일 수 있어 성능을 높일 수 있다.
3.2.3 배치 전송 처리
- 카프카 프로듀서, 컨슈머 클라이언트들은 수많은 메시지를 주고 받는다.
- 카프카는 배치 전송 처리로 수많은 메시지 통신을 묶어서 처리한다.
3.2.4 압축 전송
- 카프카 메시지는 전송 시 성능이 높은 압축 전송을 사용하도록 권장한다.
- 압축 타입으로 gzip, snappy, lz4, zstd 등이 있다.
- 압축만으로 네트워크 대역폭을 크게 줄일 수 있다.
- 압축과 배치 전송을 결합한다면 더 높은 효과를 얻게 된다.
- 파일 하나 압축하는 것보다 10~20개 파일을 압축하는 쪽이 효율이 좋기 때문
3.2.5 토픽, 파티션, 오프셋
- 카프카는 토픽에 데이터를 저장한다.
- 토픽은 병렬 처리를 위해 다시 파티션 단위로 나뉜다.
- 파티션의 메시지가 저장되는 위치를 오프셋이라 부른다.
- 순차적으로 증가하는 숫자(64비트) 형태
- 오프셋을 통해 메시지 순서를 보장
- 컨슈머에서 읽은 마지막 위치를 식별
3.2.6 고가용성 보장
- 고가용성을 위해 카프카는 리플리케이션을 제공한다.
- 카프카의 리플리케이션은 토픽 자체가 아닌 토픽의 파티션을 복제한다.
- 리플레키이션 팩터 수를 지정하여 파티션 개수를 정할 수 있다.
- 카프카에선 팩터 수를 3으로 구성하도록 권장한다.
- 팔로워가 너무 많으면 결국 브로커 디스크 공간도 소비하므로 딱히 좋은 게 아니다.
3.2.7 주키퍼의 의존성
- 주키퍼는 여러 서버를 클러스터로 구성하고 살아 있는 노드가 과반수 이상 유지되며 지속적인 서비스가 가능한 구조다.
- 지노드(znode)를 이용해 카프카 메타 정보가 주키퍼에 기록된다.
- 하지만 최근 카프카의 성장으로 주키퍼 성능 한계가 드러나 카프카는 주키퍼 의존성을 점점 제거하고 있다.