공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
이번 글에서는 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개의 카프카 브로커로 구성된 클러스터가 구축되었다. 주키퍼 앙상블도 분산 모드로 동작하고 있어 카프카 클러스터를 안정적으로 지원할 수 있게 되었다.
'BackEnd > Project' 카테고리의 다른 글
[BigData] Ch12. Kafka Stream을 활용한 KStream 개발(1) (0) | 2024.09.18 |
---|---|
[BigData] Ch12. Kafka Produce, Consuming 개발 (0) | 2024.09.18 |
[BigData] Ch10. Kafka의 기본 개념 (1) | 2024.09.16 |
[BigData] Ch09. Kafka 활용 서비스 설계 (0) | 2024.09.16 |
[BigData] Ch08. Redis 추가 활용 사례 (2) | 2024.09.16 |