Kafka 설치하기

업데이트:

Redis 초기 설치하는 방법을 정리하면서 의외로 OS 쪽 설정이나 conf 쪽 내용 복습도 되고 좀 더 내용을 찾아볼 수 있는 기회가 되어서, Kafka 도 같이 정리해 두기로 했다(나중에 Elastic Stack 쪽은 아예 시리즈물로 써볼까 싶기도 하고).

설치하고자 하는 Kafka 구성은 한 대의 서버에 Zookeeper 와 Kafka 를 함께 올리는 방식으로 한다.

사전 준비

JDK 설치

Kafka 는 Java 기반의 솔루션이므로 JDK 설치가 필요하다.

sudo apt-get update
sudo apt-get install openjdk-<JDK버전>-jdk
java -version

설치

Kafka 를 설치하기 위한 바이너리 아카이브 파일은 아래 두 루트를 통해 다운로드받을 수 있다.

여기에서는 Apache 에서 제공하는 바이너리 파일을 다운로드받아 설치하는 방법을 소개한다.

### 바이너리 파일 다운로드
wget https://archive.apache.org/dist/kafka/<버전>/kafka_2.12-<버전>.tgz
### 바이너리 파일 압축 풀기
tar -zxvf kafka_2.12-<버전>.tgz
### 심볼릭 링크 생성하여 차후 버전 관리 등에 대비하기
ln kafka_2.12-<버전> kafka

환경파일 설정

전용 유저 및 그룹 설정

Kafka 및 Zookeeper 를 실행할 전용 유저와 그룹을 생성한다.

sudo groupadd <그룹명>
### 로그인 기능을 필요하지 않으므로 nologin 으로 지정
sudo useradd -s /sbin/nologin -M -g <그룹명> <유저명>

데이터 보관용 디렉토리 생성

Kafka 및 Zookeeper 에서 보관하는 데이터(Kafka 에서는 이를 log 라고 표현한다 진짜 로그 파일과는 다르다)용 디렉토리를 미리 생성한 후 config 파일에 설정한다.

### 아래 디렉토리명은 예시
### Zookeeper 용 데이터 디렉토리 생성
mkdir /var/lib/zookeeper
### Kafka 용 로그(데이터) 보관 디렉토리 생성
mkdir /var/lib/kafka

conf 설정

config 설정은 일부만 포함되어 있다

  • /config/server.properties
broker.id=<브로커 고유 아이디>

### zookeeper 접속 IP 리스트
zookeeper.connect=<Zookeeper #01 IP 주소>:2181,<Zookeeper #02 IP 주소>:2181,<Zookeeper #03 IP 주소>:2181

listeners=PLAINTEXT://<Broker 가 내부적으로 바인딩하는 IP 주소>:9092
advertised.listeners=PLAINTEXT://<Producer 및 Consumer 에게 보일 IP 주소>:9092

### 로그(데이터) 보관 주기(hour)
log.retention.hours=168

### 로그(데이터) 파일 보관 디렉토리 경로
log.dirs=/var/lib/kafka
### 로그(데이터) 파일 1개의 최대 크기(기본값 1GB)
log.segment.bytes=1073741824

### 토픽의 메시지를 디스크로 플러시하기 전까지 메모리에 보관할 최대 시간(ms)
log.flush.interval.ms=5000
### 토픽의 메시지를 디스크로 플러시하기 전까지 메모리에 보관할 메시지 수
log.flush.interval.messages=20000

### 클러스터 내의 코디네이터가 리밸런싱을 수행하기 전에, 다른 컨슈머 
group.initial.rebalance.delay.ms=10000

## 오프셋 토픽의 replication factor 수 설정. 클러스터 크기가 이 값을 충족하지 않으면 내부 토픽 생성에 실패함
offsets.topic.replication.factor=3
## 트랜잭션 토픽의 replication factor 수 설정. 클러스터 크기가 이 값을 충족하지 않으면 내부 토픽 생성에 실패함
transaction.state.log.replication.factor=3

