BigData/Hadoop

Hadoop NameNode HA

kih5893 2022. 2. 19. 10:28

개요

 

Hadoop의 단점 중 하나는 NameNode(이하 NN)가 비정상 종료되었을 때이다.
기본적으로 DataNode를 확장하면 무한한(?) 확장을 할 수 있지만, NN에 문제가 생길 경우 여태껏 저장한 모든 데이터를 잃을 수 있을 정도로 치명적이다. 그렇기 때문에 이를 방지하고자 Hadoop도 버전업을 하면서 NN 이중화 기능이 추가되었다.


이중화

 

시스템 장애 등을 대비하기 위해 같은 시스템을 2개 이상으로 구성하여 장애 발생 즉시 대체하여 가용성을 유지하기 위한 구조이다. 중요한 장비일수록 이중, 삼중, 그 이상으로 구성하기도 한다.

동작 방식으로는 Active-Active와 Active-Standby가 있다.


NN 이중화

 

NN 이중화는 말 그대로 NN을 2개 이상을 만들어서 안정성을 확보하는 것이다. 동일한 서버에 구축하는 것은 큰 의미가 없으며, 2대의 서버를 활용해서 한대는 Active 한대는 Standby로 활용하여 장애 발생 시 전환을 해보고자 한다.


구성 및 설명

 

본 포스팅에서의 NN 이중화 테스트는 서버 2대를 사용해서 구성해보려고 한다. (서버 1대, 서버 3대로 구성하는 글은 많으나 2대로 구성하는 글은 보지 못했다. 당연히 3대 이상으로 구성하는 것이 안정성이 좋다.)

 

우선, 서버 2대를 사용하여 이중화 구성 시 아래 이미지와 모듈들이 올라간다.

 

NameNode 이중화 구성

 

각 모듈별 역할은 다음과 같다.

모듈 역할
QuorumPeerMain(Zookeeper) Active/Standby NameNode 정보 (상태 등) 저장
DFSZKFailoverController (zfkc) NameNode의 상태를 확인하여 Zookeeper에 저장
JournalNode Edit log를 저장하고 공유하는 기능을 수행
NameNode Active – Edit logJournalNode에 저장
Standby – JournalNode로부터 Edit log를 읽어 옴
DataNode Block 정보 저장 및 상태 체크(Heartbeat) 수행

설치 방법

 

서버 2대를 사용해서 설치를 진행한다. (편의상 각 서버는 서버 1, 서버 2로 표기한다.)

 

1. Hadoop 설치

 

Hadoop 설치는 아래의 링크를 사용해서 진행한다.

 

https://inoino9.tistory.com/entry/Hadoop-%EC%9D%84-%EC%84%A4%EC%B9%98%ED%95%B4%EB%B3%B4%EC%9E%90-standalone?category=845091

 

Hadoop 을 설치해보자 (단일서버)

