오픈소스 분산형 스트리밍 플랫폼 - Apache Kafka
아파치 카프카 (Apache Kafka)
Apache Kafka는 오픈소스 분산 스트리밍 플랫폼이며 주로 데이터 파이프 라인을 만들 때 사용되는 솔루션입니다.
Apache Kafka 용어 설명
1. 브로커 (Broker) : 카프카가 설치되어 있는 서버 혹은 노드 등을 브로커라고 합니다. 브로커는 프로듀서에게서 전달받은 메시지를 수집, 전달 역할을 합니다.
2. 프로듀서 (producer) : 프로듀서 API를 통해 메시지를 브로커에게 보내는역할을 합니다.
3. 컨슈머 (consumer) : 컨슈머 API를 통해 브로커에서 메시지를 받는 역할을 합니다.
4. 주키퍼 (Zookeeper) : 다수의 카프카 클러스터를 관리하기 위한 관리도구입니다.
5. 토픽 (topic) : 카프카는 메시지를 토픽에 따라 분리할 수 있고 프로듀서와 컨슈머는 특정 토픽의 메시지를 송수신할 수 있습니다.
● 카프카는 Producer와 Consumer를 분리하며, 단일 Producer, Consumer 가 아닌 멀티 Producer와 멀티 Consumer로 구성이 가능합니다.
● 카프카 클러스터는 주키퍼와 연동하여 사용합니다, 주키퍼에는 리더, 팔로워라는 개념이 있고 주키퍼 서버에서 브로커 파티션의 리더를 정해주고 리더 파티션의 장애가 발생했을 시 주키퍼에서 다른 브로커의 파티션을 리더를 위임해 정상적으로 운영될 수 있게끔 합니다.
● 주키퍼는 홀수의 서버로 동작합니다. 카프카 클러스로 운영시 최소 3대 이상의 주키퍼 서버로 구성하길 권장합니다. 그 이유는 분산 코디네이션 환경에서 예상치 못한 장애가 발생하더라도 분산 시스템의 일관성을 유지시키기 위해서 사용합니다.
[ Apache Kafka에서 Kafka 4.0 이후부터 주키퍼를 제거할 계획이라고 합니다 ]
● 다른 메시지 시스템과는 다르게 카프카는 메시지를 디스크에 순차적으로 저장합니다. 이로 인해 서버에 장애가 발생해도 디스크에 메시지를 저장하기 때문에 유실될 걱정이 없습니다.
● 카프카에서 replication 동작으로 브로커 하나가 종료되더라도 운영에 차질이 없습니다.
● 카프카는 클러스터로도 운영되기 때문에 확장이 편리하고 장애에 대한 대처가 쉽습니다.
● 메시지를 디스크에 저장하기 때문에 유실될 걱정이 없는 안정성이 있습니다.
● 카프카는 메시지를 병렬로 처리하기 때문에 데이터를 더 효과적으로 저장할 수 있습니다.
- 환경 : VM
- CPU : 8 Core
- Memory : 8GB
- OS : ubuntu 22.04
- kafka 구성 전 java를 설치해 줍니다.
- $ apt install default-jre
- $ java --version 명령어를 통해 java 버전을 확인
- $ apt install default-jdk
- $ javac -version 명령어를 통해 javac 버전 확인
- sudo 권한을 가진 kafka용 유저를 생성해 줍니다
- $ sudo adduser kafka
- $ sudo adduser kafka sudo
- $ sudo mkdir ~/Downloads
- $ sudo curl "https://downloads.apache.org/kafka/3.3.2/kafka_2.13-3.3.2.tgz" -o ~/Downloads/kafka.tgz
- $ mkdir ~/kafka && cd ~/kafka
- $ tar -xvzf ~/Downloads/kafka.tgz --strip 1
- - 압축풀때 현재 kafka디렉토리에 위치하고 있는지 확인하고 풀어줍니다.
- $ vi ~/kafka/config/server.properties
- 맨 밑에 delete.topic.enable = true 추가해 주고
- kafka 로그가 저장되는 디렉토리를 변경해 줍니다.
- log.dirs=/home/kafka/logs
zookeeper, kafka 서비스를 보다 쉽게 실행 및 중지할 수 있도록 systemd에 파일 생성
- $ vi /etc/systemd/system/zookeeper.service
- [Unit]
- Requires=network.target remote-fs.target
- After=network.target remote-fs.target
- [Service]
- Type=simple
- User=kafka
- ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
- ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
- Restart=on-abnormal
- [Install]
- WantedBy=multi-user.target
- $ vi /etc/systemd/system/kafka.service
- [Unit]
- Requires=zookeeper.service
- After=zookeeper.service
- [Service]
- Type=simple
- User=kafka
- ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
- ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
- Restart=on-abnormal
- [Install]
- WantedBy=multi-user.target
- $ systemctl start kafka
- $ systemctl status kafka
- $ systemctl enable kafka
- $ systemctl start zookeeper
- $ systemctl status zookeeper
- $ systemctl enable zookeeper
UI for Apache Kafka라는 카프카 클러스터를 모니터링하고 관리하는 무료 오픈소스 웹 UI가 있습니다.
Dashboard를 통해 브로커, 토픽, 파티션과 같은 카프카 클러스터의 현황을 확인할 수 있습니다.
UI를 실행하려면 Docker 이미지를 사용하여 실행할 수 있습니다.
도커 이미지 :
hub.docker.com/r/provectuslabs/kafka-ui
- 백그라운드에서 Docker 컨테이너를 시작합니다.
- docker run -p 8080:8080 \
- -e KAFKA_CLUSTERS_0_NAME=local \
- -e KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092 \
- -d provectuslabs/kafka-ui:latest
- 이후 http://localhost:8080에서 웹 UI에 접속합니다.
- 환경변수를 이용해 추가구성이 가능합니다.
Kafka 서버를 구성 후 재부팅을 했을 때 서비스가 제대로 실행되지 않는다면
- /home/kafka/logs/meta.properties
- cluster.id 부분을 주석처리하고 서비스를 재시작하면
- 작동이 되는 걸 확인할 수 있습니다.