Dec9th's Opslog

Zookeeper 설치

Tested all on Amazon linux2

Overview

Zookeeper는 분산 코디네이션으로 사용되는 OpenSource proeject 중 하나 입니다. 저 같은 경우엔 주로 접근 이후 잘 변경되지 않은 User Session 및 TCP Socket 등을 사용하는 서버 관리를 위해 사용하고 있습니다. google에서 검색되는 성능 관련 몇몇의 post들을 보면 Read/Write 비율 1/9 비율로 사용하는 것이 좋다고 이야기합니다. 성능 테스트에 덧붙여 Snapshot 남기는 것 역시 부하이기에 최소화 시키기 위하여 Write 비율이 낮고 세션 변경 확인을 위한 잦은 Read를 하게되는 세션서버노드관리 의 경우 추천 드립니다. 본 건에 대해서 어떻게 쓰면 좋을지에 대해서 언젠가 별도 chatting code와 함께 사용 리뷰하도록 할 계획입니다….. 언젠가…

사전 조건

Server 3대로 Cluster(앙상블)을 구성합니다.(단일 서버로도 가능)

Hostname IP
zk01 10.1.1.101
zk02 10.1.1.102
zk03 10.1.1.103

미리 Security Groups(or Firewall, ACL, IPtables) 등의 접근 제어가 되고 있다면 아래 참고하셔서 미리 허용이 필요합니다.

Port Comment
2181 Service port
2888 Leader port
3888 Follow port

그리고 모든 명령어는 모든 서버에 동일하게 입력하시면 됩니다. (myid만 예외)

Installation

1. 작업 디렉토리 생성

전 보통 /app 위에 Application을 별도 관리하고 있습니다, 변경을 원할 경우 입맛에 맞게 변경하셔도 좋습니다.

# Zookeeper in /app
mkdir /app
cd /app

# Zookeeper data Directroy 
mkdir -pv /data1/zookeeper

# Zookeeper needs Java, netcat 
yum -y install java-1.8.0-openjdk-devel nc

2. Download

이 글을 쓰는 시점에 3.4.11버전이 나와있는데요 Datadir 이슈가 있어서 쓰시면 안됩니다!

wget http://www-us.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
tar zxvf zookeeper-3.4.10.tar.gz
mv zookeeper-3.4.10 zookeeper

3. 설정 변경

시작 시 config가 없고 Cluster Mode를 사용하기 위해 아래와 같이 zoo_sample.cfg파일을 zoo.cfg파일로 변경 후 사용가능합니다.

cd zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

설정은 log 및 data 그리고 cluster 설정 정도 하고자 합니다. 아래와 같이 설정울 변경 및 추가하시면 됩니다.

...
dataDir=/data1/zookeeper
...
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
...
# Cluster 
server.1=10.1.1.101:2888:3888
server.2=10.1.1.102:2888:3888
server.3=10.1.1.103:2888:3888

OPTION 설명 :

4. myid 설정

클러스터링에 참여하는 주키퍼 서버는 1~255까지의 고유한 id를 가지고 있어야 합니다. dataDir 폴더에 myid 라는 파일을 만들고 서버의 번호를 기재 합니다.

The myid file consists of a single line containing only the text of that machine’s id. So myid of server 1 would contain the text “1” and nothing else. The id must be unique within the ensemble and should have a value between 1 and 255.

즉, Cluster 간 서로 식별을 위해 각기 다른 id를 가집니다. 아래와 같이 설정 할 수 있습니다.

echo 1 > /data1/zookeeper/myid
echo 2 > /data1/zookeeper/myid
echo 3 > /data1/zookeeper/myid

5. Heap 설정

Java Heap 설정은 JVM Default 설정을 따라갑니다. 필요없다면 안하시고 건너 뛰셔도 됩니다. 1GB일 경우 아마 1/4 계산해서 Max Heap(Xmx)를 256MB 잡습니다. memory가 1GB 밖에 없다면 아래 메모리를 더 작게 설정해야합니다. 언젠가 OutOfKill을 맛볼 수 있습니다.