목차 1. 하둡 사용을 위한 계정 생성 2. JDK 다운로드 3. hadoop 다운로드 4. ssh 구성 5. 환경설정 6. 실행 준비물 - 가상머신 (노트북, 데스크톱, 서버로 대체해서 설치 가능) - OS: CentOS 8 (CentOS 7 사용 가.

inoino9.tistory.com

2. Zookeeper 설치

 

본 포스팅에서는 다루지 않는다. (독립된 Apacke Zookeeper를 설치해서 사용했다.)

 

Hadoop과 Zookeeper를 설치했다면 본격적으로 이중화를 위한 구성을 시작해본다.

 

3. Zookeeper 설정 변경

 

서버 1에 설치된 주키퍼의 설정을 변경한다. 총 2가지를 진행한다.

zoo.cfg 변경, myid 설정

 

3.1. zoo.cfg

 

기본 설치된 zookeeper/conf 디렉터리에 zoo_sample.cfg을 이용해도 되고, 직접 생성해도 된다.

여기서는 zookeeper/conf/zoo.cfg 파일을 생성하여 진행하도록 한다. 아래와 같은 내용을 담아서 생성한다.

 

initLimit=5
syncLimit=2

dataDir=/test/zookeeper/data
server.1={서버 1번의 hostname}:2888:3888
server.2={서버 2번의 hostname}:2888:3888

server.3={서버 2번의 hostname}:2889:3889

 

- dataDir은 zookeeper 데이터가 저장될 경로를 기록한다.

 

- zookeeper로 구성할 서버의 개수와 맞게 작성하면 된다. 단, 서버 2에 2개의 주키퍼를 구성할 것이기 때문에 뒷부분의 포트(2888, 3888)가 중복되므로 server.2와 server.3의 포트를 상이하게 해 주었다.

 

3.2. myid

 

우선 서버 1에서 zoo.cfg까지 세팅이 되었다면 서버 1에 설치된 zookeeper를 서버 2로 복사해준다.

 

그리고 2개의 서버에서 아래와 같이 진행한다.

 

* 주의 사항: 서버 2는 2개의 zookeeper를 띄워서 사용할 것이기 때문에 zoo.cfg를 복사하여 zoo2.cfg를 만들어준다.

(그렇다면 서버 1에는 zoo.cfg 1개, 서버 2에는 zoo.cfg, zoo2.cfg 이렇게 만들어지게 된다.)

zoo2.cfg의 dataDir은 다른 경로로 바꿔준다. 동일하면 중첩이 발생하므로.

Ex) dataDir=/test/zookeeper2/data

 

* myid는 zoo.cfg를 참고하여 생성해준다.

- myid 경로 : dataDir 최상단 경로에 생성해준다. (/test/zookeeper/data/myid)

- myid에 들어갈 id값 (중요): zoo.cfg의 서버 정보와 동일하게 입력해주어야 한다.

  - 서버 1은 myid에 1을 넣어줘야 하고, 서버 2는 2개의 경로에 myid값을 각각 넣어줘야 한다. (2, 3)

 

여기까지 진행하면 다음과 같이 세팅되어야 한다.

서버 1

- /test/zookeeper/myid가 생성되어 있어야 한다. myid의 값은 1이다.

서버 2

- /test/zookeeper/myid가 생성되어 있어야 한다. myid의 값은 2이다.

- /test/zookeeper2/myid가 생성되어 있어야 한다. myid의 값은 3이다.

 

4. Hadoop 설정 변경

 

- 각 옵션의 설명은 Hadoop document에 상세히 나와있으므로 설명하지 않는다.

 

4.1. hdfs-site.xml 

 

아래의 내용을 추가한다.

중요한 몇 가지만 추가로 설명한다.

 

* dfs.nameservices의 이름은 test이다.

* 각 설정들을 보면 뒤에 .test가 붙은 곳은 nameservice의 이름을 집어넣은 것이다.

(본인이 설정한 nameservice 이름을 사용해야 한다.

* test nameservice의 NN이름을 nn1, nn2로 사용했다.

(마찬가지로 .nn1, .nn2에 본인이 사용한 이름을 사용해야 한다.)

 

<property>
         <name>dfs.namenode.rpc-bind-host</name>
         <value>0.0.0.0</value>
 </property>
 <property>
         <name>dfs.journalnode.edits.dir</name>
         <value>/test/journalnode</value>
 </property>
 <property>
         <name>dfs.nameservices</name>
         <value>test</value>
 </property>
 <property>
         <name>dfs.ha.namenodes.test</name>
         <value>nn1,nn2</value>
 </property>
 <property>
         <name>dfs.namenode.rpc-address.test.nn1</name>
         <value>{서버 1번의 hostname}:8020</value>
 </property>
 <property>
         <name>dfs.namenode.rpc-address.test.nn2</name>
         <value>{서버 2번의 hostname}:8020</value>
 </property>
 <property>
         <name>dfs.namenode.http-address.test.nn1</name>
         <value>{서버 1번의 hostname}:9870</value>
 </property>
 <property>
         <name>dfs.namenode.http-address.test.nn2</name>
         <value>{서버 2번의 hostname}:9870</value>
 </property>
 <property>
         <name>dfs.namenode.shared.edits.dir</name>
         <value>qjournal://{서버 1번의 hostname}:8485;{서버 2번의 hostname}:8485/test</value>
 </property>
 <property>
         <name>dfs.client.failover.proxy.provider.test</name>
         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
 </property>
 <property>
         <name>dfs.ha.fencing.methods</name>
         <value>shell(/bin/true)</value>
 </property>
 <property>
         <name>dfs.ha.automatic-failover.enabled</name>
         <value>true</value>
 </property>

 

4.2. core-site.xml

 

 <property>
         <name>fs.default.name</name>
         <value>hdfs://{서버 1번의 hostname}/</value>
 </property>
 <property>
         <name>ha.zookeeper.quorum</name>
         <value>{서버 1번의 hostname}:2181,{서버 2번의 hostname}:2181</value>
 </property>

 

4.3. 서버 1에 설치된 하둡을 서버 2로 복사 (같은 경로로 복사)


여기까지 하면 설정은 끝났다.


실행

 

순서

1. 서버 1의 zookeeper 실행

 - ./zkServer.sh start zoo.cfg

 

2. 서버 2의 zookeeper 실행

 - 이때 2번 서버에는 2개의 zookeeper가 있기 때문에 config 이름을 넣어서 실행해주면 된다.

 - ex) ./zkServer.sh start zoo.cfg    ./zkServer.sh start zoo2.cfg

 

