[P1] AWS EC2를 이용한 KAFKA 클러스터 구축 따라하기

ehwnghks·2023년 2월 5일
0

AWS EC2 인스턴스 생성과정
kafka zookeeper 설치 및 실행과정

AWS EC2 인스턴스 생성과정

1-1. 이름을 입력하고 OS를 선택한다.


1-2. 인스턴스 유형 선택
이게 서버 자원 선택인듯 하다. 프티티어라 t2.micro 선택


1-3. 로그인에 필요한 키 페어 생성 및 선택

키 페어 생성 창
이름을 입력하고 기본 설정대로 키페어를 생성하고 키페어를 선택한다.
(.pem 파일은 서버 접속시 사용된다.)


1-4. 네트워크 설정
처음 인스턴스를 생성하는거니 기본 디폴트 설정을 따로 변경하지 않았다.


1-5. 스토리지 구성 및 고급 세부 정보
스토리지 및 고급세부정보도 디폴트 설정으로 시작.
프리티어는 최대 30GB 까지 사용 가능한듯.


1-6. 오른쪽에 요약 정보.
설정한 OS와 인스턴스 유형, 스토리지 정보 등이 출력되며 프리티어 설명을 볼 수 있다.
인스턴스는 기본 1로 설정되어 있지만 3개로 시작해보았다.

1-7. 보안 그룹 편집.
zookeeper 및 kafka 포트 설정


kafka zookeeper 설치 및 실행과정

2-1. 서버 접속 및 호스트 설정
- ssh -i "dojoobang.pem" ec2-user@x.x.x.x.com
호스트 네임변경.
- sudo hostnamectl set-hostname kafaka-01~03
hosts에 private IP 설정하기.
- sudo vi hosts
x.x.x.x kafka-01
x.x.x.x kafka-02
x.x.x.x kafka-03


2-2. zookeeper 다운로드


2-3. zookeeper 설정 변경

[ec2-user@kafka-01 apache-zookeeper-3.7.1-bin]$ cd conf
[ec2-user@kafka-01 conf]$ cp zoo_sample.cfg zoo.cfg
[ec2-user@kafka-01 conf]$ vi zoo.cfg


설정한 로그 경로 디렉토리 생성하기.

[ec2-user@kafka-01 conf]$ sudo mkdir /data/app_logs/zookeeper
[ec2-user@kafka-01 app_logs]$ sudo chmod -R 777 /data

설정 중 sever.1은 dataDir의 myid 파일에 데이터가 1인 파일이 있어야 하며 아래와 같이 myid파일을 생성한다.

# kafka-01 서버에서 실행
echo 1 > /data/app_logs/zookeeper/myid
# kafka-02 서버에서 실행
echo 2 > /data/app_logs/zookeeper/myid
# kafka-03 서버에서 실행
echo 3 > /data/app_logs/zookeeper/myid

zookeeper는 자바 기반 어플리케이션이므로 자바를 설치해야 한다.

yum list *openjdk*


해당 버전을 설치하고 버전을 확인한다.

[ec2-user@ip-x.x.x.x ~]$ sudo yum -y install java-1.8.0-openjdk.x86_64
Complete!
[ec2-user@ip-x.x.x.x ~]$ java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)

2-4. zookeeper 기동 및 중단

# 시작
[ec2-user@ip-x-x-x-x ~]$ /home/ec2-user/appl/apache-zookeeper-3.7.1-bin/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/apache-zookeeper-3.7.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 주키퍼 시작시 dataDir 경로에 pid 파일이 생기고 주키퍼 중단시 삭제 된다.
[ec2-user@ip-x.x.x.x ~]$ cd /data/app_logs/zookeeper
[ec2-user@ip-x.x.x.x zookeeper]$ ls
-rw-rw-r-- 1 ec2-user ec2-user  2  1월  8 05:19 myid
drwxrwxr-x 2 ec2-user ec2-user 65  1월  8 05:19 version-2
-rw-rw-r-- 1 ec2-user ec2-user  5  1월  8 05:35 zookeeper_server.pid

# 종료
[ec2-user@ip-x-x-x-x ~]$ /home/ec2-user/appl/apache-zookeeper-3.7.1-bin/bin/zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Stopping zookeeper ... /home/ec2-user/apache-zookeeper-3.7.1-bin/bin/zkServer.sh: line 213: kill: (24901) - No such process
STOPPED

# 주키퍼 시작시 dataDir 경로에 pid 파일이 생기고 주키퍼 중단시 삭제 된다.
[ec2-user@ip-x.x.x.x ~]$ cd /data/app_logs/zookeeper
[ec2-user@ip-x.x.x.x zookeeper]$ ls
-rw-rw-r-- 1 ec2-user ec2-user  2  1월  8 05:19 myid
drwxrwxr-x 2 ec2-user ec2-user 65  1월  8 05:19 version-2

정상 실행 방법

