namenode는 SPOF(단일장애지점)인데, 이는 Hadoop의 기본 아키텍처가 namenode를 master로, datanode들을 slave로 하는 master-slave 구조를 따르기 때문임.
이 중 namenode는 하나의 인스턴스, datanode는 수평 확장이 가능했으므로 namenode는 bottleneck이 되기 쉬운 구조였음
초기 버전에서는 namenode의 데이터 유실을 방지하는 secondary namenode가 있었지만, 이는 완전한 해결책이 되지 못함
이러한 구조에서는 예상치 못한 장애뿐 아니라, 계획된 업그레이드나 업데이트에서도 downtime이 발생할 수밖에 없음
여기선 Journal Nodes를 활용한 HA 구성을 살펴본다. Shared Storage를 이용한 HA 구성도 있다.
HA Architecture 구성요소
그림에서와 같이 두 개의 Namenode를 active/standby 상태로 두어서 SPOF를 해결한다. active/standby namenode 모두 running 중으로 운영된다.
active namenode가 다운되면 standby namenode가 active namenode 역할을 가져간다.
standby namenode는 Hadoop cluster failover 기능을 통합하는 backup namenode 역할을 수행해, namenode의 예상치 못한 장애에 자동화된 failover를 수행한다.
HA 구성에서의 중요 이슈
Active Standby NameNode는 항상 서로 sync가 되어야 한다.
한 순간에 단 하나의 active namenode만 존재해야 한다. 만약 잠깐이라도 두 개의 active namenode인 상태가 된다면, 서로 다른 active 데이터 상태를 가져서 데이터 충돌이 일어날 수 있다.(split-brain). 이를 막기 위해 Fencing과정을 가짐.
Quorum Journal Nodes를 이용한 HA 구현
Sync mechanism
Active, Standby namenode는 Journal Nodes라는 별도의 노드 그룹(혹은 데몬 프로세스)를 통해 sync를 유지
Journal Nodes는 ring topology 구성으로 연결되어 있음
Journal Nodes에 들어온 request는 ring구조를 따라 다른 노드로 copy됨(특정 Journal Node에 failure가 발생해도 Fault Tolerance를 보장)
Active namenode는 Journal Node에 있는 EditLogs를 업데이트
Standby namenode는 Journal Node로 부터 EditLogs의 변경사항을 읽고 그것을 자신의 namespace에 적용
Failover 시에 Standby namenode는 Active namenode가 되기 전에 자신의 metadata의 내용이 Journal Node에 있는 것과 같은지 확인. 확인되었다면 그때 Active Namenode로 전환
모든 datanode는 Active/Standby Node의 IP를 모두 알고 있으며, 자신의 heart beat와 block report를 두 namenode에게 모두 보냄(Standby가 Active 전환을 빠르게 수행하기 위함)
Fencing
Journal Node는 한 순간에 하나의 namenode만 writer가 되도록 함
Standby Namenode가 Journal Nodes에 대한 writing 권한을 받으면, 다른 Namenode가 Active 상태가 되지 못하도록 막음
이 과정이 모든 끝난 후에 Active Namenode 역할을 수행함
Auto-Failover
Oberver Name Node(ONN)으로 부하 분산하기
ONN은 3.x 버전부터 사용 가능하다
ONN의 필요성
State of Namenode
즉, Namenode는 세 가지 state를 가질 수 있음. Active, Standby, Observer.
주의해야할 점은 Active-Oberver 사이에서 직접적인 역할 전환은 불가능하다. Auto-Failover 과정을 보면 이해할 수 있음
client가 read 요청을 하면, proxy provider가 먼저 클러스터에서 사용할 수 있는 ONN으로 read를 시도하며, 모든 ONN으로부터의 읽기가 실패하면 그 때 Active Namenode에게 요청을 보냄
다중 유저의 요청에 대해 consistency를 보장하기 위한 msync() 메소드가 추가됨. 기본값은 사용하지 않도록 되어있음