### 토픽 당 기본 파티션 수
num.partitions=1 

### topic 삭제 허가 설정
delete.topic.enable=true
### 자동 topic 생성 허가 설정
auto.create.topics.enable=true
  • /config/zookeeper.properties
### Zookeeper 데이터 보관 디렉토리 경로
dataDir=/var/lib/zookeeper

### 클라이언트가 접속할 Zookeeper 포트번호로 기본값은 2181
clientPort=2181
### 클라이언트에서 동시 접속하는 개수 제한으로 기본값 60, 무제한 설정시 0
maxClientCnxns=0

### Follower가 Leader와의 연결 시도시의 tick 제한 횟수
initLimit=5                             
### Follower가 Leader와 연결된 후 동기화되기 위한 tick 제한 횟수
syncLimit=2                             

## Zookeeper 앙상블을 이룰 서버 설정
server.1=<IP 주소>:2888:3888
server.2=<IP 주소>:2888:3888
...
server.N=<IP 주소>:2888:3888

Zookeeper ID 파일 설정

  • /myid
# <path>/config/server.properties 의 broker.id 값과 동일한 값을 저장한다

Heap Size 조정

  • /bin/kafka-server-start.sh
### Kafka 와 OS 메모리의 비율을 1:2 정도로 잡는 게 일반적
### Kafka 자체가 Heap 공간을 주의해서 사용하므로 5GB 이상은 설정하지 않아도 된다
export KAFKA_HEAP_OPTS="-Xmx2G -Xms2G"
  • /bin/zookeeper-server-start.sh
### Zookeeper 와 Kafka 의 Heap Size 비율을 1:2 정도로 잡는 게 일반적
### 다만 모니터링을 위해 1GB 정도를 잡아준다
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"

systemd 설정

kafka 는 zookeeper 가 먼저 시작된 후에 시작해야 하기 때문에, 이 점을 유념하여 systemd 파일을 작성한다.

zookeeper systemd 파일 작성

  • /usr/lib/systemd/system/zookeeper.service

      [Unit]
      Description=Zookeeper server
      Requires=network.target remote-fs.target
      After=network.target remote-fs.target
         
      [Service]
      Type=simple
      Environment=JAVA_HOME=/usr/lib/jvm/java-<버전>-openjdk-amd64
      SyslogIdentifier=zookeeper
      WorkingDirectory=<path>
      RestartSec=0s
      ExecStart=<path>/bin/zookeeper-server-start.sh <path>/config/zookeeper.properties
      ExecStop=<path>/bin/zookeeper-server-stop.sh
         
      [Install]
      WantedBy=multi-user.target
    

kafka systemd 파일 설정

  • /usr/lib/systemd/system/kafka.service

      [Unit]
      Description=Kafka server
      Requires=zookeeper.service
      After=zookeeper.service
         
      [Service]
      Type=simple
      Environment=JAVA_HOME=/usr/lib/jvm/java-<버전>-openjdk-amd64
      SyslogIdentifier=kafka
      WorkingDirectory=<path>
      RestartSec=0s
      ExecStart=<path>/bin/kafka-server-start.sh <path>/config/server.properties
      ExecStop=<path>/bin/kafka-server-stop.sh
         
      [Install]
      WantedBy=multi-user.target
    

/etc/systemd 경로로 링크

  • /usr/lib/systemd : 패키지 다운로드로 설치했을 때 system 파일이 저장되는 장소
  • /etc/systemd : 시스템 관리자가 관리하는 영역

보통의 경우, /usr/lib/systemd 쪽에 저장된 시스템 파일에 대해 /etc/systemd 쪽에 유닛을 추가하면 오버라이드되지만, 이 경우 /usr/lib/systemd 부터 직접 생성했으므로 soft copy 로 링크를 걸어둔다.

cd /etc/systemd/system
ln -s /lib/systemd/system/zookeeper.service zookeeper.service
ln -s /lib/systemd/system/kafka.service kafka.service

참고