일상의 정리

Zookeeper 설치

Hadoop/설치

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