3. 서버 1의 zookeeper 초기화

 - bin/hdfs zkfc -formatZK

 

4. 서버 1의 Journalnode 실행

 - bin/hdfs --daemon start journalnode

 

5. 서버 2의 Journalnode 실행

 - bin/hdfs --daemon start journalnode

 

6. 서버 1의 Journalnode 초기화

 - bin/hdfs namenode -initializeSharedEdits

 

7. 서버 1의 NN, zkfc 실행 (1번 서버를 Active로 사용함)

 - bin/hdfs --daemon start namenode

 - bin/hdfs --daemon start zkfc

 

8. 서버 1의 DataNode 실행

 - bin/hdfs --daemon start datanode

 

9. 서버 1의 DataNode 실행

 - bin/hdfs --daemon start datanode

 

10. 서버 2의 NN, zkfc 실행

 - bin/hdfs namenode -bootstrapStandby
 - bin/hdfs --daemon start namenode
 - bin/hdfs --daemon start zkfc


동작확인

 

1. Zookeeper 동작 확인

1.1. 서버 1

 - ./zkServer.sh status zoo.cfg

 

1.2. 서버 2

 - ./zkServer.sh status zoo.cfg

 - ./zkServer.sh status zoo2.cfg

 

* 위와 같이 실행 시 1대는 leader 나머지 2대는 follower가 나와야 한다.

 

2. NN 실행 상태 확인 (서버 1, 서버 2 어디에서든지 확인이 가능해야 한다.)

bin/hdfs haadmin -getAllServiceState
bin/hdfs haadmin -getServiceState nn1
bin/hdfs haadmin -getServiceState nn2

* 위와 같이 실행 시 1대는 Active 나머지 1대는 Standby가 나와야 한다.


이중화 동작 확인

 

- active NN으로 동작중인 프로세스를 종료시켜본다. (kill 또는 bin/hdfs --daemon stop namenode)

- bin/hdfs haadmin -getAllServiceState 입력 시 active NN은 연결되지 않고, standby NN은 active로 변경된다.

- 다시 종료시켰던 namenode를 실행시키면 해당 namenode은 active가 아닌 standby로 동작한다.

- 또다시 현재 active인 NN을 종료시키면 다시 상태가 변경되게 된다.

 

* 주의사항

 - Zookeeper가 비정상 동작중일 때 NN 이중화는 정상 동작하지 않는다.

 - 3대의 Zookeeper로 동작시킬 때 반드시 2대 이상의 Zookeeper가 alive 상태여야 한다.


반응형

'BigData > Hadoop' 카테고리의 다른 글

Hadoop 을 설치해보자 (단일서버)  (0) 2019.11.28
Hadoop 이란 무엇인가?  (0) 2019.11.28