HA 하둡 고가용성

gnswp21·2024년 5월 13일

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

위 링크의 아파치 하둡의 고가용성에 대한 공식문서를 해석,요약 해놓은 글입니다. 괄호() 안에 이해를 돕기 위해 첨언을 작성했습니다.

이 가이드에서는 QJM(Quorum Journal Manager)을 사용하여 HDFS HA를 구성하고 사용하여 활성 및 대기 NameNode 간에 편집 로그를 공유하는 방법을 설명합니다.

(HDFS는 저널노드를 통해 HA, 빠른 장애극복, 다시 말해 빠른 네임노드 교체(수동)가 가능해집니다. 그리고 추후에 주키퍼를 추가해 자동트리거 빠른 장애극복을 구성할 수 있습니다. )

배경

네임노드는 단일 고장점이므로 이에 대한 보완이 필요하다.

구조

  1. 일반적인 HA HDFS 클러스터는 두개 이상(편의상 두개로 가정하고 진행)의 네임노드로 이루어진다.
  2. 이 네임노드는 각각 활성상태, 대기상태이다.
  3. 모든 요청은 활성상태 노드에게 이루어진다. 대기 상태 노드는 빠른 장애극복(failover,혹은 장애조치)하기에 적합한 상태(지속적으로 활성 노드와 동기화)를 유지한다.
  4. 동기화를 위해 두 네임노드는 저널 노드 그룹과 계속해서 소통한다.
  5. 활성 노드의 네임스페이스의 수정(hdfs 의 파일, 디렉토리 수정 등)이 발생하면 과반수의 저널 노드가 이를 에디트 로그에 기록한다.
  6. 대기 노드는 에디트 로그를 읽어 동기화 유지한다. 이 기록을 대기 노드의 네임스페이스에 적용함으로써. 장애 극복시에 활성 노드가 되기 전에 이 기록을 다 읽고 동기화한것을 보장한다
  7. 추가적으로 빠른 장애 극복을 위해 데이터 노드의 블록 위치 보고를 대기 노드도(활성 노드는 원래 받으므로) 받는다. 따라서, 데이터노드들은 모든 네임노드를 알고 있다.
  8. 클러스터에 한번의 한 네임노드만 활성인 것이 중요하다. 안그러면 네임스페이스 꼬인다. 따라서, 저널노드는 하나의 네임노드만에만 에디트 로그의 작성 권한을 준다. 장애극복시 활성노드가 될 노드가 이전 노드한테서 권한 뺏는다.

Hardware resources

네임노드 : 2개이상의 네임노드

저널노드: 가벼우니까 다른 하둡 데몬이랑 같이 돌리자. But 반드시 3개 이상의 저널노드 필요.( 저널노드가 실패하는 것을 방지 ) (네임노드1, 네임노드2, 리소스매니저를 추천)

HA 구성에서는 스태바이노드가 세컨더리네임노드의 역할(에디트 로그 백업, 에디트 로그 fsimage에 적용)도 하므로 세컨더리네임노드가 필요없다.

→ 세컨더리네임노드로 쓰던 하드웨어는 다른 곳에 재활용하자!

Deployment

Configuration overview

전 버전과 호환되며 기존 단일 NameNode 구성을 변경 없이 작동

여러 네임노드에서  nameservice ID 를 이용해 단일 HDFS 인스턴스를 식별한다.
NameNode ID단일 구성 파일위해 구성파일에 위 파라미터 접미사가 붙는다.

Configuration details

add several configuration options to your hdfs-site.xml

 **dfs.nameservices** and dfs.ha.namenodes.[nameservice ID] will determine the keys
dfs.nameservices - the logical name for this new nameservice

저널노드가 추가된 고가용성 구성

  • hdfs-site.xml
    # 추가
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>namenode1:9000</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>namenode2:9000</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>namenode1:9870</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>namenode2:9870</value>
    </property>
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://namenode1:8485;namenode2:8485;resourcemanager:8485/mycluster</value>
    </property>
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>
    
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_rsa</value>
    </property>
    
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/root/hadoop/hdfs/journal</value>
    </property>
    nameservices : 2개 이상의 네임노드로 이루어진 네이노드 클러스터의 이름 (사용자가 짓는) dfs.ha.namenodes.mycluster 네임노드의 수에 맞게끔 ID를 작성한다. (nn1, nn2 역시 사용자가 짓는) 이후 nn2에 대한 반복되는 설정 설명은 생략하였습니다. dfs.namenode.rpc-address.mycluster.nn1 위에서 nn1으로 작명한 네임노드1의 호스트와 네임노드 포트 번호 설정 dfs.namenode.http-address.mycluster.nn1 위에서 nn1으로 작명한 네임노드1의 네임노드 웹 UI 포트번호 설정 dfs.namenode.shared.edits.dir HA를 구성하는 저널노드의 호스트와 포트번호. 처음과 끝 형식에 주의 dfs.client.failover.proxy.provider.mycluster 데이터 노드 (dfs client)가 어느 네임노드가 활성상태인지 확인하는 방법 설정 dfs.ha.fencing.methods 액티브 네임노드가 문제가 생겨 장애극복 조치 하기전에 문제가 생긴 네임노드를 완전히 격리시키는 방법 설정 dfs.ha.fencing.ssh.private-key-files 위에서 펜싱 메소드로 sshfence 방법을 선택했다면 ssh private key 파일을 지정. 이 때, pem 형식의 키여야 하고 각 네임노드에는 fuser 명령어가 설치되어 있어야 한다. 아래 트러블 슈팅(HA를 구성했는데…) 참고 dfs.journalnode.edits.dir 저널 노드의 데이터가 작성될 디렉토리
  • core-site.xml
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value>
    </property>
    
    fs.defaultFS 위에서 설정한 mycluseter가 기본 FS가 된다.

실행

이제 네임노드 고가용성을 갖습니다. 자동 장애극복은 아직 없습니다. 이는 아래에서 서술할 주키퍼를 통해 이루어집니다. 수동 빠른 장애극복은 가능합니다.

첫 구성

  1. 저널 노드(를 실행하기로 위의 설정 파일에서 지정한 네임노드1,2, 리소스매니저)에서 저널노드 데몬 켜주기 * 3 hdfs --daemon start journalnode
  2. 네임노드 1에서 네임노드 포맷, 네임 노드 실행 `hdfs namenode -format && hdfs --daemon start namenode`
  3. 네임노드 2에서 부트스트랩후 네임 노드 실행 `hdfs namenode -bootstrapStandby && hdfs --daemon start namenode`
  4. 네임노드 1에서 start-all.sh (이미 실행된 노드들은 생략되고 나머지 노드를 실행합니다. 편리합니다. 앞서 진행한 ssh 설정이 필요합니다.)
  5. 둘다 스탠바이 상태이므로 네임노드1 액티브 상태로 hdfs haadmin -failover nn2 nn1 (첫 구성시 모든 네임노드가 대기 상태로 존재합니다.)

재시작

  1. 저널 노드(로 설정한 네임노드1,2, 리소스매니저)에서 저널노드 데몬 켜주기 * 3 hdfs --daemon start journalnode
  2. 네임노드 1에서 start-all.sh

이미 구성된 HDFS 를 HA로 바꾸는 명령

생략합니다. 공식문서를 참고해주세요.

0개의 댓글