Zookeeper 설치
Apache ZooKeeper는 탄력적이고 안정적인 분산 조정을 가능하게하는 오픈 소스 소프트웨어입니다. 일반적으로 분산 시스템에서 구성 정보, 이름 지정 서비스, 분산 동기화, 쿼럼 및 상태를 관리하는 데 사용됩니다. 또한 분산 시스템은 ZooKeeper를 사용하여 합의, 리더 선택 및 그룹 관리를 구현합니다.
RHEL/CentOS 8에 Zookeeper를 설치하는 방법을 정리해 봅니다.
1. 서버 기본 설정
각 서버의 공통 설정은 Hadoop 설치를 참고합니다.
2. Zookeeper 설치
2.1 zookeeper 사용자 생성
보안을 생각해서 별도의 zk 사용자를 생성합니다.
아래 명령어로 새로운 사용자를 생성하고 암호를 설정해 줍니다:
useradd zk
passwd zk
이후에 아래와 같이 sshd_config를 수정해서 sshd를 통해 로그인이 불가능하도록 합니다.:
vi /etc/ssh/sshd_config
내용을 아래와 같이 수정합니다.
PermitRootLogin no
DenyUsers zk
아래와 같이 sshd 를 재시작합니다.
systemctl restart sshd
2.2 zookeeper 데이터 디렉토리 생성
zookeeper 가 사용하는 데이터 디렉토리를 생성합니다.
mkdir -p /data/zookeeper
chown zk:zk /data/zookeeper
2.3 zookeeper 다운로드
아래와 같이 zookeeper 최신 버전을 다운로드 합니다. 바이너리 버전을 다운로드해야 합니다.
wget http://mirror.kakao.com/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
2.3 zookeeper 압축 해제
/opt 디렉토리에 zookeeper 를 압축해제 합니다.
cd /opt
tar xvzf apache-zookeeper-3.6.1-bin.tar.gz
압축 해제 후 아래와 같이 사용자 권한을 설정해 줍니다.
chown -R zk:zk apache-zookeeper-3.6.1-bin
ln -s apache-zookeeper-3.6.1-bin zookeeper
chown -h zk:zk zookeeper
2.3 zookeeper 설정 파일 생성
아래 명령으로 설정 파일을 편집합니다.
vi /opt/zookeeper/conf/zoo.cfg
아래 내용으로 입력하고 저장합니다.
initLimit=5
syncLimit=2
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
위에서 각각의 내용은 다음과 같습니다.
tickTime: tick 길이를 밀리 초 단위로 설정합니다.
tick은 ZooKeeper에서 하트 비트 사이의 길이를 측정하는 데 사용하는 시간 단위입니다.
최소 세션 시간 제한은 tickTime의 두 배입니다.
dataDir: 메모리 내 데이터베이스의 스냅샷 및 업데이트를위한 트랜잭션 로그를 저장하는 데 사용되는 디렉터리를 지정합니다.
트랜잭션 로그에 대해 별도의 디렉터리를 지정하도록 선택할 수 있습니다.
clientPort: 클라이언트 연결을 수신하는 데 사용되는 포트입니다.
maxClientCnxns: 최대 클라이언트 연결 수를 제한합니다.
3. Zookeeper 시작 및 테스트
3.1 zookeeper 서비스 시작
아래 명령어로 zk 사용자로 전환 후 zookeeper 디렉토리로 갑니다.
su -l zk
cd /opt/zookeeper
아래와 같이 zkServer.sh 명령을 실행합니다.
bin/zkServer.sh start
아래와 같은 실행결과가 화면에 표시되면 정상입니다.
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
3.2 zookeeper 테스트
아래 명령어로 로컬 ZooKeeper 서버에 접속합니다.
bin/zkCli.sh -server 127.0.0.1:2181
아래와 같이 CONNECTED 프롬프트가 나오면 정상입니다.
Connecting to 127.0.0.1:2181
...
...
[zk: 127.0.0.1:2181(CONNECTED) 0]
위 프롬프트에서 help 명령어를 입력하고 엔터를 칩니다. 그럼 아래와 같이 표시됩니다.
[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
3.2 zookeeper 서비스 종료
아래 명령어로 ZooKeeper 서비스를 종료합니다.
bin/zkServer.sh stop
4. Zookeeper 시스템 서비스 파일 생성
systemd 서비스를 이용해서 시작/종료를 할 수 있도록 서비스 파일을 생성합니다.
아래 명령어로 시스템 서비스 파일을 편집합니다.
sudo vi /etc/systemd/system/zk.service
아래 내용을 입력합니다.
[Unit]
Description=Zookeeper Daemon
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/zookeeper
User=zk
Group=zk
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure
[Install]
WantedBy=default.target
이제 다음 명령어로 ZooKeeper를 실행해 봅니다.
sudo systemctl start zk
아래 명령으로 정상적으로 실행 중인지 확인 합니다.
sudo systemctl status zk
정상적으로 실행이 되면, 시스템이 부팅 시에도 자동으로 실행되도록 아래와 같이 등록해 줍니다.
sudo systemctl enable zk
싱글 노드에서의 설치는 완료 되었으므로, 멀티 노드 설정 전에 다음 명령으로 서비스를 종료합니다..
sudo systemctl stop zk
4. Zookeeper 멀티 노드 설정
이제 멀티 노드 설정을 해야 합니다. ZooKeeper 는 홀수대의 노드로 구성을 해야 하므로, 3대 혹은 5대와 같이 구성을 합니다. 여기서는 3대 구성을 설명합니다.
위의 싱글노드 설정을 모든 노드에 대해 한 이후에 아래와 같이 설정을 추가합니다.
아래 명령어로 설정파일을 편집합니다.
sudo vi /opt/zookeeper/conf/zoo.cfg
아래 내용을 입력합니다.
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
initLimit=10
syncLimit=5
server.1=your_zookeeper_node_1:2888:3888
server.2=your_zookeeper_node_2:2888:3888
server.3=your_zookeeper_node_3:2888:3888
설정이 완료되면 각각의 노드의 /data/zookeeper 아래 myid 라는 파일을 생성하고 차례대로 1, 2, 3 과 같이 입력해 줍니다.
아래 명령어로 myid파일을 생성합니다.
sudo vi /data/zookeeper/myid
아래와 같이 각각의 노드에 따라 숫자를 입력해 줍니다.
1번째 노드
1
2번째 노드
2
3번째 노드
3
5. Zookeeper 멀티 노드 테스트
먼저 1번 2번 노드에서 아래 명령으로 로컬에 접속합니다.
bin/zkCli.sh -server 127.0.0.1:2181
노드 1에서 아래 명령을 입력합니다.
[zkshell:] create /zk_znode_1 sample_data
노드 1에서 다음 명령으로 생성된 내용을 확인해 봅니다.
[zkshell: ] get /zk_znode_1
노드 2에서 다음 명령으로 생성된 내용을 확인해 봅니다.
[zkshell: ] get /zk_znode_1
노드 1, 노드 2 양쪽 모두 동일한 결과가 나와서 동기화가 되는 것을 확인하면 정상입니다.
아래 명령으로 znode를 삭제해 줍니다.
[zkshell: ] delete /zk_znode_1