[Kafka]주키퍼(Zookeeper), 카프카(Kafka) 설치전 알고가기


이 글은 카프카, 데이터 플랫폼의 최강자 고승범/공용준 님의 책을 공부하며
정리하는 글입니다.

[Kafka]주키퍼(Zookeeper), 카프카(Kafka) 설치전 알고가기

설치에 앞서서 주의사항을 알아보자

설치 전 주의사항

  • 카프카와 주키퍼를 동일한 서버에 같이 운영해도 될까?
    • 가능하지만, 소규모 환경에서 사용하고 대규모로 카프카를 운영하는 환경에서는 좋은 방법이 아니다.
    • 카프카는 클러스터 3대로 구성했을 때 2대가 다운되어도 서비스가 가능하지만,
    • 주키퍼는 앙상블을 3대로 구성했을 때 2대가 다운되면 과반수에 미치지 못하기 때문에 장애가 발생한다.
    • 카프카가 문제가 없더라도, 주키퍼가 코디네이션 역할을 못하는 경우 통신 장애 발생.
  • 결론은 주키버 서버와 카프카 서버를 별도로 나눈다.

  • 주키퍼는 몇개? 카프카는 몇개? 설정해야 할까?
    • 과반수 이상 운영되어야 하는 방식인 주키퍼는 3대 이상의 홀수로 구성.
    • 주키퍼는 다운이되어도 과반수 이상이 살아있으면 서비스가 가능하다.
    • 카프카는 3대 이상 자유구성.


주키퍼를 사용하는 자바 애플리케이션 주의사항

  • 자바 애플리케이션들이 간혹 메모리를 전부 사용하는 경우 풀CG 발생.
    • 풀GC: Full Garbage Collection
  • 자바 애플리케이션의 주키퍼 세션 타임아웃 설정을 짧게 하면 GC타임으로 인해 노드가 다운된 것으로 간주.
    • 그렇기 때문에 GC타임을 주기적으로 체크하고, 세션 타임아웃 설정도 3초 이상을 권장.


주키퍼(Zookeeper) 초기 셋팅 팁

Hardware

- 다양한 비즈니스 요구 사항을 고려한 결정  

Memory : znode 크기에 따라 관련이 있고, 일반적인 환경에서는 최소 8GB RAM을 전용으로 사용한다. 왜냐하면 Zookeeper가 주어진 시간에 모든 znode 내용을 메모리에 보유하기 때문이다.

CPUs : 주키퍼는 카프카의 메타데이터 저장소로서 CPU를 많이 소비하지는 않는다.

Disk : 주키퍼 앙상블을 유지 관리하는데 중요하다. IO가 빈번히 일어나므로 SSD를 선택하는 것이 탁월하고, 일반적으로 최소 64GB ~ 250GB 로 잡아둔다. 또한 스냅샷 및 로그 디렉토리의 자동 제거 정책에 대한 구성을 설정하여 모든 로컬 스토리지를 채우지 않도록하는 것이 좋다.

JVM : 주키퍼는 JVM으로 실행되기 때문에 모니터링에 1GB의 힙 크기가 권장된다.

참고
https://docs.confluent.io/current/zookeeper/deployment.html
카프카 데이터 플랫폼의 최강자


카프카(Kafka) 셋팅 팁

Hardware

  • 카프카의 일부(설정의 경우 제외)를 제외하고 모든 데이터는 파일 시스템에 영구적인 로그형태로 즉시 기록된다.

Memory : kafka는 힙 공간을 주의해서 사용하기 때문에 힙 크기를 5GB 이상 설정 안해도 된다. 참고글을 보면 32GB memory machine이 28~30GB의 이상의 파일 시스템 캐시 결과를 냈다고 한다. 32GB 선택은 좋지만 비생산적인 경향이 있습니다 (결국 많은 소형 기계가 필요합니다)

CPUs : kafka는 CPU에 대한 요구사항은 높지 않다. 다만 SSL을 사용하게 된다면 CPU의 요구 사항이 높아질 수 있다. -> 현재 프로젝트에서는 SSL 사용이 무의미할 듯 싶다. 권장 24core.

Disk : 쓰기 처리량과 디스크 장애시 어레이 재구성의 I/O 비용이 적기 때문에 RAID 5 또는 RAID 6을 권장하지 않는다. 일반적으로 재구성 비용은 RAID에 적용되지만 그것은 RAID 6와 RAID 5에서 최악). 추가 비용이 허용되는 경우 RAID 10을 사용하는 것이 좋다

Filesystem : XFS 또는 ext4에서 Kafka를 실행하는 것이 좋다.

일반적으로 고려해야할 사항: 수십 개의 CPU 코어, 수 백 기가바이트의 RAM을 갖춘 머신과 EC2와 같은 클라우드 플랫폼에서 수천 개의 작은 가상 시스템. 어떤 구성이 좋은 구성일까?

  • 일반적으로 medium-to-large box를 선호하는 것이 좋다. 수 천개의 클러스터를 관리하고 싶지 않으므로 작은 머신을 피해야한다. 이는 명백하게 Kafka를 운영하는데 있어서 오버헤드가 커진다.

  • 하지만 정말 고성능의 기계는 피해라. 리소스가 불균형 해지면, 예를 들어, 모든 메모리가 사용되지만 CPU는 사용되지 않습니다. 시스템 당 여러 개의 노드를 실행해야하는 경우 병목 현상을 추가할 수 있다.

JVM

  • 최신 버전의 JDK 1.8을 G1 콜렉터와 함께 실행하는 것이 좋다.

서버의 수

  • 예상 메시지 크기 * 초당 예상 메시지 수를 가져 와서 카프카 클러스터에서 메시지를 사용할 수있는 시간 (초)을 곱하자.
  • 그런 다음 복제 팩터 (예 : 중복성)를 선택하는 것에 따라서 이 크기를 두 개 이상으로 늘리고, 클러스터에 몇 명의 브로커를 둘 것인지 나누자.
  • 이렇게하면 브로커마다 필요한 하드 드라이브 공간이 얼마나되는지 알 수 있다.

참고
https://docs.confluent.io/current/kafka/deployment.html#hardware
http://sori-nori.gitlab.io/docs/Kafka-Operations/


용어 정리
디스크 캐시 : 하드디스크에 접근하는 시간을 개선하기 위해서 메모리에 저장하는 기법
캐시 메모리 : 램에 접근하지 않고 캐시를 이용하여 더 빠른 시간으로 접근가능한 메모리
SSL : 네트워크 내에서 메시지 전송의 안전을 관리하기 위해 넷스케이프에 의해 만들어진 프로그램 계층(Layer)