Art of Pr0gr4m

[실습] Kafka 설치하기 본문

IT/Kafka

[실습] Kafka 설치하기

pr0gr4m 2018. 7. 28. 02:09

카프카 카테고리의 실습 글들은 해당 서적해당 문서의 내용을 참고합니다.

그 중 특히 서적의 내용을 주로 따라하는 대신, 리눅스 사용 등에 많이 친숙하지 못한 분들도 따라할 수 있고 실습 위주로 편성하였습니다.

-----


카프카에 대한 자세한 설명은, 번역으로 진행하는 문서 글에서 참고하도록 하고,

해당 포스트는 실습 위주로 진행하겠습니다.


우선 카프카를 운영하는 데에 분산 애플리케이션 코디네이션 시스템이 필요한데, 주키퍼가 바로 그것입니다.

주키퍼는 분산되어 있는 각 애플리케이션의 정보를 중앙에 집중 및 구성하여 관리하고, 동기화 하거나, 그룹 관리 네이밍 등의 서비스를 제공합니다.


주키퍼에 대한 자세한 설명은 다른 포스팅에서 하기로 하고, 어떻게 시스템을 구성할지 이야기해보겠습니다.

분산 시스템을 운영하는 것이다 보니 여러 호스트가 필요한데, 정말 여러 PC를 가지고 실습을 하긴 대부분 어려울 것이라 예상됩니다.

따라서 아무래도 가상 머신을 사용하게 되는데, 본 글에서는 VMware를 사용합니다. VirtualBox 등 다른 사용하기 편한 가상 머신을 사용하여도 네트워크 세팅만 알맞게 해준다면 상관 없습니다.


세 대의 주키퍼 앙상블과 세 대의 카프카 클러스터를 구성할 것인데, 다음과 같이 세팅하겠습니다.


호스트 이름 

pr0gr4m-zk001

pr0gr4m-zk002

pr0gr4m-zk003 

pr0gr4m-kf001 

pr0gr4m-kf002 

pr0gr4m-kf003 

로컬 IP 주소

10.10.10.101 

10.10.10.102 

10.10.10.103 

10.10.10.11 

10.10.10.12 

10.10.10.13 

RAM Size 

512M 

512M 

512M 

2G 

512M

512M 

Disk Size (Limit)

20G

20G 

20G 

60G 

40G 

40G 

설치 소프트웨어

Minimal 

Minimal 

Minimal 

Server with GUI 

Minimal 

Minimal 


호스트 이름 앞의 pr0gr4m 부분은 자신이 사용할 닉네임으로 바꿔주시면 되고,

IP 주소 다르게 설정해도 되지만 이 후 네트워크 설정 시 본인이 정한대로 수정해주셔야 합니다.

램 사이즈는 1G 씩 주는 것이 좋지만, 램 용량이 부족한 케이스를 고려해 kf001을 제외하고는 512M씩 주었습니다.

디스크 사이즈는 가상 머신의 디스크 동적 할당 기능을 사용하여 리미트를 저렇게 해주시면 됩니다.

주키퍼 앙상블을 구성할 서버는 사실 더 적은 용량을 주어도 되지만 기본 추천 사양인 20G를 주었으며,

카프카 클러스터에는 이 후 실습할 nifi 등의 설치를 위하여 40G를 주었습니다.

설치 소프트웨어는 kf001을 제외하고는 전부 Minimal Install로 저사양에서도 가볍게 돌릴 수 있도록 하였습니다.

kf001만 Server with GUI로 GUI를 설치한건 API 실습 시 IDE를 사용하는 것이 편하기 때문에 한 것이지, 다른 이유는 딱히 없습니다.

(즉, 나는 IDE 필요 없다 하시는 분은 kf001 또한 Minimal Install 하셔도 상관 없습니다.)


그러면 설치를 시작해보겠습니다.





1. 기본 환경 설정



우선 들어가기 앞서 VMware의 네트워크 에디터에서 Subnet IP를 10.10.10.0, Subnet Mask를 255.255.255.0 으로 수정하여 로컬 네트워크 대역 설정을 해줍니다.





Zookeeper 앙상블로 사용할 CentOS 설치 및 가상 머신 세팅은 위의 표에 맞춰 진행합니다.