echo 'export JVMFLAGS="-Xmx1024m"' | tee /app/zookeeper/conf/java.env

6. Zookeeper system log 설정

아마 zookeeper 기본 설정에는 안 보일텐데요. 실제 변경을 하려면 zkEnv.sh를 변경하면 되나 뭔가 여러 설정을 할 수 있는 zkEnv.sh을 변경하는 것을 추천 드리진 않습니다. zookeeper-env.sh를 기본적으로 읽어오긴 하나 실제 설치 파일 내 기본 제공되지 않기에 편하게 그냥 하나 만드시면 됩니다.

echo ZOO_LOG_DIR="/data1/zookeeper" | tee /app/zookeeper/conf/zookeeper-env.sh

7. manage zookeeper daemon

/app/zookeeper/bin/zkServer.sh start
/app/zookeeper/bin/zkServer.sh stop

본 과정으로 사실상 설치는 완료됩니다.

8. Check Zookeeper Server

zookeeper는 4개의 글자만 가지고 운영하도록 설계해두었습니다.

echo ruok | nc localhost 2181

# output: 
imok
echo mntr | nc localhost 2181

# output:
zk_version	3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
zk_avg_latency	0
zk_max_latency	0
zk_min_latency	0
zk_packets_received	3
zk_packets_sent	2
zk_num_alive_connections	1
zk_outstanding_requests	0
zk_server_state	follower
zk_znode_count	4
zk_watch_count	0
zk_ephemerals_count	0
zk_approximate_data_size	27
zk_open_file_descriptor_count	29
zk_max_file_descriptor_count	4096
echo conf | nc localhost 2181

# output:
clientPort=2181
dataDir=/data1/zookeeper/version-2
dataLogDir=/data1/zookeeper/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=1
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3888
quorumPort=2888
peerType=0
echo cons | nc localhost 2181

# output:
 /127.0.0.1:60930[0](queued=0,recved=1,sent=0)

이 외엔 거의 중복되며 watcher 부분만 watcher 사용 시 한번 확인해보면 좋습니다.

Production 간 제언

설정에 크게 기본에 벗어날 수 있는 부분은 Zookeeper가 생산할 수 있는 3가지의 데이터 및 로그가 있습니다. datadir에 남게되는 snapshot, datalogdir에 기록되는 transation log 그리고 나머지 하나인 Zookeeper system log가 ZOO_LOG_DIR 에 기록되는 부분이 있습니다. Zookeeper log를 제외하고 datalogdir, datalog의 경우엔 Disk Write에 영향을 미칠 수 있으니 production간 부하 관련 우려가 발생할 수 있기에 별도로 분리하는 것이 좋습니다. 본 글에서는 datalogdir을 다루진 않았습니다.

또 하나.. snapshot관리를 위해 autopurge.snapRetainCount, autopurge.purgeInterval 를 사용합니다. 특정버전에서 default가 적용되지 않아서 직접 설정해서 사용했던 기억이 있습니다. 실제 Disk size 고려하여 설정하셔도 되고 저 같은 경우 보험용으로 3개 정도만 적재해두고 있습니다. 세션용도로 사용하게 될 경우 서비스가 잘나갈경우 disk 관리가 부담스럽게 될 수 있습니다. 이런 경우 10개 이상 남길필요는 없으니 촘촘히 잘 설정하시기 바랍니다.

아래 Reference 내 zookeeper 공식 사이트 하단에 있는 Things to Avoid를 본 글에서 조금 다루었는데요. 본 글 이후 production 환경에서 사용을 위해 한번은 더 보시면 좋을 것 같습니다.

특성상 Write만 과하게 일으키지 않는다면 위에 대한 이슈는 없을 수 있습니다만 발뻣고 자기 위해 적당한 모니터링과 data* 설정을 통해 분리된 disk에 적재하시길 권고드립니다.

Reference

https://zookeeper.apache.org/doc/r3.4.2/zookeeperAdmin.html

http://kimseunghyun76.tistory.com/397

http://advent.perl.kr/2012/2012-12-24.html

http://over153cm.tistory.com/22

http://creatorw.tistory.com/52