3. HA 개념 (1)
1. HA에서의 주키퍼 주 기능
Failure detection :
네임노드를 감시하여 시스템을 감시한다.
Active NameNode election :
네임노드가 죽었을시, 그 다음 네임노드 후보를 선
출한다.
2. ZKFC(zookeeper failover controller)
Health monitoring : 상태 모니터링
ZooKeeper session management : 주키퍼의 세션관리
ZooKeeper-based election : 주키퍼 기반 선거(리더선출)
3
4. HA 개념 (2) - 두 개의 네임노드
두 개의 네임노드는 Active 네임 노드, Standby 네임 노드라 부른다.
Active네임 노드에 장애가 생기면, 두번째 네임노드인 Stanby 네임 노드가 Active한 상태로 바뀌
면서 네임 노드의 역할을 맡는 방식이다. Active 네임 노드와 Standby 네임 노드는 데이터 노드로
부터 블록 리포트, 하트비트를 모두 받아서 동일한 메타데이터를 유지하고, 저널노드를 이용하여
editFile을 공유한다.
요약하자면, active 네임도느는 네임노드의 역할을 수행하고, standby 네임노드는 active 네임노드
와 동일한 메타데이터 정보를 유지, active 네임노드에 문제가 발생하면 standby 네임노드가
active 네임노드로 동작. active 네임노드에 문제가 발생하는 것을 자동으로 확인하는 것이 어렵기
때문에 주키퍼를 이용, 장애 발생 시 자동으로 상태변경이 가능하도록 한다.
4
5. HA 개념 (3) - 저널 노드
저널 노드 :
네임노드로부터 받은 트랜잭션(edit log)내용을 저널 노드 자신의 로컬 디스크에 저장한다.
해당 edit log 내용은 전체 저널 노드들에 동시에 쓰여진다.
저널노드는 홀수갯수만큼 있는게 좋다. 절반 이상의 저널노드가 동작 중이어야 edit log를
fsimage에 반영할 수 있기 때문.
fsimage :
파일시스템에 존재하는 모든 디렉토리와 파일의 아이노드 정보를 직렬화한 파일.
각 아이노드는 파일이나 디렉터리 메타데이터의 내부 구조를 나타내며 파일의 복제 수준, 변경 및
접근 시간, 접근 권한, 블록 크기, 파일을 구성하는 블록 집합과 같은 정보를 가지고 있다.
5
6. HA 개념 (4) - 정리
요약 :
주키퍼는 active name node와 standby name node를 이용한 HA를 가능하게 해주는 분산 코디네이터.
주키퍼는 어떤 노드가 active인지, standby인지를 저장함으로 네임 노드들을 관리한다
주키퍼는 단 하나의 네임 노드만 active상태에 있는 것을 보장.
주키퍼는 평소에 네임노드들과 세션을 유지하고 있다. 만약 active가 반응이 없으면 주키퍼는 바로 standby에게
active의 장애를 알린다.
여러 standby 네임노드가 있다면, 어떤 것을 active name node를 리더로 선출할 지는 주키퍼가 제공하는 리더 선출
기능에 의해 정해진다.
6
7. HA 개념 (5) - 정리
주키퍼는 3대 이상의 홀수 개수 만큼 있는 것이 좋다.
하둡 설정에 의해 주키퍼는 기본적으로 3대가 설정되어 있어야 한다.
네임노드가 두개라고 해서 두개의 주키퍼 서버를 설정하면 오류가 난다.
주키퍼는 하나의 리더와 다수의 팔로워로 구성. 리더가 주키퍼로 들어오는 데이터의 분산을 도맡아 한다.
모든 리더와 팔로워들은 똑같은 데이터를 동기화하고있어 어떤 서버에서 데이터를 읽어도 같은 데이터를
읽을 수 있다.
확실하지 않은 정보
- 주키퍼 서버의 리더선출과, 네임노드서버끼리의 리더선출은 서로 다른 듯?
7
8. 참조 - Fencing(펜싱)
Fencing :
네임노드가 장애가 아닌데, 네트워크 문제나, cpu과부하 상황에서 기존의 액티브
네임노드가 죽었다고 판단하여 새로운 네임노드가 active로 승격 될 수 있다.
이때 기존의 네임노드는 아직도 자기가 active라고 생각하는데,
이 상황을 split brain이라고 한다. 이를 방지하기 위해 기존의 액티브 네임노드를
확실하게 죽이는 것을 펜싱(fencing)이라고 한다.
8
10. 네임노드 이중화 - 서비스 구성 계획
10
hadoop ver 3.1.3
zookeeper ver 3.6.3
hostname set hadoop01, hadoop02,
hadoop03, hadoop04
all username hadoop01
hadoop01 주키퍼, 액티브 네임노드, 저널노드, 데이터
노드, 노드매니저, 리소스매니저(액티브)
hadoop02 주키퍼, 스탠바이 네임노드, 저널노드, 데이
터노드, 노드매니저, 리소스매니저(스탠바이)
hadoop03 주키퍼, 저널노드 , 데이터노드, 노드매니저
hadoop04 데이터노드, 노드매니저
11. 네임노드 이중화
시작 전 설정 :
모든 유저네임은 hadoop01로 진행.
모든 노드간 쌍방 키젠 완료 및 authorized_keys에 각자의 공개키 등록된 상태,
자바 설치 완료, 하둡 기본 설치 완료.
etc/hosts 설정
11
12. 주키퍼 쿼럼을 형성할 hadoop01~hadoop03에 주키퍼 설치
hadoop01에 설치 후 기본 설정 후에 일괄 배포 예정
권한 주고 압축 풀기
chmod 775 apache-zookeeper-3.6.3-bin.tar.gz
tar -xvzf apache-zookeeper-3.6.3-bin.tar.gz
12
네임노드 이중화
13. /home디렉토리에 주키퍼 폴더 생성. 그 하위로 압축 푼 내용 이동 후에 소유권 주기.
Sudo mkdir /home/zookeeper
Sudo mv /home/hadoop01/Download/apache-zookeeper-3.6.3-bin /home/zookeeper
Sudo chown -R hadoop01:hadoop01 zookeeper
13
네임노드 이중화
14. bin : 주키퍼 클라이언트와 서버 실행을 위한 쉘 스크립트 파일
conf : 주키퍼 환경설정을 위한 파일.
샘플파일 복사해서 사용
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
14
네임노드 이중화
15. vi zoo.cfg 수정 :
15
하단에 주키퍼 그룹 정보 추가 입력
네임노드 이중화
dataDir 설정. 후에 주키퍼 실행 시 myid를 읽어 올 디렉토리
16. server.n :
주키퍼 서버 n이 사용하는 주소와 포트 번호를 지정한다
세개의 필드를 가지고 있으며(:로 구분되는) 첫번째 필드는 호스트 이름 또는 IP주소, 두번째와 세번째
필드는 쿼럼 통신과 리더 선출에 사용하는 TCP 포트 번호다.
clientPort :
클라이언트가 서버로 연결하기 위해 사용하는 TCP 포트. 기본 포트는 2181이다
dataDir :
인 메모리 데이터베이스의 퍼지 스냅샷이 저장되는 디렉토리. 서버가 주키퍼 앙상블의 구성원이라면
이 디렉토리에 id파일이 존재한다.
tickTime :
밀리초 단위로 설정되는 틱 시간이다. 틱은 주키퍼가 사용하는 시간에 대한 기본 측정 단위다.
16
네임노드 이중화
17. 저장 후 모든 주키퍼 서버에 배포 (hadoop01~hadoop03)
● 전송
sudo scp -rp zookeeper hadoop02:/home/
sudo scp -rp zookeeper hadoop03:/home/
● 권한 부여
ssh root@hadoop02 chown -R hadoop01:hadoop01 /home/zookeeper
ssh root@hadoop03 chown -R hadoop01:hadoop01 /home/zookeeper
17
네임노드 이중화
18. 각 서버의 id를 설정해야 한다.
conf 파일 내용
1. conf파일에서 지정한 위치(datadir)에 data 디렉토리 생성
2. data 디렉토리에 myid 파일 생성
mkdir /home/zookeeper/data
vi myid
18
주키퍼 쿼럼 통신을 위한 포트
리더 선출을 위한 포트
네임노드 이중화
호스트 id
19. 각 호스트에 맞는 서버명 server.n에 해당되는 n을 입력 후 저장
hadoop01 vi /home/zookeeper/data/myid 1 입력
hadoop02 vi /home/zookeeper/data/myid 2 입력
hadoop03 vi /home/zookeeper/data/myid 3 입력
19
네임노드 이중화
echo 1 > myid
echo 2 > myid
echo 3 > myid
hadoop01의 myid파일 예시
20. 편의성을 위한 alias 설정(권장) :
vi ~/.bashrc
아래 내용 추가 입력 후 source ~/.bashrc 각 서버에 배포
scp ~/.bashrc hadoop02:~/
scp ~/.bashrc hadoop03:~/
ssh hadoop02 source ~/.bashrc
ssh hadoop03 source ~/.bashrc
20
네임노드 이중화
21. 주키퍼 그룹으로 지정한 각 서버(hadoop01~hadoop03)에서
zookeeper-start 명령어로 실행(앞에서 alias설정 시 가능)
21
네임노드 이중화
22. ● 세개의 서버에 모두 실행 후 zookeeper-status로 상태 확인
22
hadoop02가 리더인 상태
네임노드 이중화
hadoop01
hadoop02
hadoop03
23. ● 하둡과 연동
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/home/hadoop/hadoop-3.1.3
export HADOOP_PID_DIR=/home/hadoop/hadoop-3.1.3/pids
23
네임노드 이중화
pid 파일
프로세스의 고유 식별번호! 주로 특정 프로세스의 실행 여부 판단에 사용된다.
이전에 $HADOOP_HOME에 mkdir pids 로 생성했던 디렉토리로 경로 지정 해주었다.
24. ● 기존에 있던 master파일은 사용하지 않는다.
workers파일 수정
24
네임노드 이중화
32. 하둡 HA 실행 순서 :
1. 주키퍼 포맷
2. 3개의 저널노드 실행
3. Active 네임노드 실행
4. Standby 네임노드 실행
5. 주키퍼 장애 컨트롤러 (zkfc)실행
6. 데이터노드 실행
7. 얀 클러스터 실행
8. 히스토리서버 실행
32
네임노드 이중화
33. 편리한 실행을 위한 alias 등록 :
vi ~/.bashrc
alias hadoop="~/hadoop/sbin/hadoop-daemon.sh"
alias hdfs="~/hadoop/bin/hdfs"
alias yarn="~/hadoop/bin/yarn"
source ~/.bashrc 후에 타 서버 배포 후 환경변수 활성화
33
네임노드 이중화
34. 34
주키퍼 포맷 :
hdfs zkfc -formatZK
hadoop01~hadoop03에서 주키퍼가 실행 된 상태여야 한다
네임노드 이중화
35. 저널노드 실행 :
이제 hadoop01부터 hadoop03까지 저널노드를 설정한 기기들에서 각각 저널노드를 시작해준다. 위
의 .bashrc파일을 각 기기에 설정해주었다면 아래의 커맨드로 실행이 가능
hadoop start journalnode hadoop01 ~ hadoop03 까지 반복
실행 후 jps :
주키퍼
저널 노드
35
네임노드 이중화
37. 액티브 네임노드 실행 :
hadoop01에서
hadoop start namenode
37
네임노드 이중화
38. hadoop02에서 스탠바이 네임노드 실행 준비 :
hadoop02에서 hdfs namenode -bootstrapStandby
명령어로 active네임노드의 메타데이터를 복사해온다. 정상 작동 시 아래 내용 출력.
38
네임노드 이중화
39. 오류 - a shared edits dir must not be specified if HA is not enabled. (1)
현상 - 스탠바이 네임노드가 액티브 네임노드의 메타데이터 복사에 실패
확인해보니 복사해야 할 hadoop01 의 네임노드가 죽어있는 상태
39
40. 원인 파악 및 해결 - hadoop01의 네임노드 로그확인
a shared edits dir must not be specified if HA is not enabled.
HA에 관한 오류인 듯 HA를 설정한 hdfs-site.xml확인.
오타 발견, 수정 후 재실행. 네임노드 정상 실행 확인
40
오류 - a shared edits dir must not be specified if HA is not enabled. (2)
41. 오류 - journal at hadoop01 has no edit logs (1)
hdfs namenode -bootstrabStandby 입력 후 다른 오류가 발생했다.
41
active Namenode는 정상실행 됐지만 다른 문제가 발생
journal at hadoop01 has no edit logs
42. 해결
로그 확인해보니 이전 데이터와 충돌된 듯한 느낌.
이전에 있던 저널노드데이터 삭제. 네임노드 데이터 삭제. 포맷 후에 재실행.
42
극단적인 방법이긴 했지만, 정상작동 확인
오류 - journal at hadoop01 has no edit logs (2)
43. 오류 - FSIamageSaver clean checkpoint: shutdown (1)
현상 - 스탠바이 네임노드가 액티브 네임노드의 메타데이터 복사에 실패
43
저널노드 키고, 액티브 네임노드 키고,
스탠바이 네임노드에서 bootstrapStandby 입력하니 에러..
네임노드 로그 확인
fsimage에 문제가 있는듯
44. 원인 파악
44
검색 결과
standby namenode and journal node configurations were in a corrupted state, so that when the cluster tried to switch to the
standby, you encountered the error that you reported. Initially we have to put the primary namenode into safemode and saved the
namespace with the following commands: hdfs dfsadmin -safemode enter hdfs dfsadmin -saveNamespace su - hdfs -c "hdfs
namenode -bootstrapStandby -force" this was to make sure that the namenode was in a consistent state before we attempted to
restart the HDFS components one last time to make sure all processes started cleanly and that HDFS would automatically leave
safemode
- 위 내용을 바탕으로 예상한 원인
이전에 네임노드 이중화 실험을 위해 active네임노드를 강제적으로 죽여서 standby네임노드가
active로 된 상태에서 종료했었다. 이 때 마지막 액티브 네임노드였던 hadoop02에서 실행을 했어
야 했는데 standby였던 hadoop01에서 실행, hadoop02에서 active노드 메타데이터 복사 요청으로
인해 오류가 난 듯 하다. hadoop01, hadoop02 네임노드 모두 실행 후 마지막 액티브 네임노드였던
hadoop02에서 오류 해결 시도
오류 - FSIamageSaver clean checkpoint: shutdown (2)
45. 해결 - safemode 사용 namespace 저장
45
일단 hadoop01, hadoop02 네임노드 둘다 키고, 마지막 액티브 네임노드였던 hadoop02에서 진행
hdfs dfsadmin -safemode enter
hdfs dfsadmin -saveNamespace
hdfs dfsadmin -safemode leave
오류 - FSIamageSaver clean checkpoint: shutdown (3)
46. 해결 - safemode 사용 namespace 저장
46
현재 실행중이던 스탠바이 네임노드 종료 후 hdfs namenode -bootstrapStandby -force 입력
정상 완료. 이후에 다시 스탠바이 네임노드 시작
생각보다 자주 발생하는 오류였다.
오류 - FSIamageSaver clean checkpoint: shutdown (4)
48. alias 추가 설정 :
vi ~/.bashrc
입력 후 source ~/.bashrc
48
네임노드 이중화
49. ● 데이터노드 실행
hadoop01~hadoop04 모두 실행
hadoop start datanode
● yarn 실행
hadoop01에서 실행
yarn-start
● historyserver 실행
hadoop01, hadoop02에서 실행
49
네임노드 이중화
50. ● 주키퍼 장애 컨트롤러 실행
hadoop01, hadoop02 네임노드들에서 실행
hadoop start zkfc (zookeeper failover controller)
50
네임노드 이중화
51. 오류 - you must configure a fencing method before using automatic failover.
원인 및 해결 - 단순 오타
ssfence가 아니라 sshfence를 입력 해야 한다.
hdfs-site.xml에서 수정 후 문제 해결
51
52. 오류 - 두 개의 네임노드 모두 standby 상태
해결 - zkFC 실행 시 하나가 active로 전환된다.
52
zkfc를 실행했어도 active 전환이 안된다면 네임노드 설정과 주키퍼 앙상블 설정 재확인
53. ● 실행 완료 확인
hadoop01 hadoop02
hadoop04
hadoop03
53
네임노드 이중화
54. ● zkfc 작동 확인
먼저 active, standby 네임노드의 상태를 웹에서 확인해보자
이 상태에서 hadoop01의 네임노드를 강제로 종료 했을 때
hadoop02의 standby 상태가 active상태로 바뀌면 성공
54
네임노드 이중화
55. ● active 네임노드 kill
액티브 네임노드(hadoop01) kill 12211
hadoop02
standby -> active 전환 확인
55
네임노드 이중화
59. RM 이중화(HA)는 네임노드 이중화(HA)와 유사하게 active/standby로 구성되
며 Zookeeper를 이용하는 방식.
네임노드 이중화와 달리 RM 이중화(HA)는 별도의 모니터링 프로세스가 필
요없이 내장되어 있는 Zookeeper 기반의 ActiveStandbyElector가 active 여
부를 결정한다.
59
RM 이중화 - 개념
60. ● yarn-site.xml에 추가 입력(1)
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
60
RM 이중화
ResourceManager 시작시 state 복구여부
persistent store로 사용할 class
Zookeeper 서버 리스트
ResourceManager HA 사용여부
61. ● yarn-site.xml에 추가 입력(2)
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rm-cluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
61
RM 이중화
ResourceManager가 leader election에 참가할 cluster 이름 지정
cluster에서 HA를 구성할 ResourceManager id 지정
rm1의 호스트명
rm2의 호스트명
63. ● 실행
1. 액티브 네임노드 실행
2. 스탠바이 네임노드 실행
3. 데이터 노드 실행
4. 액티브 리소스매니저 실행(hadoop01에서 yarn-start)
5. 스탠바이 리소스매니저 실행(hadoop02에서 yarn-start)
6. 주키퍼 장애 컨트롤러 실행
63
RM 이중화
64. ● RM 상태 확인
/home/hadoop/bin/yarn rmadmin -getServiceState rm1
/home/hadoop/bin/yarn rmadmin -getServiceState rm2
64
RM 이중화
hadoop01 리소스매니저 - standby 상태
hadoop02 리소스매니저 - active 상태
hadoop01 네임노드 상태 - standby
hadoop02네임노드 상태 - active
65. ● standby -> active 전환 확인하기 (1)
65
RM 이중화
현재 active상태인 hadoop02의 resourcemanager를 강제종료
66. ● standby -> active 전환 확인하기 (2)
66
RM 이중화
대기중이던 hadoop01 resourcemanager
standby - > active 전환 확인
67. ● 정상작동 확인해보기 (1)
67
RM 이중화
현재 상태
active namenode - hadoop02
active resource manager - hadoop01
이 상태에서 hdfs에 파일 업로드 시도
70. ● 종료했던 RM 재실행시 standby 대기 여부 확인
RM을 강제로 종료했던 노드(hadoop01)에서 RM 재실행
70
RM 이중화
/home/hadoop/sbin/yarn-daemon.sh start resourcemanager
active -> kill -> 재실행 -> standby 상태로 대기 확인