본문 바로가기
컴퓨터 활용(한글, 오피스 등)/기타

카프카 설치와 구성하기

by 3604 2025. 11. 12.
728x90

환경

ubuntu 22.04

1. java 설치하기

jdk 설치

sudo apt-get install openjdk-8-jdk

java 환경변수 설정

which 명령어는 지정된 프로그램의 실행 파일이 어디에 위치하는지를 보여주는 명령어
readlink -f 명령어는 주어진 파일이나 심볼릭 링크의 실제 경로를 표시하는 명령어

javac의 실행파일 위치(심볼릭링크)를 찾는다

which javac
>>> /use/bin/javac

javac의 실제 위치를 찾는다.

readlink -f /usr/bin/javac
>>> /usr/lib/jvm/java-8-openjdk-amd64/bin/javac

환경변수 파일 오픈

sudo vi /etc/profile

최하단 환경변수 설정 추가

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH

java 환경변수 설정 확인

echo $JAVA_HOME

// java 버전 확인
java -version

2. 주키퍼 설치하기 (standalone 모드)

주키퍼 설치 및 경로변경
https://zookeeper.apache.org/releases.html#download

wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz

tar -zxf apache-zookeeper-3.8.3-bin.tar.gz
rm -r apache-zookeeper-3.8.3-bin.tar.gz
mv zookeeper /usr/local/zookeeper

데이터 저장경로 변경 및 기본설정 config 파일 작성

mkdir -p /var/lib/zookeeper

sudo vi /usr/local/zookeeper/conf/zoo.cfg

아래 설정 값 작성 후 저장

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181

zookeeper 실행

sudo /usr/local/zookeeper/bin/zkServer.sh start

정상실행 검사

telnet localhost 2181

주키퍼의 앙상블

주키퍼는 카프카와 같은 분산처리시스템의 서버들에 관한 메타데이터를 통합 관리하는 데 사용된다.
주키퍼의 클러스터는 앙상블이라고도 하며 여러 개의 서버(노드)를 멤버로 가질 수 있다.

이 때 하나의 서버에만 서브시가 집중되지 않게 분산하여 동시에 처리하며, 한 서버에서 처리한 결과를 다른 서버와 동기화 시켜 데이터의 안정성을 보장한다.
또한 현재 동작중인 서버에 문제가 생겨 서비스를 제공할 수 없을 때는 대기 중인 서버 중에서 자동 선정하여 새로 선택된 서버가 해당 서비스를 이어받도록 처리한다.
(데이터를 쓰는 서버를 리더라고하며, 나머지 대기 서버들을 팔로어라한다)

앙상블은 홀수 개의 서버를 맴버로 갖도록한다
앙상블의 서버 중 과반수가 작동 가능하다면 언제든 요청 처리가 가능하기 때문이다.
예를 들어 3개의 서버에서 하나가 문제가 생겨도 나머지 두개는 안정적으로 실행될 수 있다.
일반적으로 주키퍼의 앙상블 크기는 5개로 갖도록 구성한다.

예시 설정

# 팔로워가 리더에 접속할 수 있는 시간
# initLimit * tickTime = 40초 로 설정된다.
initLimit=10
tickTime=2000

# 리더가 될 수 있는 팔로워의 최대 갯수를 나타낸다.
syncLimit=5

# 각 서버는 dataDir의 myid라는 이름의 파일을 갖고있어야한다. 그리고 이 파일은 구성파일에 지정된 것과 일치되는 각 서버의 ID 번호를 포함한다.
# myid가 저장될 디렉토리 위치이다.
dataDir=/data

# 클라이언트가 접속할 포트 번호이다.
clientPort=2181

# 앙상블을 이루는 서버 정보이다.
# server.X=hostname:peerPort:leaderPort
# peerPort는 앙상블 서버들이 상호 통신하는 데 사용되는 포트 번호이다.
# leaderPort는 리더를 선출하는 데 사용되는 포트 번호이다.
server.1=pipeline-zookeeper-a:2888:3888
server.2=pipeline-zookeeper-b:2888:3888
server.3=pipeline-zookeeper-c:2888:3888

3. 카프카 설치하기

설치 및 경로변경

wget https://archive.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz

tar -zxf kafka_2.11-2.1.0.tgz
rm -r kafka_2.11-2.1.0.tgz
mv kafka_2.11-2.1.0/ /usr/local/kafka

카프카 실행

// 혹시 메모리가 부족하여 실행 실패하는 경우 힙메모리 설정 수정 (기본값 1기가)
export KAFKA_HEAP_OPTS="-Xmx256m -Xms256m"

/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

카프카 토픽 생성

/usr/local/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

카프카 토픽 조회

/usr/local/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic test

카프카 메시지 발행

/usr/local/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

카프카 메시지 컨슘

/usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

4. 브로커 구성 핵심 옵션

broker.id
broker의 식별자 역할을 한다. 클러스터 내 브로커의 고유값이며 기본값은 0이다.

port
브로커의 TCP 포트를 의미하며 기본값은 9092. 어떤 값도 상관없지만 1024보다 작은 값으로 설정하는 것은 바람직하지 않다. (root권한으로 실행이 필요)

zookeeper.connect
주키퍼의 위치를 나타낸다. 기본값은 localhost:2181 값이다.
복수개를 콤마로 연결할 수 있다.

