HDFS 의 NameNode 를 여러 개 두는 방식은 두 가지다. 삼중화는 같은 네임스페이스를 Active 1 + Standby 2 로 복제해 가용성을 높이는 것이고, Federation 은 서로 다른 네임스페이스를 여러 NameNode 가 나눠 맡아 확장성과 격리를 얻는 것이다. Federation 은 HA 가 아니므로 실무에서는 둘을 함께 쓴다.
Hadoop 3.x 부터 NameNode 를 2개 초과로 둘 수 있고, 통신 오버헤드 때문에 5개를 넘기지 않는다. 3개 구성은 NameNode 2대 장애까지 견딘다. 전제로 JournalNode(QJM) 홀수 개(최소 3), ZooKeeper 3 또는 5 노드, dfs.ha.namenodes.<nameservice> 에 nn1,nn2,nn3 이 필요하다.
Cloudera Manager 에서 HA 가 이미 켜진 상태에서 진행한다.
진행 전에 NameNode 데이터 디렉터리를 백업한다.
단일 NameNode 는 전체 메타데이터를 메모리에 두므로 힙 크기가 파일 수의 상한이 되고, 모든 메타데이터 연산이 한 노드에 몰리며, 한 조직의 과부하가 전체에 영향을 준다. Federation 은 여러 NameNode 가 각자 독립된 네임스페이스를 관리하면서 하나의 DataNode 풀을 공유한다.
| 용어 | 의미 |
|---|---|
| Namespace | 파일 · 디렉터리 메타데이터를 관리하는 NameNode 단위 |
| Block Pool | 한 네임스페이스에 속한 블록 집합. DataNode 는 모든 NameNode 에 등록되고 모든 Block Pool 의 블록을 저장한다 |
| Namespace Volume | Namespace + Block Pool. 독립 관리 단위 |
| Block ID | Block Pool ID + Block ID 로 전역 유일 |
NameNode 끼리는 조정하지 않으며 하나가 죽어도 다른 네임스페이스는 영향이 없다. 각 NameNode 의 가용성은 별도로 HA(Active/Standby + JournalNode + ZKFC) 를 구성해야 한다.
A 네임스페이스의 파일 → 블록 매핑은 A 의 NameNode 만 갖고 있으므로 B 의 NameNode 에 A 의 경로를 요청하면 찾을 수 없다. 물리적으로 같은 DataNode 디스크에 A · B 블록이 섞여 있어도 Block Pool 로 구분될 뿐이다. 클라이언트 측 ViewFs 마운트 테이블이나 Router-Based Federation(HDFS Router) 을 쓰면 /data → NN-A, /project → NN-B 처럼 하나의 파일시스템처럼 보이지만, 이는 경로를 보고 알맞은 NameNode 로 라우팅하는 것이지 통합 조회가 아니다. 그래서 자주 함께 조인되는 데이터를 다른 네임스페이스에 흩어 두지 않도록 처음에 배치를 설계해야 한다. 네임스페이스 간 이동은 distcp 를 쓴다.