이 문서는 저번의
https://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html#Administrative_commands 의 수동 절체 다음인, 자동 절체에 대해 설명한다.
위 링크에 "Automatic Failover" 섹션을 보면
자동절체는, 주키퍼와, ZKFailoverController(약자 ZKFC) 라는 프로세스를 HDFS에 적용을 해야한다고 나와있다.
각각의 기능은 아래와 같지만, 실질적으로 그냥 감시프로세스이고, 독자적인 마스터 선출 프로세스가 있는듯 하다.
혹 나중에 기회가된다면, 선출 프로세스에 대해 다루고 이 글에 링크를 첨부해놓겠다.
1. 주키퍼는 아래와 같은 기능을 수행한다.
Failure detection : 네임노드를 감시하여 시스템을 감시한다.
Active NameNode election : 네임노드가 죽었을시, 그 다음 네임노드 후보를 선출한다.
2. ZKFC는 아래와 같은 기능을 수행한다.
Health monitoring : 상태 모니터링
ZooKeeper session management : 주키퍼의 세션관리
ZooKeeper-based election : 주키퍼 기반의 선거
그러니까, 결국은 주키퍼를 설치를 해야한다는 건데,
"The setup of ZooKeeper is out of scope for this document."
자신들의 설명 범위를 벗어나므로, 알아서 설치하라고 한다.
일단 급하게 설치를 해보자
공식 링크는 https://zookeeper.apache.org/doc/current/zookeeperStarted.html 이다.
< 번외 : zookeeper 설치 >
1. 적당한 디렉토리를 만들고, 홈페이지에서 다운로드를 받는다. ( 네임노드 전체에 적용되는 사항이다. )
[root@NN1 hadoop]# mkdir /zookeeper [root@NN1 hadoop]# [root@NN1 hadoop]# cd /zookeeper/ [root@NN1 zookeeper]# wget http://apache.tt.co.kr/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz --2018-05-06 12:48:49-- http://apache.tt.co.kr/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz Resolving apache.tt.co.kr... 211.47.69.77 Connecting to apache.tt.co.kr|211.47.69.77|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 35042811 (33M) [application/x-gzip] Saving to: `zookeeper-3.4.10.tar.gz' 100%[============================================================================================>] 35,042,811 2.45M/s in 11s 2018-05-06 12:49:01 (2.92 MB/s) - `zookeeper-3.4.10.tar.gz' saved [35042811/35042811]
2. 압축을 풀고, 디렉토리에 들어가면 conf 디렉토리 안에 zoo_sample.cfg 파일이 있다. 이걸 복사해서 zoo.cfg로 복사하자.
그리고 실행
[root@NN1 conf]# cp zoo_sample.cfg zoo.cfg [root@NN1 conf]# cd .. [root@NN1 zookeeper-3.4.10]# bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
bin/zkCli.sh -server 127.0.0.1:2181 를 이용하면 커멘드로 접이 가능하다.
접속이 되는지 까지만 테스트해보고 종료하자. ( bin/zkServer.sh stop )
지금은 클러스터를 구축하는것이기때문에, 방금의 zoo.cfg에 아래와 같은 설정을 추가한다.
server.1=NN1:2888:3888
server.2=NN2:2888:3888
문제는 이렇게 하고 시작을 하니 잘 되던 프로세스가 뜨질 않는다.
zookeeper.out 에 로그가 남아있어서 확인을 해보니
"No server failure will be tolerated. You need at least 3 servers." 라는 메시지를 남겼다.
그렇다고 네임서버를 한개를 더 늘릴순 없으니 hosts 파일에 가상의 ip를 하나 추가하고
server.1=NN1:2888:3888
server.2=NN2:2888:3888
server.3=NN3:2888:3888
그러고 다시 시작하니 이번엔 이런 에러가 뜬다.
"legalArgumentException: /tmp/zookeeper/myid file is missing"
문서 아래부분에도 myid값에 대해서 설명을 하고있는데 그냥 각 서버 번호별로 아스키 번호만 넣으면 될듯하다.
The entries of the form server.X list the servers that make up the ZooKeeper service.
When the server starts up, it knows which server it is by looking for the file myid in the data directory.
That file has the contains the server number, in ASCII.
echo 1 > /tmp/zookeeper/myid // 1번 네임노드
echo 2 > /tmp/zookeeper/myid // 2번 네임노드
3. 시작
[root@NN2 zookeeper-3.4.10]# bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@NN2 zookeeper-3.4.10]# [root@NN2 zookeeper-3.4.10]# [root@NN2 zookeeper-3.4.10]# netstat -anp | grep 2181 tcp 0 0 :::2181 :::* LISTEN 3648/java
일단 프로세스를 올리는데는 성공했다.
동작확인은 간단하다
양 서버에서 bin/zkCli.sh -server 127.0.0.1:2181 로 접속한다음,
// 1번서버에서 아래와 같이 생성을 했을때
[zk: 127.0.0.1:2181(CONNECTED) 5] create /zk_test my_data
Created /zk_test
// 2번서버에서 이렇게 생성된게 보이면 성공
[zk: 127.0.0.1:2181(CONNECTED) 0] ls /
[zookeeper, zk_test]
주키퍼 설치가 끝났으니, 다시 하둡으로 돌아온다.
< / 번외 END >
우선 모든 하둡 클러스터가 실행중이라면 모두 종료시킨다.
그리고 hdfs-site.xml 에
dfs.ha.automatic-failover.enabled true
core-site.xml 에
ha.zookeeper.quorum NN1:2181,NN2:2181,NN3:2181
를 추가한다.
그리고 나서, zkfc를 네임노드중 한곳에서 초기화 시킨다.
$HADOOP_PREFIX/bin/hdfs zkfc -formatZK
그리고 zkfc 를 시작
$HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc
준비가 다 끝났으니, 평소처럼
$HADOOP_PREFIX/sbin/start-dfs.sh
$HADOOP_PREFIX/sbin/start-yarn.sh
명령어로 시작을 한다.
이번에는 수동 절체때와는 다르게, 하나가 active 인 상태로 시작한다.
절체 테스트 방법은 엑티브 상태의 하둡을 정지시켰을때, 자동으로 다른 서버가 엑티브로 변환되는지 보면 된다.
이 테스트는 동영상으로 남겨두었다.