[QnA] 01.Hadoop 은 어떻게 이중화 되는가? (NameNode Failover process)

🐘 하아두우웁!!


Hadoop 2.0 버전부터 별도의 HA 솔루션 없이 Hadoop 자체적으로 이중화를 수행할 수 있도록 변경되었다. 최신 Hadoop 3.3.0 에서는 Observer NameNode라는 읽기 전용 NameNode가 별도로 도입되었지만 이 글에서는 다루지 않겠다. 자세한 내용은 Apache Hadoop 3.3.0 – Consistent Reads from HDFS Observer NameNode 를 참고 하시도록!

HDFS에서는 일반적으로 2개의 분리된 노드에 NameNode를 구성한다. 구성된 NameNode는 운영중에 하나는 Active 그리고 또 다른 한 대는 Standby 로 동작한다. Active NameNode는 HDFS에 대한 모든 client 요청을 담당한다. 반면에 Standby Namenode는 빠르게 failover를 수행할 수 있도록 NameNode의 최신 상태 정보(fsimage) 를 가지고 있게된다. Standby NameNode는 Active NameNode와 상태정보를 최신으로 동기화 하기 위해서 두 대의 NameNode 모두 JournalNode 라고 불리는 별도의 데몬 프로세스와 통신한다.

Active NameNode에 의해서 namespace(HDFS 내의 논리적 영역)에 수정사항이 발생한다면 변경사항(edits)을 과반수 이상의 Journal Node에게 전달하게 된다. 그리고 Standby NameNode는 JournalNode로부터 이러한 edit 로그를 가져오게된다. Standby NameNode는 가져온 변경사항을 자신이 기존에 가지고 있는 namespace 정보에 반영한다. 만약 failover 상황이 발생하는 경우 Standby NameNode는 Active 상태로 변경되기 이전에 Journal Node로 부터 모든 변경사항(edits)을 읽어 완전히 namespace 가 최신상태일 수 있도록 한다.

빠른 failover를 위해 Standby NameNode가 DataNode에 위치하고 있는 block의 위치와 상관 없이 최신의 정보를 가지고 있어야 한다. 이를 위해 DataNode는 Active NameNode 뿐만 아니라 Standby NameNode에게도 주기적인 heart beat을 통해 block의 정보를 전달하게된다.

두 대의 NameNode를 통해 HA를 구성하고 정상적으로 동작하기 위해서는 반드시 1대의 Active NameNode만 존재할 수 있도록 보장해야 한다. 너무 빠르게 namespace의 상태 정보가 Active NameNode에서 Standby NameNode로 전달이 되게 되면 중간에 데이터 유실이 발생하거나 올바르지 않은 결과를 얻을 수 있다. 예를들어 네트워크 이슈로 두개의 rack에 분리되어 위치하고 있는 NameNode가 통신이 되지 않는 경우, 각 rack 의 DataNode는 자신의 rack의 NameNode를 Active 상태로 인식하고 데이터를 전달하게 된다. 이 경우 두 NameNode는 서로 다른 데이터를 전달 받게 된다. 이러한 현상을 Split-Brain 이라고 한다. 이러한 현상을 피하기 위해서 Journal Node는 한번에 하나의 NameNode만 Write 작업을 할 수 있도록 강제한다.