OS 및 환경 설치가 완료되면 다음과 같이 네트워크 설정을 진행합니다.


1) vi 에디터로 /etc/sysconfig/network-scripts/ifcfg-ens33 (디폴트 네트워크 디바이스) 수정



여기서 IPADDR은 각 호스트마다 위의 표에서 정한 주소로 적어주시면 되고 GATEWAY는 가상머신에서 설정되어있는 게이트웨이 주소를 적으면 됩니다.


2) vi /etc/sysconfig/network 파일 수정



해당 파일에서 위와 같이 각 호스트 이름과 게이트 웨이 정보를 적습니다.


3) vi /etc/hosts 파일 수정



해당 파일에서 호스트명들을 지정하여 Resolve할 수 있게 해줍니다.


4) `hostnamectl set-hostname 호스트네임` 명령어로 편의상 호스트네임 설정



그 후 다음과 같은 명령어를 입력하면 네트워크가 재시작됩니다.


systemctl restart network





2. 주키퍼 설치


해당 작업이 끝났으면 본격적으로 주키퍼 설치에 들어갑니다. 우선 주키퍼는 자바 애플리케이션이기 때문에 실행 및 운영을 위해 자바가 설치되어 있어야 합니다. 또한, 이 후 편집을 위한 vim과 콘텐츠 다운로드를 위한 wget도 함께 설치하겠습니다.


yum -y install java-1.8.0-openjdk vim wget



설치가 완료되면 해당 링크에서 Download 메뉴의 Apache mirrors: Download를 클릭하시면 미러 사이트가 나오고, 미러 사이트에 접속하여 stable 버전을 다운받으시면 됩니다. 포스팅 시 주키퍼의 stable 버전은 3.4.12 이므로 해당 버전을 다운로드 하겠습니다. 물론 미러 사이트는 접속하는 사람마다 주소가 다를 수 있습니다.

또한, 다운로드는 다른 위치에 받아도 상관 없지만 본 글에서는 /usr/local/ 에 다운로드 받도록 하겠습니다.


cd /usr/local/

wget http://mirror.navercorp.com/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz



다운로드가 완료되었다면 다음 명령어로 압축 해제 후 심볼릭 링크를 생성해 줍니다.


tar zxf zookeeper-3.4.12.tar.gz

ln -s zookeeper-3.4.12 zookeeper



여기까지 완료되었다면 주키퍼 애플리케이션에서 사용할 데이터 디렉토리를 생성하고, 해당 디렉토리에 주키퍼 노드 ID를 설정하겠습니다.

여기서 echo 1 > /data/myid는 zk001 호스트의 myid인 것이고, zk002는 echo 2 > /data/myid, zk003은 echo 3 > /data/myid로 각각의 myid를 설정해줘야 합니다.


mkdir -p /data

echo 1 > /data/myid



아래 사진은 현재까지의 진행 사항을 보여줍니다.



압축 파일 zookeeper-3.4.12.tar.gz는 압축 해제 및 심볼릭 링크 생성이 정상적으로 잘 되었다면 삭제하셔도 좋습니다.



위의 내용에 무리 없이 따라왔다면 다음엔 주키퍼의 환경설정을 할 차례입니다. 다음 명령어로 주키퍼 환경성 설정 파일을 만들어 줍니다.


vi /usr/local/zookeeper/conf/zoo.cfg



그리고 사진과 같이 내용을 입력하여 줍시다.



환경 설정 파일의 내용 중 clientPort는 주키퍼 사용 TCP 포트, server.x는 주키퍼 앙상블 구성을 위한 서버 설정입니다. zoo.cfg 파일에 대한 더욱 자세한 내용은 해당 링크를 참조해주시면 됩니다.




환경 설정이 끝났다면 위와 같이 실습의 수월함을 위하여 firewall-cmd 명령어로 포트를 열어줍니다.


여기 까지 왔으면 `/usr/local/zookeeper/bin/zkServer.sh start` 명령어로 주키퍼를 실행할 수 있습니다. 하지만 이런 방식으로는 매번 시작하는데 번거로움이 있을 뿐 아니라 프로세스 관리가 수월하지 못합니다. 따라서 systemd에 주키퍼를 등록하여 사용하도록 하겠습니다.


