HDFS 고가용성 아키텍처
QJM(Quorum Journal Manager)
1. QJM은 Hadoop 공식 HA 솔루션으로 분산 저널링 시스템
2. Zookeeper 기반 ZKFC를 통한 Active/Standby 전환
3. Journal Node 클러스터에서 edits log 공유 및 동기화
ZKFailoverController 장애 전환
ZKFC의 주요 기능:
1. NameNode 상태 모니터링
2. Zookeeper와의 지속적 연결 유지
3. 선출 메커니즘:
- 상태 확인 후 znode 잠금 시도
- 잠금 성공 시 Active 상태 전환
- 실패 시 이벤트 감지 후 재시도
Fencing 격리 메커니즘
뇌분할(brain split) 방지를 위한 이중화 기술:
- sshfence: SSH 접속 후 fuser 명령으로 프로세스 종료
- shellfence: 사용자 정의 스크립트 실행
- tcp 포트 검증을 통한 정확한 프로세스 식별
Journal Node 데이터 동기화
2N+1 구성의 JN 클러스터 특징:
- Active NN의 모든 수정 작업은 과반수 JN에 기록
- Standby NN은 JN 변경 감지 후 자동 동기화
- 분산 합의 알고리즘 기반 데이터 일관성 유지
클러스터 구성 요구사항
1. 호스트명/IP 설정
2. /etc/hosts 파일 구성
3. 방화벽 비활성화
4. SSH 키 기반 인증 설정
5. JDK 설치 및 환경 변수 설정
6. NTP 기반 시간 동기화
7. NN 상호간 비밀번호 없음 로그인
8. fence 명령어 설치: # yum install psmisc nc -y
Hadoop 설정 절차
환경 변수 설정
# /etc/profile.d/hadoop-env.sh
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export JAVA_HOME=/usr/lib/jvm/java-11
export HDFS_NAMENODE_USER=hadoop
export HDFS_ZKFC_USER=hadoop
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hacluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1:2181,zk2:2181,zk3:2181</value>
</property>
</configuration>
hdfs-site.xml
<property>
<name>dfs.nameservices</name>
<value>hacluster</value>
</property>
<property>
<name>dfs.ha.namenodes.hacluster</name>
<value>nn-primary,nn-secondary</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hacluster.nn-primary</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
클러스터 배포
# 모든 노드에 설정 동기화
rsync -av /opt/hadoop/ node2:/opt/hadoop/
rsync -av /opt/hadoop/ node3:/opt/hadoop/
클러스터 초기화 및 시작
저널노드 시작
# 각 노드에서 실행
hdfs --daemon start journalnode
네임노드 초기화
# 주 노드에서
hdfs namenode -format
hdfs --daemon start namenode
# 대기 노드에서
hdfs namenode -bootstrapStandby
ZKFC 초기화
hdfs zkfc -formatZK
서비스 시작
start-dfs.sh
start-yarn.sh
# 보조 리소스매니저 수동 시작
yarn --daemon start resourcemanager
장애 조치 검증
상태 확인
hdfs haadmin -getServiceState nn-primary
hdfs dfsadmin -report
장애 시뮬레이션
# Active NN 프로세스 종료
kill -9 $(jps | grep NameNode | awk '{print $1}')
# Standby NN 자동 전환 확인
curl http://node2:9870
복구 후 상태
# 종료된 NN 재시작
hdfs --daemon start namenode
# 자동 Standby 전환 확인
hdfs haadmin -getAllServiceState