JUST WRITE

AWS EC2 Kafka 설치 본문

MLOps/Kafka

AWS EC2 Kafka 설치

천재보단범재 2022. 11. 13. 21:50

Kafka 설치

AWS EC2 Kafka 설치

이번 포스팅에서는 AWS EC2 인스턴스 3개에 Kafka Cluster를 구성해보려 한다.

각 EC2는 Amazon Linux 2에 t3.small로 구성하였다.

EC2 인스턴스 유형

먼저 보안 그룹을 설정하였다.

ssh 접속을 위해 22 port를 오픈하였고

인스턴스끼리 편하게 통신할 수 있도록 같은 보안그룹에 있는 인스턴스끼리 통신할 수 있도록 설정하였다.

기본 보안그룹 설정

EC2 3개의 인스턴스가 성공적으로 실행이 되면 Kafka를 다운로드한다.

여기에서는 3.2.3 버전으로 설치를 진행한다.(Kafka Download)

Java 설치 및 User 생성

Kafka 설치에 앞서 Java 설치가 필요하다.

JDK는 11 버전을 설치를 진행하였다.

Kafka는 1.8 이상이면 되지만 추후 CMAK 설치를 위해서 11 버전 설치를 진행한다.

$ sudo yum install -y java-11-amazon-corretto.x86_64

$ java --version
openjdk 11.0.17 2022-10-18 LTS
OpenJDK Runtime Environment Corretto-11.0.17.8.1 (build 11.0.17+8-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.17.8.1 (build 11.0.17+8-LTS, mixed mode)

그리고 kafka 전용 User를 생성한다.

# 'kafka'로 group 생성
$ sudo groupadd kafka
# 'kafka'로 user 생성
$ sudo useradd -m -g kafka kafka
# kafka user password 설정
$ sudo passwd kafka
Changing password for user kafka.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
# su kafka

Zookeepr 설치

Zookeeper분산 코디네이션 서비스를 제공하는 오픈소스 프로젝트이다.

Kafka처럼 Cluster를 구성하여 분산 환경을 구성하는 서비스에 주로 활용된다.

Kafka 역시 Zookeeper를 활용하고 있어 설치가 필요하다.

Kafka를 Download 하면 Zookeeper가 내장되어 있지만 내장 Zookeeper 대신 직접 설치를 진행하였다.

참고로 Kafka는 현재 Zookeeper 대신 KRaft로 대체하려고 한다.

Zookeeper Download

$ wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
$ tar xzf apache-zookeeper-3.7.1-bin.tar.gz

각 EC2 인스턴스마다 Zookeeper를 Download 하고 압축을 풀어준다.

Configuration 파일(zoo.cfg)을 만들어 설정한다.

이번에는 대부분 기본 설정으로 진행하였다.

Zookeeper Cluster 구성을 위한 설정은 맨 아래에 추가하였다.

server.{number}에 각 인스턴스의 host를 정보를 넣어주면 된다.

인스턴스 간 통신을 위한 설정이기 때문에 Private IPv4 주소를 입력한다.

$ cd /home/kafka/apache-zookeeper-3.7.1-bin/conf
$ cp zoo_sample.cfg zoo.cfg
$ vi zoo.cfg

tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181

###### 추가 부분
server.1=internal.server1:2888:3888
server.2=internal.server2:2888:3888
server.3=internal.server3:2888:3888

Zookeeper Data 파일에 Cluster Node 식별자 파일을 만들어 준다.

$ mkdir -p /tmp/zookeeper
# 각 Node별 숫자값을 myid 파일에 넣어준다
$ echo {number} > /tmp/zookeeper/myid

이제 Node별로 Zookeeper를 시작한다.

$ cd /home/kafka/apache-zookeeper-3.7.1-bin/bin
$ ./zkServer.sh start

/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/kafka/apache-zookeeper-3.7.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

Kafka 설치

위에서 말한 대로 3.2.3 버전으로 설치를 진행하였다.

**참고 Kafka는 scala로 개발되어 버전명이 scala버전과 같이 기재되어 있다.

예를 들어, 2.13-3.2.3은 scala 2.13, kafka 3.2.3 버전이다.

$ wget https://downloads.apache.org/kafka/3.2.3/kafka_2.13-3.2.3.tgz
$ tar xzf kafka_2.13-3.2.3.tgz

Kafka 설정

Kafka 실행 전 Kafka Configuration 파일을 수정하여 설정을 진행한다.

먼저 server.properties 파일을 수정한다.

이번에는 최대한 기본 설정으로 진행하고 추가로 필요한 부분만 수정하였다.

특이한 점은 EC2는 내부 Private IP, 외부 Public IP를 가지고 있어 나누어서 설정하였다.

설정이 어떤지는 추후 따로 정리하려 한다.

$ cd /home/kafka/kafka_2.13-3.2.3/config
$ vi server.properties

# broker.id는 각 Broker(Node)별로 다르게 설정
broker.id=0

# EC2 Network 구성에 따른 내부, 외부 IP 따로 설정
listeners=INTERNAL://kafka.internal.broker1:9092,EXTERNAL://0.0.0.0:9093
advertised.listeners=INTERNAL://kafka.internal.broker1:9092,EXTERNAL://kafka.external.broker1:9093
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
inter.broker.listener.name=INTERNAL

# zookeeper node를 , 단위로 나열
zookeeper.connect=kafka.internal.broker1:2181,kafka.internal.broker2:2181,kafka.internal.broker3:2181

그리고 Kafka Monitoring을 위해 JMX Port를 오픈하였다.

해당 설정은 kafka-server-start.sh를 수정한다.

$ cd /home/kafka/kafka_2.13-3.2.3/bin
$ vi kafka-server-start.sh

#### 추가 부분 ####
export JMX_PORT=9999
##################

if [ $# -lt 1 ];
then
        echo "USAGE: $0 [-daemon] server.properties [--override property=value]*"
        exit 1
fi
base_dir=$(dirname $0)
...
...
...

Kafka 실행

Kafka 설정이 끝나고 각 Kafka Broker별로 실행한다.

$ ./kafka-server-start.sh -daemon ../config/server.properties

실행 후 Test로 Topic을 만들고 데이터를 보내보았다.

# 'quickstart-events'로 topic 생성
$ ./kafka-topics.sh --create --topic quickstart-events --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092

# kafka produce (kafka broker로 데이터 보내기)
$ ./kafka-console-producer.sh --topic quickstart-events --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092
> one
> two
> three

# kafka consume (kafka broker로 데이터 받기)
$ ./kafka-console-consumer.sh --topic quickstart-events --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 -from-beginning --group test-group
one
two
three

정상적으로 Kafka Broker로부터 데이터를 받을 수 있는 것을 확인할 수 있다.

728x90
반응형

'MLOps > Kafka' 카테고리의 다른 글

Kafka Broker Log 관리  (0) 2023.01.10
Ansible를 통한 Kafka 설치  (0) 2022.12.18
Kafka Topic  (0) 2022.10.03
Kafka Architecture  (0) 2022.08.14
What is kafka  (0) 2022.08.09
Comments