다음 명령어로 주키퍼용 systemd 파일을 만듭니다.


vi /etc/systemd/system/zookeeper.service


그리고 아래 사진과 같이 내용을 채워줍시다. (systemd 서비스 파일에 대한 설명은 생략하겠습니다)




위와 같이 systemd 설정 파일을 만든 이후에는 systemd 재시작을 위하여 다음 명령어로 daemon-reload를 해주어야 합니다.


systemctl daemon-reload



여기까지의 작업을 세 개의 호스트 zk001, zk002, zk003 전부 끝마쳤다면 주키퍼 서버를 시작하고 부팅 시 자동 시작 설정을 해보겠습니다.



systemctl start zookeeper.service

systemctl enable zookeeper.service

systemctl status zookeeper.service


위 명령의 결과로 아래와 같이 active(running) 및 enabled 설정이 되어 있다면 정상적으로 실행 및 설정이 된 것입니다.







3. 카프카 설치



카프카 설치 과정은 주키퍼 설치 과정과 네트워크 및 환경 설정과 자바 설치 과정은 동일합니다.

따라서 해당 내용은 생략하겠습니다. 물론, 글에서 생략한다고 호스트에서 설정 및 설치 과정 또한 생략해도 되는 것은 아닙니다.

(그러니 위 내용 보면서 꼭 진행해 주세요)



단 설치 과정에서 kf001 호스트는 다른 호스트와 조금 다르기 때문에 혹시 모르는 마음으로 제가 설정한 사진은 첨부하겠습니다.

물론 그대로 따라할 필요는 전혀 없고, 그저 추후 IDE 설치를 위한 GUI가 있으면 되는 것이니 원하시는 대로 설치해도 무방합니다.







이제 본격적으로 카프카 설치 과정을 보겠습니다. 해당 링크에 들어가 보면 포스팅 시점에 1.1.1 버전이 나와있는 상태입니다. 1.1.1의 릴리즈 노트를 보면 버그 픽스들이 꽤 되어있기 때문에 1.1.1을 사용해도 좋겠지만, 우선 1.1.0 버전으로 받겠습니다. 또한 스칼라 버전은 자신이 특별히 2.12 스칼라를 사용하는 것이 아니라면 2.11을 공식 홈페이지에서 추천하고 있으니 2.11 버전으로 다운로드 받겠습니다.


cd /usr/local

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

tar zxf kafka_2.11-1.1.0.tgz

ln -s kafka_2.11-1.1.0 kafka



위와 같은 명령의 결과 다음과 같은 /usr/local 디렉토리에서의 ls 결과를 볼 수 있습니다.




이 후엔 카프카 환경설정을 할 차례입니다. 주키퍼에서 myid를 설정한 것처럼 카프카에서는 브로커 id를 설정해줘야 합니다. 마찬가지로 kf001은 브로커 아이디 1, kf002는 2, kf003은 3으로 설정해주시면 됩니다.


또한 카프카에서도 애플리케이션에서 사용할 저장 디렉토리를 준비해야 합니다. 만약 서버에 여러 대의 디스크가 있고 I/O를 분산하고 싶다면 디스크 수만큼 디렉토리를 만들어줘야 디스크 별 I/O 분산이 가능합니다. 여기서는 참고 서적과 비슷하게 하나의 디스크에서 두 개의 저장 디렉토리를 사용하는 방식을 사용하겠습니다. (하나만 만들어도 상관 없습니다.)


mkdir -p /data1

mkdir -p /data2



이 후 카프카 환경설정을 수정해야 하는데, 설정 파일에 대한 상세한 내용과 주키퍼 지노드 구성 및 운영 이슈는 해당 글이 아닌 번역 글 등에서 다루겠습니다.


우선 다음 명령어로 환경설정 파일을 열겠습니다.


vi /usr/local/kafka/config/server.properties



여기서 broker.id, log.dirs, zookeeper.connect를 바꿔줘야 합니다. vim의 커맨드 모드에서 /를 누르고 검색할 문장을 치고 엔터를 누르면 해당 라인으로 이동하니 참고하시기 바랍니다. 수정한 결과는 다음과 같게 해주시면 됩니다.


broker.id=자신의 브로커 아이디 (kf001이라면 1, kf002라면 2, kf003이라면 3)

