본문 바로가기

빅데이터/Kafka

AWS에 카프카 클러스터 설치하기(ec2, 3 brokers)

보통 테스트할때 맥북 또는 윈도우 컴퓨터의 1대 장비에 설치하곤하는데요. 고 가용성 테스트를 하기 위해서는 반드시 3대 이상의 클러스터를 설치해야 완벽한 카프카클러스터로서 테스트가 가능합니다. 또한 테스트가 아니더라도 운영을 위해 ec2에 설치하는 경우도 있습니다. 이번 포스트에서는 AWS에 카프카 클러스터(3대)를 설치해보겠습니다. 

 

실행 목차

aws에 카프카 클러스터(3대)를 설치하기 위해서는 아래와 같은 단계가 필요합니다.

1) AWS로 EC2 3대 발급
2) 방화벽 설정 및 /etc/hosts 설정
3) Zookeeper 설치
4) Kafka 설치

위와 같은 단계를 통해 클러스터를 구축해보고 local 컴퓨터에서 console producer와 consumer를 통해 클러스터가 정상동작하는지 테스트해보도록 하겠습니다.

 

1. AWS EC2 발급

ec2는 aws에서 발급가능한 가상머신을 뜻합니다. 이번에는 테스트 목적의 머신이므로 Amazon Linux 2 AMI(Amazon Machine Image)를 t2.micro로 발급받습니다.

프리티어로 사용가능한 Amazon Linux2
t2.micro는 1cpu, 1ram 으로 이루어져 있음

그리고 인스턴스 세부 정보 구성에서는 아래와 같이 인스턴스 개수를 3개로 설정합니다. 

3개로 인스턴스 개수를 설정하면 3개가 동시에 발급받게 됩니다.

잠시 후 3개의 인스턴스가 발급된 것을 ec2 인스턴스 대시보드에서 확인할 수 있습니다.

발급받은 3개 인스턴스(t2.micro)

2. 방화벽 설정 및 /etc/hosts 설정

zookeeper와 카프카 클러스터가 각각 통신을 하기 위해서는 아래와 같이 inbound규칙을 추가해야합니다. 기본적으로 aws ec2를 발급받은 뒤 security group의 기본설정은 outbound에 대해 anywere로 open되어 있으므로 inbound만 추가해줍니다. 추가해야할 port는 아래와 같습니다. 각 port는 anywhere기준으로 열도록 합니다.

inbound 규칙 추가

테스트의 편의를 위해 이번에 만든 3개의 인스턴스의 이름은 test-broker01, 02, 03로 지정하여 진행하겠습니다. 이를 위해 각 host별로 /etc/hosts를 설정해줘야 하는데요. 자기자신의 host는 0.0.0.0으로 설정하고 나머지 host는 ip로 할당되록 설정해줍니다.

// 만약 test-broker01인 경우
0.0.0.0 test-broker01
14.252.123.4 test-broker02
55.231.124.1 test-broker03

3. Zookeeper 설치

이제 실질적인 애플리케이션 설치 및 실행을 하도록 하겠습니다. 여기부터는 3개의 인스턴스(노드)에 모두 동일하게 진행하면 됩니다. 

zookeeper 설치를 위해 아래 명령어로 zookeeper 3.4.12 압축파일을 다운받아 줍니다.

$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz

다운받은 zookeeper 압축파일은 아래 명령어로 풀어줍니다.

$ tar xvf zookeeper-3.4.12.tar.gz

이제 zookeeper의 configuration을 설정해야합니다. zookeeper폴더내부의 conf폴더에 zoo.cfg파일을 생성하여 아래와 같이 configuration을 넣어줍니다.

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=20
syncLimit=5
server.1=test-broker01:2888:3888
server.2=test-broker02:2888:3888
server.3=test-broker03:2888:3888