log.dirs
카프카의 메시지 로그세그먼트 파일을 저장할 디렉토리를 지정한다
여러 경로로 쉼표를 통해 지정할 수 있다. 이 경우 파티션이 분산되어 저장된다

num.recovery.threads.per.data.dir
카프카는 스레드풀을 이용하여 시작/종료시 각 파티션의 로그세그먼트 파일을 열고/닫는다
이들은 브로커의 시작과 종료시에만 사용하므로 많은 수를 지정하는 것이 좋다. (기본은 디렉토리당 한개이다)
해당 값이 적다면 시작/종료 시 소요되는 시간이 길 수 있다.
단 해당 값은 log.dirs의 지정된 디렉토리 수와 연관리 있다. (설정값 X 디렉토리 갯수)

auto.create.topic.enable
기본값은 true이며 새로운 토픽의 메시지를 읽고/쓰는 요청이 들어온 경우 해당 토픽이 존재하지 않다면 새로운 토픽을 생성해준다.
false값 지정을 권장한다

5. 토픽의 기본 설정

토픽의 파티션의 갯술와 메시지 보존 설정등은 토픽별로도 구성이 가능하다.
여기서 설정하는 값은 기본값이다.

num.partitions
토픽이 몇개의 파티션 값으로 생성되는지를 나타낸다.
기본적으로 auto.create.topic.enable이 될 때 사용된다.
토픽의 파티션 갯수는 증가만 가능하고 감소는 불가능한 점을 유의하자.
파티션의 갯수는 보통 브로커의 수와 같거나 그 의 배수로 설정하는 것을 권장한다. (브로커에 고른 파티션 분산)

log.retention.(ms/minutes/hours)
카프카가 얼마 동안 메시지를 보존할 지 설정하는 값이다.
기본값은 168 이며 단위는 시간이다 (일주일)
log.retension.ms/hours 와 같이 두 매개변수값이 겹치는 경우 작은 시간단위가 우선된다 (ms)
따라서 log.retension.ms을 가급적 사용하길 권장한다.

log.retention.bytes
저장된 메시지들의 크기를 기준으로 만기를 처리하는 방법이다.
이 옵션값은 토픽이 기준이 아닌 파티션별로 처리된다.
따라서 이 옵션 값을 사용할때는 파티션의 갯수를 고려해야한다

log.retention.bytes/ms 두 옵션값이 모두 설정되어 있다면 둘 다 사용된다 (or조건)

log.segment.bytes
메시지는 메시지단위가 아닌 로그세그먼트로 처리된다.
발행된 메시지는해당 파티션의 로그 세그먼트 끝에 추가되며 해당 파일의 최대 크기를 지정한다.(기본값 1GB)
최대 크기가 넘어가는 경우 기존 파일은 닫히며 새로운 파일이 생성되어 열린다.
파일이 만기가되어야 retention의 대상이 될 수 있다고하니 주의하자. (엑티브 세그먼트는 제거대상이 아님)

log.segment.ms
시간단위로도 세그먼트 파일을 교체할 수 있다.
기본값은 없다. 해당 설정값을 사용하는 것은 권장하지 않는다.
여러 파일에 동시에 닫히고 열려 디스크 성능에 영향을 주기 때문이다.

message.max.bytes
메시지의 최대 크기를 제한할 수 있다.
기본값은 1MB이다. 이 값은 압축된 크기임을 주의하자.
즉 producer에서 보낼 때는 1MB가 넘을 수 도 있지만 전송할 때는 압축이 되어 저장이 가능할 수 있다

카프카에 영향을 주는 하드웨어

디스크 성능이 굉장히 중요하다.

디스크의 용량도 주의가 필요하다. 리텐션을 고려하여 넉넉하게 할당하자.

메모리 또한 중요하다. 카프카는 메모리 캐시를 지원한다.

네트워크 처리량도 굉장히 중요하다.
인바운드와 아웃바운드가 상이할 수 있다 (한 클라이언트가 쓰고, 여러 클라이언트가 읽어가기 때문)
클러스터 복제 및 미러링을 사용하는 경우 추가로 고려해야한다.

CPU
얘는 사실 중요성은 살짝 떨어진다.

브로커의 갯수

디스크의 용량
클러스터에서 1TB를 보존하는것이 목표이고, 브로커의 디스크가 2TB 사용가능하다면 최소 브로커는 5개가 필요하다.
복제 팩터를 사용하는 경우 추가 브로커가 필요하다. 사용하는 경우 최소 10대 이상이 필요하다.

컨슈머의 갯수
여러 컨슈머가 트래픽이 일정하지 않더라도 (피크타임/이벤트 등) 모든 클라이언트의 트래픽을 처리할 수 있는지 고려해야한다.
복제를 사용한다면 이 점도 컨슈머의 갯수가 추가됨으로 생각해야한다.

주의

가상 메모리를 사용하지 않도록한다.

기타 최적화

JVM GC가 g1gc를 사용하는지 확인하기
각종 리눅스 옵션 최적화하기 (디스크/네트워크 설정)

기타

카프카는 이제 주키퍼를 필요로하지 않는다 (0.9 버전이상)
브로커와 주키퍼로의 쓰기 트래픽은 굉장히 적다

 

728x90