하둡의 주키퍼, ZKFC

gnswp21·2024년 5월 13일

하둡 클러스터에 다음 구성 추가

  • zookeeper 쿼럼
  • ZKFailoverController (ZKFC)

Apache ZooKeeper

  1. 소량의 조정 데이터를 유지 관리하고 클라이언트에 해당 데이터의 변경 사항을 알림
  2. 클라이언트의 오류를 모니터링하는 고가용성 서비스

주키퍼 역할

  • 오류 감지 - 클러스터의 각 NameNode 시스템은 ZooKeeper에서 영구 세션을 유지합니다. 머신이 충돌하면 ZooKeeper 세션이 만료되어 장애 조치가 트리거되어야 함을 다른 NameNode에 알립니다.
  • 활성 NameNode 선택 - ZooKeeper는 노드를 활성 노드로 선택하는 간단한 메커니즘을 제공합니다. 현재 활성 NameNode가 충돌하는 경우 다른 노드가 ZooKeeper에서 다음 활성 노드가 되어야 함을 나타내는 특수 배타적 잠금을 취할 수 있습니다.

ZKFC - 하둡이 주키퍼를 이용해서 어떻게 자동 장애극복, 활성 노드 선출을 하는가

ZooKeeper 클라이언트. NameNode를 실행하는 각 시스템은 ZKFC도 실행하며 ZKFC는 다음을 담당합니다.

  • 상태 모니터링 -
    • 장애 복구 트리거1
    • ZKFC는 상태 확인 명령을 사용하여 주기적으로 로컬 NameNode를 핑합니다. NameNode가 적시에 정상 상태로 응답하는 한 ZKFC는 노드를 정상으로 간주합니다. 노드가 충돌하거나 정지되거나 비정상 상태가 된 경우 상태 모니터는 해당 노드를 비정상으로 표시합니다.
  • ZooKeeper 세션 관리
    • 장애 복구 트리거2
    • 로컬 NameNode가 정상일 때 ZKFC는 ZooKeeper에서 열린 세션을 유지합니다.
    • 로컬 NameNode가 활성화된 경우 특수 "잠금" znode도 보유합니다. 이 잠금은 "임시" 노드에 대한 ZooKeeper의 지원을 사용합니다. 세션이 만료되면 잠금 노드가 자동으로 삭제됩니다.
    • 즉, 네임노드 비정상 → 세션 유지 실패 → 임시 노드 삭제 → 삭제 트리거 → 장애 복구 시작
  • ZooKeeper 기반 선택 -
    • 활성 노드 선출 (리더 선출)
    • 로컬 NameNode가 정상이고 ZKFC가 현재 잠금 znode를 보유하고 있는 다른 노드가 없음을 확인하면 자체적으로 잠금을 획득하려고 시도합니다. 성공하면 "선거에서 승리"한 것이며 장애 조치를 실행하여 로컬 NameNode를 활성화해야 합니다.
    • 장애 조치 프로세스는 위에서 설명한 수동 장애 조치와 유사합니다. 먼저 필요한 경우 이전 활성 상태를 차단한 다음 로컬 NameNode를 활성 상태로 전환합니다.

네임노드가 주키퍼한테 세션을 유지함으로써 하트비트와 유사한 메커니즘으로 작동

네임노드가 문제 생김 → 유지중이던 세션 만료 → 주키퍼가 다른 네임노드에 이 사실 알림 → 장애 복구 시작

ZooKeeper 배포 구성

주키퍼 데몬은 3개 또는 5개의 노드에서 실행되도록 구성

자체 리소스 적으므로 네임노드, 스탠바이네임노드, Yarn Resourcemanager 노드 추천

주키퍼 클러스터가 구성 안료되어 zkCli를 통해 정상 작동한 것을 확인한 다음 아래 구성 진행

주키퍼 클러스터 구성 완료 후 아래의 설정 진행

  • hdfs-site.xml
<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>
  • core-site.xml
<property>
   <name>ha.zookeeper.quorum</name>
   <value>namenode1:2181,namenode2:2181,namenode3:2181</value>
 </property>
  • ~/.bashrc
export HDFS_ZKFC_USER=root

실행

ZooKeeper에서 HA 상태 초기화

NameNode 호스트 중 하나에서
hdfs zkfc -formatZK

이렇게 하면 자동 장애 조치 시스템이 데이터를 저장하는 ZooKeeper에 znode가 생성됩니다.

다음으로 클러스터 시작하기start-dfs.sh

 start-dfs.sh스크립트는 이제 NameNode를 실행하는 모든 시스템에서 ZKFC 데몬을 자동으로 시작합니다. ZKFC가 시작되면 NameNode 중 하나가 자동으로 선택되어 활성화

클러스터를 수동으로 시작하기

수동 시작이라면
hdfs --daemon start zkfc

자동 장애 조치 확인

먼저 활성 NameNode를 찾기. 웹 인터페이스 방문, 혹은 주키퍼 cli

활성 NameNode를 찾으면 해당 노드에서 오류가 발생할 수 있습니다. 예를 들어 kill -9 <pid of NN>를 사용하여 JVM 충돌을 시뮬레이션할 수 있습니다. 혹은 시스템 전원 끄거나, 랜선을 뽑거나.

중단 유발 후 다른 네임노드는 몇 초 내로 자동 활성화 되어야 한다. 장애조치트리거 대기시간은 구성에 따라 다르다 ha.zookeeper.session-timeout.ms기본값은 5초

주키퍼 포함된 고가용성 구성 및 실행

위의 구성이 완료된 상태에서

  1. 주키퍼 데몬 실행. 네임1, 네임2, 리소스매니저에서 zkServer.sh start
  2. 네임1, 네임2, 리소스매니저에서 데몬으로 저널노드 데몬 켜주기 * 3 hdfs --daemon start journalnode
  3. 네임노드 1에서 네임노드 포맷, 네임 노드 실행 hdfs namenode -format, hdfs --daemon start namenode
  4. 네임노드 2에서 부트스랩후 네임 노드 실행 hdfs namenode -bootstrapStandby, hdfs --daemon start namenode
  5. NameNode 호스트 중 하나에서 hdfs zkfc -formatZK
  6. start-dfs.sh

혹은

#!/bin/sh
ssh namenode1 "zkServer.sh start && hdfs --daemon  start journalnode"
ssh namenode2 "zkServer.sh start && hdfs --daemon  start journalnode"
ssh resourcemanager "zkServer.sh start && hdfs --daemon  start journalnode"
ssh namenode1 "hdfs namenode -format && hdfs --daemon  start namenode"
ssh namenode2 "hdfs namenode -bootstrapStandby && hdfs --daemon  start namenode"
ssh namenode1 "hdfs zkfc -formatZK"
ssh namenode1 start-all.sh

0개의 댓글