카프카 스터디 - 카프카 설치 및 세팅

설치과정

  • 운영체제 선택

    • centos
  • 자바 설치 (jdk8이상)
  • 주키퍼 설치

    • zookeeper : 3.4.14
    • kafka : 2.2.1
cd /home1/irteam/
mkdir -p data/zookeeper
mkdir -p data/kafka/data1

echo 1 > data/zookeeper/myid # myid 설정, 노드에 따라 1~3 지정

cd /home1/irteam/apps
wget http://mirror.apache-kr.org/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar zxf zookeeper-3.4.14.tar.gz 
ln -s zookeeper-3.4.14 zookeeper
rm zookeeper-3.4.14.tar.gz 

cd zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
  • 주키퍼 앙상블 설정 (zoo.cfg 설정)

    dataDir=/home1/irteam/data/zookeeper
    server.1=kafka1.server:2888:3888
    server.2=kafka2.server:2888:3888
    server.3=kafka3.server:2888:3888
  • 카프카 브로커 설치

    cd /home1/irteam/apps
    wget https://archive.apache.org/dist/kafka/2.2.1/kafka_2.11-2.2.1.tgz
    tar zxf kafka_2.12-2.2.1.tgz 
    rm kafka_2.12-2.2.1.tgz 
    ln -s kafka_2.12-2.2.1/ kafka

브로커 구성

  • 기본값으로 해도 테스트에는 문제가 없지만 특정 상황에 맞게 카프카 브로커를 조정해야 할 떄는 해당설정을 변경 해야 한다.

핵심 구성 옵션

  • broker.id

    • 정수로 된 번호(식별자)
  • port

    • 기본값은 9092, 1024로 한다면 root로 시작되어야 하므로 바람직 하지 않음
  • zookeeper.connect

    • 메타를 저장하기 위한 주키퍼의 위치, 기본구성은 localhost:2181
  • log.dirs

    • 모든 메시지를 로그 세그먼트 파일에 모아서 디스크에 저장
    • 두개이상의 경로가 지정되면 해당 브로커가 모든 경로에 파티션을 저장
    • 새로운 파티션을 저장할 때는 가장 적은 디스크 용량을 사용하는 경로가 아닌 가장 적은 수의 파티션을 저장한 경로를 사용
  • num.recovery.threads.per.data.dir

    • 기본값은 디렉터리당 하나의 스레드
    • 시작과 종료시에만 사용되므로 병행처리를 하도록 많은 수의 스레드를 설정하는것이 좋다.
  • auto.create.topics.enable

    • 기본값 true
    • 프로듀서가 토픽에 메시지를 쓸 때
    • 컨슈머가 토픽의 메시지를 읽기 시작 할 때
    • 클라이언트에서 토픽의 메타데이터를 요청 할 때
  • 서버 기본설정

    broker.id=1
    log.dirs=/home1/irteam/data/kafka/data1
    zookeeper.connect=kafka1.server:2181,kafka2.server:2181,kafka3.server:2181

토픽의 기본설정

  • num.partitions

    • 새로운 토픽이 몇개의 파티션으로 생성
    • 기본값은 1
  • log.retention.ms

    • 얼마동안 메시지를 보존할지 구성 파일에 설정할 때는 시간단위인 log.retentions.hours 매개변수를 사용, 기본값은 1주일
  • log-retention.bytes

    • 전체 크기를 기준으로 만기를 처리하는 방법 (파티션당)
    • 파티션이 8개이고 1GB라면 최대 8기가
  • log.segment.bytes

    • 로그 세그먼트 파일의 크기, 기본값은 1GB
    • 세그먼트가 닫혀야만 log.retention.ms가 동작한다.
    • log.retention.ms가 1주일이고, 세그먼트가 10일만에 닫힌 다면 해당 로그는 17일 이후에 만기되어 삭제된다.
  • log.segment.ms

    • 로그 세그먼트 닫히는 주기
    • 기본값 없음
  • message.max.bytes

    • 최대 메시지의 크기
    • 기본값 1MB

