본문 바로가기
BackEnd/Project

[BigData] Ch11. Kafka 설치 및 Configuration

by 개발 Blog 2024. 9. 17.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

이번 글에서는 AWS EC2에 단일 노드 Kafka를 설치하고 설정하는 과정을 다룬다.

 

Kafka VM 생성 및 설치 (1대 Standalone)

EC2 인스턴스 생성한다. 실습에서는 총 3개의 인스턴스를 사용할 것이다.

첫 번째로 "my_first_kafka"라는 이름의 인스턴스를 생성한다. 기존에 생성한 키페어와 보안 그룹을 선택한다.

 

보안그룹에서 포트를 추가로 열어준다.

보안 그룹 설정에서 포트를 추가로 개방한다.

  • 2181 포트: 주키퍼용
  • 9092 포트: 카프카용

ssh 접근 후 설정

생성한 인스턴스에 SSH로 접속하여 서버 세팅을 진행한다.

root 권한으로 전환하고 패키지 정보를 업데이트한다.

sudo su
apt-get update

 

Java를 설치한다.

apt-get install default-jre

 

Kafka 2.12-2.7.2 버전을 다운로드한다.

curl "https://archive.apache.org/dist/kafka/2.7.2/kafka_2.12-2.7.2.tgz" -o /home/ubuntu/kafka/kafka.tgz

 

다운로드한 파일의 압축을 풀고 디렉터리로 이동한다.

cd kafka
tar -xvzf kafka.tgz --strip 1

 

kafka-server-start.sh 파일을 열어 설정을 수정한다.

cd bin
vi kafka-server-start.sh 내 내용변경

 

더블 체크로 설정한다.

export KAFKA_HEAP_OPTS="-Xms400m -Xmx400m"
echo $KAFKA_HEAP_OPTS

 

환경변수를 설정한다.

export JAVA_HOME="/usr/lib/jvm/java-21-openjdk-amd64"

 

세션이 종료되어도 환경변수가 유지되도록 .bashrc 파일에 설정을 추가한다.

vi .bashrc
export KAFKA_HEAP_OPTS="-Xms400m -Xmx400m"
export JAVA_HOME="/usr/lib/jvm/java-21-openjdk-amd64"
export PATH=$PATH:$JAVA_HOME/bin

파일 맨 아래로 이동하여 다음 내용을 추가한다. (Shift + g)

 

설정 파일을 수정한다.

vi /kafka/config/server.properties

 

advertised.listeners를 퍼블릭 IP로 설정하고, log.dirs 속성을 주석 해제한 뒤 값을 지정한다.

 

log 디렉터리를 생성하고 kafka 사용자에게 권한을 부여한다.

 

서비스 등록

멀티 노드 환경에서 카프카를 서비스로 등록하는 과정이다. systemd를 사용하여 주키퍼와 카프카 서비스를 생성하고 관리할 수 있다.

 

먼저 주키퍼 서비스 파일을 생성한다.

sudo su
vi /etc/systemd/system/zookeeper.service

 

다음 내용을 파일에 추가한다.

[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=ubuntu
ExecStart=/home/ubuntu/kafka/bin/zookeeper-server-start.sh /home/ubuntu/kafka/config/zookeeper.properties
ExecStop=/home/ubuntu/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=ubuntu
ExecStart=/bin/sh -c '/home/ubuntu/kafka/bin/kafka-server-start.sh
/home/ubuntu/kafka/config/server.properties >
/home/ubuntu/kafka/kafka.log 2>&1'
ExecStop=/home/ubuntu/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.targe

 

주키퍼 서비스를 필요로 하고 주키퍼 이후에 실행되도록 의존성을 설정했고 ExecStart에서는 카프카 서버 구동 시 로그를 별도 파일로 저장하도록 하였다.

 

이제 카프카를 서비스로 시작할 수 있다.

sudo systemctl start kafka

 

상태를 확인해 본다.

sudo systemctl status kafka

 

마지막으로 서버 부팅 시 주키퍼와 카프카가 자동으로 시작되게 설정한다.

sudo systemctl enable zookeeper
sudo systemctl enable kafka

 

이렇게 해서 카프카 서버 중 0번 브로커가 실행됐다. 이와 똑같은 작업으로 인스턴스를 두 개 더 만든다.

  • 첫 번째 서버의 이미지를 생성하고 이미지를 이용해서 인스턴스를 생성한다.

이제 3개의 서버에 각각 접속한다.

 

주키퍼의 아이디를 생성한다.

// 1번 서버 
mkdir ~/kafka/zookeeper
echo 1 > ~/kafka/zookeeper/myid

// 2번 서버
mkdir ~/kafka/zookeeper
echo 2 > ~/kafka/zookeeper/myid

// 3번 서버 
mkdir ~/kafka/zookeeper
echo 3 > ~/kafka/zookeeper/myid

 

주키퍼 설정을 수정한다.

아래 명령어로 주키퍼 설정 파일을 연다.

vi ~/kafka/config/zookeeper.properties

 

3개의 서버 모두 다음 내용을 추가한다.

dataDir=/home/ubuntu/kafka/zookeeper

...


initLimit=5
syncLimit=2
# 1번 서버 IP
server.1=54.180.226.178:2888:3888
# 2번 서버 IP
server.2=3.38.181.75:2888:3888
# 3번 서버 IP
server.3=3.35.220.144:2888:3888

 

카프카 설정도 수정한다. 아래 명령어로 카프카 설정 파일을 연다.

vi ~/kafka/config/server.properties

 

각 서버별로 다음 내용을 수정한다.

broker.id=0~2 (각 서버별로 다르게)
advertised.listener=PLAINTEXT://(publicIP):9092 
zookeeper.connect= (각서버의 privateIP)

 

모든 설정이 완료되었으면 카프카 서비스를 시작한다.

sudo service kafka start

 

만약 기존 클러스터 ID와 충돌하는 오류가 발생하면, 각 카프카 브로커의 메타데이터를 삭제해 준다.

 

Kafka 메타 정보 초기화

rm -rf /home/ubuntu/kafka/logs/meta.properties
 

Kafka 브로커 재시작

sudo systemctl restart kafka

이렇게 하면 기존 클러스터 정보가 삭제되고, 새로운 설정이 적용되어 문제가 해결된다.

 

이제 3개의 카프카 브로커로 구성된 클러스터가 구축되었다. 주키퍼 앙상블도 분산 모드로 동작하고 있어 카프카 클러스터를 안정적으로 지원할 수 있게 되었다.