// 정상적으로 기동된 경우 프로세스가 떠있다.
$ ps -ef | grep zookeeper
ec2-user  8671     1 22 08:55 pts/0    00:00:01 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.amzn2.0.2.x86_64/jre/bin/java -Dzookeeper.log.dir=/home/ec2-user/apache-zookeeper-3.6.3-bin/bin/../logs -Dzookeeper.log.file=zookeeper....
// 클라이언트 접속 (오류없이 실행되며 조회 가능한 주키퍼 쉘이 나온다.)
$ /home/ec2-user/apache-zookeeper-3.6.3-bin/bin/zkCli.sh
...
2022-01-08 08:57:19,769 [myid:localhost:2181] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1448] - Session establishment complete on server localhost/127.0.0.1:2181, session id = 0x100012a10de0000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]
[zk: localhost:2181(CONNECTED) 0] quit

2-5. kafka 기동 및 중단
카프카를 우선 다운로드한다.

$ wget https://dlcdn.apache.org/kafka/3.0.0/kafka_2.12-3.0.0.tgz
$ tar xvf kafka_2.12-3.0.0.tgz

vi kafka/config/server.properties

# kafka-01
broker.id=1
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka-01:9092
zookeeper.connect=kafka-01:2181,kafka-02:2181,kafka-03:2181

# kafka-02
broker.id=2
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka-02:9092
zookeeper.connect=kafka-01:2181,kafka-02:2181,kafka-03:2181

# kafka-03
broker.id=2
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka-03:9092
zookeeper.connect=kafka-01:2181,kafka-02:2181,kafka-03:2181

설정 변경 후 카프카를 실행한다.

// 백그라운드 실행은 -daemon을 붙여주세요
$ vi ~/.bashrc
alias start_kafka='/home/ec2-user/kafka_2.12-3.0.0/bin/kafka-server-start.sh -daemon /home/ec2-user/kafka_2.12-3.0.0/config/server.properties'
alias stop_kafka='/home/ec2-user/kafka_2.12-3.0.0/bin/kafka-server-stop.sh /home/ec2-user/kafka_2.12-3.0.0/config/server.properties'
:wq!
$ source ~/.bashrc
$ alias
alias start_kafka='/home/ec2-user/kafka_2.12-3.0.0/bin/kafka-server-start.sh -daemon /home/ec2-user/kafka_2.12-3.0.0/config/server.properties'
alias stop_kafka='/home/ec2-user/kafka_2.12-3.0.0/bin/kafka-server-stop.sh -daemon /home/ec2-user/kafka_2.12-3.0.0/config/server.properties'
$ start_kafka

EC2 인스턴스 메모리가 1GB로 카프카 실행시 메모리 부족...
카프카 메모리 설정방법

# 편집기 열기
vi ~/.bashrc

# 맨 아래 입력하고 저장
export KAFKA_HEAP_OPTS="-Xmx400m -Xms400m"

# source 명령어는 스크립트 파일을 수정한 후에 수정된 값을 바로 적용하기 위해 사용합니다.
source ~/.bashrc

# 확인
echo $KAFKA_HEAP_OPTS

토픽 생성해보기

// 브로커 서버3대 중 한대에서 실행
$ /home/ec2-user/kafka_2.12-3.0.0/bin/kafka-topics.sh --create \
--replication-factor 3 \
--partitions 2 \
--topic topic-A \
--bootstrap-server kafka-01:9092,kafka-02:9092,kafka-03:9092

// 확인 (3대 모두 리스트 확인시 생성한 topic-A가 나온다.)
$ /home/ec2-user/kafka_2.12-3.0.0/bin/kafka-topics.sh --list --bootstrap-server kafka-01:9092,kafka-02:9092,kafka-03:9092
topic-A

// topic-B도 생성
$ /home/ec2-user/kafka_2.12-3.0.0/bin/kafka-topics.sh --create \
--replication-factor 3 \
--partitions 1 \
--topic topic-B \
--bootstrap-server kafka-01:9092,kafka-02:9092,kafka-03:9092

// 확인 (3대 모두 리스트 확인시 생성한 topic-A가 나온다.)
$ /home/ec2-user/kafka_2.12-3.0.0/bin/kafka-topics.sh --list --bootstrap-server kafka-01:9092,kafka-02:9092,kafka-03:9092
topic-A
topic-B


💡출처 : https://co-de.tistory.com/44


💡참고
zookeeper란 카프카 클러스트의 메타데이터(브로커, 컨트롤러 ID 등)를 저장하는 서버로 broker를 실행하려면 필수로 떠있어야 하는 서비스이나 향후 카프카 클러스트에 통합시킬 예정.

주키퍼는 내부적으로 관리되는 메타데이터용 프토로콜인 ‘카프카 라프트(Kafka Raft)' 또는 '크라프트(KRaft)’로 대체된다.

원문보기:
https://www.itworld.co.kr/tags/51122/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B4%80%EB%A6%AC/235784#csidx9a8d25de5a4adfd93e16a3e7024eb73

profile
반갑습니다.

0개의 댓글