하둡이 2.0 으로 올라가기 전에는
네임노드가 죽었을경우, 네임노드가 다시 시작되거나
별도의 시스템에서 네임노드가 대체 실행될때까지 클러스터 전체를 사용할 수 없었다고 한다.
그래서 2.x대에는 Active/Passive 단위로 HA를 지원하여,
Active 네임노드가 죽었을 경우, failover를 통해 장애를 조치할 수 있다.
즉, 이 테스트를 위해서는 총 두개의 개별 네임노드 서버가 필요하고,
이 중 하나는 항상 대기상태에 있게된다.
하지만 안타깝게도, 두 노드가 HA를 유지하려면, 공유 저장장치 디렉토리( NFS 등 )에 서로 엑세스가 되어야한다.
차 후 개선된다고는 하나, 2.7.5 에서는 그러하다.
이 문서를 보면, 수동으로 장애를 조치하는 방법(manual failover)을 먼저 설명하고있지만
자동으로 장애를 조치하는 ZooKeeper 라는 컴포넌트를 이용하여 구성이 가능하다.
어차피, Zookeeper 라는것은 에코시스템중 하나이므로 해당 컴포넌트 없이 HA를 구성해보자.
일단 고가용성을 테스트하기 위해서는 기존 하둡 시스템을 변화시켜야한다.
필자의 경우, 데이터노드도 하나고, 네임노드도 하나라 데이터노드부터 늘려본다.
확장된 네임노드까지 적용한 hosts 파일 내용은 아래와 같다.
192.168.192.10 NN1
192.168.192.11 NN2 ( 네임노드 추가 서버 )
192.168.192.20 DN1
192.168.192.21 DN2
192.168.192.22 DN3
이번에는 네임노드를 수정하는것이기 때문에
두개의 네임노드 서버의 환경만 수정하면 된다.
편집 : hdfs-site.xml
# dfs.nameservices : 네임노드 서비스의 논리적 이름
dfs.nameservices name> mycluster value> property>
# 각 네임노드의 고유한 식별자 이름
# 뒤에 붙는 namenodes.mycluster는 위에 있는 서비스 value를 따른다.
dfs.ha.namenodes.mycluster name> <값> nn1, nn2 값> property>
# 각 네임노드의 주소를 세팅한다.
dfs.namenode.http-address.mycluster.nn1 name> NN1:50070 value> property> dfs.namenode.http-address.mycluster.nn2 name> NN2:50070 value> property>
그리고 위에 언급된 것처럼 , 공용으로 사용될 디스크가 필요한데,
필자의 경우 NFS 서비스를 이용하여 구현하였다.
# NFS 구축
- nfs 용 서버를 하나 추가했다. ( 192.168.192.30 ) 각 네임노드 서버의 /etc/hosts 파일 안에 반영한다.
192.168.192.30 FS
1. FS 서버에서 실행
- 공유 디렉토리 생성
mkdir /shared
- /etc/exports 편집 ( ip 대역정도만 신경쓰면 되고, 자세한 옵션은 따로 nfs 관련 문서를 찾아보시길 )
/shared 192.168.192.0/255.255.255.0(rw,sync,no_root_squash)
- 서비스 시작
service nfs restart
- 테스트용 파일 생성
touch /shared/test.txt
2. 네임노드 서버에서 실행
[root@NN1 ~]# mkdir /nfs
[root@NN1 ~]# mount -t nfs FS:/sheard /nfs
[root@NN1 ~]# mount | grep nfs <- mount 되었는지 확인
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
FS:/sheard on /nfs type nfs (rw,vers=4,addr=192.168.192.30,clientaddr=192.168.192.10)
[root@NN1 ~]# ls /nfs <- 제대로 연동이 되었는지 확인
test.txt
* 재부팅시에도 등록되게 하려면 /etc/fstab을 수정하면 되나, NFS 서버에 문제가 생기면 부팅에 문제가 생길때도 있다.
쓰기 조심스러운 설정이므로 NFS 설정을 쓴다면 관련 자료를 찾아보길
NFS 구성 뒤 나머지 설정이다.
dfs.namenode.shared.edits.dir file:///nfs/[클러스터노드명] dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files /root/.ssh/id_rsa
이제 실제 HA가 잘 작동하는지 실행해본다.
1. 초기화
- 네임노드도 복사를 한 시스템이니, 전부 클리어를 하고 시작한다.
./bin/hdfs namenode -format
- 그 다음은, HA가 아닌 클러스터를 HA를 사용하도록 하기 위해, 아래 명령을 실행한다.
./bin/hdfs namenode -initializeSharedEdits
2. 실행
- 실행법은 그냥 클러스터일때랑 같다.
$HADOOP_PREFIX/sbin/start-dfs.sh 와
$HADOOP_PREFIX/sbin/start-yarn.sh 을 실행하면 된다.
3. 확인
- 우선 기본적으로 두개의 네임노드는 다 스탠바이 상태이다.
- 공식링크에 보면 아래와 같은 수동 절체 방법에 대해 설명을 한다.
Deployment details
After all of the necessary configuration options have been set, one must initially synchronize the two HA NameNodes’ on-disk metadata.
-
If you are setting up a fresh HDFS cluster, you should first run the format command (hdfs namenode -format) on one of NameNodes.
-
If you have already formatted the NameNode, or are converting a non-HA-enabled cluster to be HA-enabled, you should now copy over the contents of your NameNode metadata directories to the other, unformatted NameNode by running the command “hdfs namenode -bootstrapStandby” on the unformatted NameNode. Running this command will also ensure that the shared edits directory (as configured by dfs.namenode.shared.edits.dir) contains sufficient edits transactions to be able to start both NameNodes.
-
If you are converting a non-HA NameNode to be HA, you should run the command “hdfs -initializeSharedEdits”, which will initialize the shared edits directory with the edits data from the local NameNode edits directories.
At this point you may start both of your HA NameNodes as you normally would start a NameNode.
You can visit each of the NameNodes’ web pages separately by browsing to their configured HTTP addresses. You should notice that next to the configured address will be the HA state of the NameNode (either “standby” or “active”.) Whenever an HA NameNode starts, it is initially in the Standby state.
- 그러므로... NN1을 기본적으로 active 로 변환시키고,
getServiceState 명령어로 노드들의 상태를 확인.
[root@NN1 hadoop-2.7.5]# ./bin/hdfs haadmin -transitionToActive NN1 [root@NN1 hadoop-2.7.5]# ./bin/hdfs haadmin -getServiceState NN1 active [root@NN1 hadoop-2.7.5]# ./bin/hdfs haadmin -getServiceState NN2 standby [root@NN1 hadoop-2.7.5]#
- 그러면 아래와 같이 ACTIVE로 변하는것을 볼 수 있다.
- 맞는 테스트방법인지는 모르겠지만, 그 아래 항목에는 주키퍼를 통한 자동절체에 대해 설명을 하고있는데,
해당 내용은 다른 포스트에 다루도록 하겠다.
- 아, 또 다른 문제점이 있는데
데이터노드가 네임노드의 IP를 볼때 절체된 NN2의 IP를 몰라서, 네임노드가 잡히지 않는 현상이 있다.
위 문서에는 데이터노드에 대한 언급은 없지만, 아마 가상ip등을 활용한 스위칭 기술을 사용해야 정상적인 연결이 될 듯 하다.