2023.04.04 - [BigData] - [Apache Kafka] 카프카(Kafka) 설치에 대하여
분산 애플리케이션을 사용하게 되면, 분산 애플리에이션 관리를 위한 안정적인 코디네이션 애플리케이션이 추가로 필요로 하게 됩니다.
주키퍼(zookeeper)는 본래 하둡의 서브 프로젝트 중 하나였습니다.
대용량 분산 처리 애플리케이션인 하둡은 중앙에서 분산 애플리케이션을 관리하는 코디네이션 애플리케이션이 필요했기에 서브 프로젝트로서 주키퍼 개발 작업을 진행했습니다.
카프카는 분산 애플리케이션의 한 종류로서 주키퍼를 코디네이션 로직으로 이용하고 있습니다.
주키퍼는 분산 애플리케이션을 위한 코디네이션 시스템입니다. 분산 애플리케이션이 안정적인 서비스를 할 수 있도록 분산되어 있는 각 애플리케이션의 정보를 중앙에 집중하고 구성 관리, 그룹 관리 네이밍, 동기화 등의 서비스를 제공합니다.
주키퍼 서버들과 각각 클라이언트(분산 애플리케이션) 커넥션을 맺은 후 상태 정보 등을 주고받게 됩니다.
상태 정보들은 주키퍼의 지노드라고 불리는 곳에 키-값 형태로 저장하고, 지노드에 키-값이 저장된 것을 이용하여 분산 애플리케이션들은 서로 데이터를 주고받게 됩니다.
주키퍼에서 사용되는 지노드는 데이터를 저장하기 위한 공간 이름을 말하는 것입니다.
주키퍼 다운로드
주키퍼 다운로드를 위해 아파치 주키퍼(https://zookeeper.apache.org/) 사이트로 이동합니다.
위의 사진처럼 Getting Started의 두 번째 Download를 클릭합니다.
위의 사진 처럼 Apache ZooKeeper 3.7.0를 클릭합니다.
위의 사진처럼 Apache ZooKeeper 3.7.0 을 다운로드하기 위한 url를 빨간색 선을 복사합니다.
그다음 리눅스 서버에서 주키퍼를 다운로드합니다.
## root 권한
sudo -s
## /usr/local 경로설정
cd /usr/local
## 주키퍼 다운로드
wget https://mirror.navercorp.com/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
## 주키퍼 압축해제
tar zxf apache-zookeeper-3.7.0-bin.tar.gz
버전 정보가 있는 폴더 형태를 그대로 사용하기보다는 심볼릭 링크를 생성해 사용하는 것이 좋습니다.
ex) 배포 스크립트 등에 설정되어 있는 경로를 모두 변경해야 하기 때문
## 심볼릭 링크 생성
ln -s apache-zookeeper-3.7.0-bin zookeeper
## 심볼릭 링크 확인
ls -al
## 출력
lrwxrwxrwx 1 root root 26 6월 9 22:39 zookeeper -> apache-zookeeper-3.7.0-bin
주키퍼는 애플리케이션에서 별도의 데이터 디렉토리를 사용합니다.
이 디렉토리에는 지노드의 복사본인 스냅샷과 트랜잭션 로그들이 저장됩니다.
중요한 디렉토리이기 때문에 설치 경로와는 다른 경로로 설정하는 것이 바람직합니다.
## 디렉토리 생성
mkdir -p /data
앙상블 내 주키퍼 노드를 구분하기 위한 ID를 생성해야 합니다.
주키퍼에서는 myid라고 부르며 정수 형태로 만들어야 합니다.
## 주키퍼 노드 id 생성
echo 1 > /data/myid
## 내용 확인
cat /data/myid
## 출력
1
주키퍼의 환경설정 파일
주키퍼의 환경설정 파일 이름은 zoo.cfg 입니다.
## 주키퍼 환경설정
vi /usr/local/zopokeeper/conf/zoo.cfg
tickTime = 2000 ## 주키퍼가 사용하는 시간에 대한 단위
initLimit = 10 ## 팔로워가 리더와 초기에 연결하는 시간에 대한 타임아웃 tick의 수
syncLimit = 5 ## 팔로워가 리더와 도ㅓㅇ기화 하는 시간에 대한 타임아웃 tick의 수
dataDir = /data ## 주키퍼의 트랜잭션 로그와 스냅샷이 저장되는 데이터 저장 경로입니다.
clientPort = 2181 ## 주키퍼 사용 TCP 포트
## 주키퍼 앙상블 구성을 위한 서버 설정이며, server.myid 형식으로 사용합니다.
server.1 = peter-zk001:2888:3888
주키퍼 실행
주피커를 실행하기 위해서 주피커에서 제공하는 start 명령어를 사용합니다.
## 주피커 실행 명령어
/usr/local/zookeeper/bin/zkServer.sh start
주피커를 중지하려면 stop 명령어를 사용합니다.
## 주피커 중지 명령어
/usr/local/zookeeper/bin/zkServer.sh stop
[부록] systemd 설정
효율적으로 프로세스들을 관리하기 위한 방법으로 여러 프로세스들을 systemd에 등록해 운영할 수 있습니다.
주키퍼용 systemd 파일을 만들어 보도록 하겠습니다.
## systemd 파일
vi /etc/systemd/system/zookeeper-server.service
[Unit]
Description = zookeeper-server ## 해당 유닛에 대한 상세한 설명
After = network.target ## 유닛이 시작되는 순서를 조정하며 after 이후에 지정된 유닛이 실행된 후 시작
[Service]
Type = forking ## ExecStart에 영향을 주는 유닛 프로세스가 시작되며, simple, forking, oneshot, idle이 있습니다.
User = root
Group = root
SyslogIdentifier = zookeeper-server ## syslog 에서 구분하기 위한 이름
WorkingDirectory = /usr/local/zookeeper ## 실행되는 프로세스의 작업 디렉토리를 설정
Restart = always ## 프로세스가 종료된 후 재시작합니다.
RestartSec = 0s
ExecStart = /usr/local/zookeeper/bin/zkServer.sh start ## 서비스가 시작될 때 실행할 명령어 또는 스크립트를 설정
ExecStop = /usr/local/zookeeper/bin/zkServer.sh stop ## 서비스가 정지될 때 실행할 명령어 또는 스크립트를 설정
/etc/systemd/system/zookeeper-server.service 에 위의 내용을 넣습니다.
그 후에 systemd를 반드시 재시작을 해야 합니다.
재시작하는 명령어는 아래와 같습니다.
## systemd 재시작 명령어
systemctl daemon-reload
이제 주키퍼를 시작해 보겠습니다.
시작 명령어는 systemctl start 유닛명입니다.
## 유닛 시작
systemctl start zookeeper-server.service
## 유닛 중지
systemctl stop zookeeper-server.service
## 유닛 재시작
systemctl restart zookeeper-server.service