log.dirs=/data1,/data2 (만약 위에서 저장 디렉토리를 하나만 만들었다면 하나만 입력하셔도 됩니다.)

zookeeper.connect=pr0gr4m-zk001:2181,pr0gr4m-zk002:2181,pr0gr4m-zk003:2181/pr0gr4m-kafka



이 후 실습의 원활함을 위하여 카프카 애플리케이션이 사용하는 기본 포트 9092를 열어줍니다.


firewall-cmd --permanent --add-port=9092/tcp

firewall-cmd --reload


세 호스트가 모두 여기까지 진행되었다면 이제 카프카를 정상 실행할 수 있습니다. 하지만 주키퍼 때와 같은 이유로 systemd에 등록하여 실행하겠습니다.


vi /etc/systemd/system/kafka.service


세 클러스터 모두 아래와 같이 등록해주시면 됩니다.




등록이 완료되었다면 주키퍼때와 마찬가지로 systemd 재시작을 해줍니다.


systemctl daemon-reload



이 후 카프카를 시작하고 상태를 보면 정상적으로 작동하는 것을 볼 수 있습니다.


systemctl start kafka.service

systemctl status kafka.service



위 명령의 결과 아래와 같이 active (running)이 나오면 정상 작동하는 것입니다. (enable로 부팅 시 자동 실행은 선택해서 진행하시면 됩니다.)





그럼 이제 주키퍼와 카프카가 정상적으로 실행 및 연결되었는지 확인하기 위하여 zk001 호스트에서 확인해보겠습니다. 주키퍼 CLI로 접속하기 위하여 /usr/local/zookeeper/bin/zkCli.sh를 실행한 후 다음 명령들을 쳤을 때 정상적인 출력결과가 나온다면 성공한 것입니다.


/usr/local/zookeeper/bin/zkCli.sh

ls /

ls /pr0gr4m-kafka/brokers/ids



카프카 환경설정 파일에서 주키퍼 정보 입력 시에 지노드 이름을 pr0gr4m-kafka라고 설정하였기 때문에 카프카 서비스가 시작되면서 자동으로 pr0gr4m-kafka 지노드가 생성된 것을 `ls /` 명령을 통해 볼 수 있습니다. 또한 `ls /pr0gr4m-kafka/brokers/ids` 명령 시 연결된 카프카 클러스터의 브로커 아이디 리스트를 볼 수 있습니다. 위 사진에서 정상적으로 1, 2, 3 세 서버가 모두 접속한 것을 볼 수 있습니다.



여기까지 왔다면 카프카 설치 및 실행은 모두 끝난 것입니다. 하지만 실행만 하고 끝내긴 조금 아쉬우니 카프카에서 제공해주는 명령어를 이용하여 정상 동작 여부를 살펴보겠습니다.


각 명령어에 대한 세부 설명은 다른 장들에서 하기로 하고, 명령어와 그 결과를 보기로 합시다.



가장 먼저 아래 그림과 같은 명령어로 카프카의 토픽을 생성합니다. Created topic "토픽 이름" 이 결과로 나온다면 정상적으로 생성된 것입니다.




그리고 방금 생성된 토픽의 정보를 다음 명령어로 볼 수 있습니다.




이제 생성된 토픽에 메시지를 Publish하기 위하여 다음 명령어로 콘솔 프로듀서를 실행시킵니다.




정상적으로 실행되었다면 '>' 라는 프롬프트가 나올 것인데, 여기에 원하는 메시지를 다 입력했다면 Ctrl + C를 눌러 종료하시면 됩니다. 저는 두 개의 메시지를 입력하였습니다.




마지막으로 저장된 메시지를 Subscribe 하기 위하여 콘솔 컨슈머를 다음과 같은 명령어로 실행하겠습니다.



위와 같이 입력한 메시지가 나오면 성공적으로 저장 및 관리가 된 것입니다.



이상으로 카프카 설치 및 체험 실습 1차 포스팅을 마치겠습니다.

다음 실습에서는 카프카 프로듀서에 대해서 좀 더 자세히 알아볼 수 있는 내용을 진행하겠습니다.



p.s. 오탈자 및 오류 지적은 언제나 환영합니다.

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

[번역] Kafka 시작하기 #1  (0) 2018.07.24