이제 zookeeper 앙상블을 만들기 위해 각 zookeeper마다 myid라는 파일을 만들어줘야합니다. myid의 위치는 /var/lib/zookeeper/myid 이고, 해당 파일에는 숫자를 하나 넣으면 됩니다. test-broker01은 1, test-broker02는 2, test-broker03은 3 으로 지정합니다.

// 만약 test-broker01에서 실행한 경우 1이 나와야함
$ cat /var/lib/zookeeper/myid
1

이제 zookeeper을 실행하도록 하겠습니다.

$ ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/zookeeper-3.4.12/bin/../conf/zoo.cfg
Strating zookeeper ... STARTED

4. Kafka 설치

zookeeper가 설치완료되었으니 이제 kafka를 다운받고 실행하겠습니다. 이번에 다운받아서 테스트할 버젼은 2.1.0입니다.

$ wget https://archive.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz

마찬가지로 아래 명령어를 통해 압축을 풀어줍니다.

$ tar xvf kafka_2.11-2.1.0.tgz

kafka실행을 위해서 broker.id 설정, zookeeper에 대한 설정과 listener설정을 아래와 같이 설정합니다. 대상 파일은 kafka 폴더 내부에 config/server.properties 입니다.

// test-broker01인 경우 아래와 같이 설정합니다.
# The id of the broker. This must be set to a unique integer for each broker.
broker.id=0
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://test-broker01:9092
zookeeper.connect=test-broker01:2181,test-broker02:2181,test-broker03/test

참고로 zookeeper 설정시 마지막에 /test 와 같이 route를 넣는 것을 추천드립니다. 이렇게 넣을 경우 zookeeper의 root node가 아닌 child node에 카프카정보를 저장하게 되므로 유지보수에 이득이 있습니다.

이제 kafka를 실행해보도록 하겠습니다.

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

이것으로 kafka 클러스터를 구축 및 실행 완료하였습니다!

5. console-producer,consumer 테스트

실제로 kafka 클러스터가 동작하는지는 외부망에서 정상적으로 접근이 되는지 테스트를 해야합니다. 이번에는 local machine(제 맥북)에서 kafka-console-producer와 kafka-console-consumer로 정상 동작하는지 테스트해보도록 하겠습니다.

테스트 전에 먼저 topic을 아래와 같이 생성합니다.

$ ./bin/kafka-topics.sh --create --zookeeper test-broker01:2181,test-broker02:2181,test-broker03:2181/test \
  --replication-factor 3 --partitions 1 --topic test

이제 console-producer와 console-consumer를 동시에 켜고 topic에 데이터가 정상적으로 처리되는지 확인합니다.

$ ./bin/kafka-console-producer.sh --broker-list test-broker01:9092,test-broker02:9092,test-broker03:9092 \
  --topic test
> This is a message
> This is another message

$ ./bin/kafka-console-consumer.sh --bootstrap-server test-broker01:9092,test-broker02:9092,test-broker03:9092 \
  --topic test --from-beginning
This is a message
This is another message

정상적으로 처리되는것을 확인할 수 있습니다!!

결론

이 포스트를 적기까지는 생각보다 오랜 시간이 걸렸는데요. AWS에 익숙하지 않고, kafka 클러스터를 설치해본 경험이 없었기 때문입니다. 그러나 AWS의 기본적인 발급방식이나 동작방식에 있어 다루기 편했고, zookeeper, kafka의 문서가 잘 적혀져 있던 덕분에 정상적으로 동작하는 카프카 클러스터를 구축 및 실행할 수 있게 되었습니다.

카프카 클러스터를 구축하는것은 결코 쉬운일이 아닙니다. 또한 운영을 하면서 여러 옵션을 변경하거나 카프카 버젼을 업그레이드 하는것도 상당한 노력이 들어갑니다. 이런 부분을 습득하는 것이 진정한 카프카그루(gru)로 성장하는 길이 아닌가 싶습니다.

끝까지 봐주셔서 감사합니다.

태그