하드웨어 선택

  • 디스크 처리량
  • SSD, HDD
  • HDD쓸때는 RAID
  • 디스크 용량

    • 일정기간에 얼마나 많은 메시지가 보존되어야 하는가에 따라 결정
  • 메모리

    • 카프카 자체는 JVM에서 실행되므로 힙 메모리를 많이 필요로 하지는 않는다.
    • 시스템의 나머지 메모리는 로그세그먼트를 저장하는 페이지 캐시로 사용
  • 네트워크

    • inbound, outbound 같이 고려해야됨
  • CPU

    • 빠르면 좋지만 하드웨어 선택의 주된 요소는 아님

카프카 클러스터

  • image
  • 브로커 개수

    • 디스크용량
    • 메시지를 보존하는데 필요한 디스크용량과 하나의 브로커에 사용가능한 스토리지 크기를 고려
    • 10TB데이터를 보존해야 하고, 하나의 브로커가 2TB까지 사용가능하자면 최소 5개
    • 복제를 사용하는경우 더욱 많이 증가
    • 클러스터의 용량
  • 브로커 구성

    • zookeeper.connect 매개변수의 설정값이 같아야 함
    • broker.id값은 모든 브로커가 고유한 값을 갖도록 지정되어야 한다.

운영체제 조정하기

  • 커널 변수를 잘 조정해야 한다
  • 가상메모리

    • vm.swappiness 를 낮게 -> 메모리 스와핑을 줄여서 성능저하를 막는게 좋다.
  • 디스크

    • EXT4도 좋지만 안전성이 떨어질 수 있는 매개변수를 사용해야 할 수 있음
    • XFS추천, 마운트는 noatime으로 설정하는것이 좋다. (마지막 사용시간 저장)
    • 커밋간격을 기본값인 5보다 크게 설정하는 경우 디스크에 커밋하는 시간이 길어져 시스템 장애에 따른 데이터 유실이 생길 수있음
  • 네트워크

    • 소켓당 송수신 버퍼로 할당되는 기본과 최대 메모리량을 변경 필요
    • 대량의 데이터 전송 성능을 크게 증가시킨다.

업무 사용시 고려사항

  • GC 옵션 변경

    • 기본 시작옵션은 (Parallel new and concurrent mark & sweep)
    • G1으로 변경하는게 좋음
    • 자동으로 서로다른 작업을 조정하고 애플리케이션이 실행될 동안 일관된 pause time으로 가비지 컬렉션을 수행하도록 설계되었다.
    • 또한 힙 메모리를 더 작은 구역으로 분할하여 각 중지 시간내에 가비지 컬렉션을 수행하므로 힙영역이 크더라도 쉽게 처리 가능

      MaxGCPauseMillis = 200 -> 20 #기본값 200, 200밀리초동안 수행됨
      InitiatingHeapOccupancyPercent = 45 -> 35 # 기본값 45%, 힙의 비율이 이 이상이 되면 가비지 컬렉션 시작

데이터센터 레이아웃

  • 복제를 설정하고 물리적으로도 서버배치를 고려를 하는게 좋다.

주키퍼 공동 사용

  • 카프카는 주키퍼를 사용해서 브로커, 토픽, 파티션에 관한 메타데이터 정보를 저장한다.
  • 컨슈머 그룹의 멤버십 변경사항이나 카프카 클러스터 자체의 변경사항이 생길 때만 주키퍼에 쓰기가 수행, 단일 카프카 클러스터에 주키퍼 앙상블을 사용하는것은 바람직 하지 않음
  • 실제로 많은 카프카 환경에서는 다수의 카프카 클러스터에 하나의 주키퍼 앙상블을 사용
  • 다수의 카프카 클러스터에서 하나의 주키퍼 앙상블을 공유하는 것은 바람직하지만, 서로 다른 애플리케이션이 하나의 주키퍼 잉상블을 공유하는 것은 될 수 있으면 피해야 한다
  • 카프카는 주키퍼의 지연 시간과 타임아웃에 민감히므로 만에 하나 주키퍼 앙상블괴의 통신이 중단되면 브로커가 비정상적으로 동작할 수 있다.

참고자료


dobby
Written by@dobby
The beautiful thing in the world. the most precious thing in the universe.