Secondary NameNode 는 NameNode 의 예비기가 아니다. NameNode 가 죽어도 그 자리를 대신하지 않는다. 하는 일은 하나, 체크포인트다.
이름 때문에 생기는 오해가 워낙 커서 HA 구성에서는 이 역할이 Standby NameNode 로 흡수됐고, Secondary NameNode 는 아예 뜨지 않는다.
NameNode 는 파일시스템 메타데이터를 두 가지로 관리한다.
| 파일 | 내용 |
|---|---|
fsimage |
어느 시점의 메타데이터 전체 스냅샷 |
edits |
그 시점 이후에 일어난 변경 기록 |
파일을 만들거나 지울 때마다 edits 에 한 줄씩 붙는다. fsimage 는 그대로 둔다. 매번 전체 스냅샷을 다시 쓰는 것이 너무 비싸기 때문이다.
문제는 edits 가 계속 자란다는 점이다. NameNode 를 다시 띄우면 fsimage 를 읽은 뒤 edits 를 처음부터 다시 적용해야 하므로, edits 가 클수록 기동이 느려진다. 며칠 치가 쌓이면 재기동에 몇십 분이 걸린다.
주기적으로 fsimage 에 edits 를 합쳐 새 fsimage 를 만들고 edits 를 비우는 작업이다.
fsimage(옛것) + edits -> fsimage(새것), edits 초기화
이 병합을 NameNode 자신이 하면 그동안 서비스가 멈춘다. 그래서 별도 프로세스가 맡는다.
단일 NameNode 구성에서 체크포인트를 담당한다. 동작은 다음과 같다.
edits 를 새 파일로 갈아 끼우라고 요청한다.fsimage 와 지금까지의 edits 를 가져온다.fsimage 를 만든다.fsimage 를 NameNode 에 돌려준다.주기는 설정으로 정한다.
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
</property>
시간이 차거나 트랜잭션 수가 차면 먼저 도달한 조건으로 돈다.
Secondary NameNode 는 병합한 결과를 자기 디스크에도 남긴다. 그래서 NameNode 의 메타데이터가 통째로 날아갔을 때 마지막 체크포인트 시점까지는 복구할 여지가 있다. 다만 그 이후의 변경은 사라지므로 백업 수단으로 삼지 않는다.
Active 와 Standby 두 NameNode 가 같은 메타데이터를 보게 만드는 장치다. Active 가 edits 를 자기 디스크에 쓰는 대신 JournalNode 무리에 쓰고, Standby 가 그것을 읽어 자기 메모리 상태를 따라간다.
Active NameNode --edits 기록--> JournalNode x3
|
Standby NameNode <--edits 읽기---------+
JournalNode 는 과반수가 살아 있어야 쓰기가 성공한다. 그래서 홀수로, 최소 3대를 둔다. 과반이 무너지면 Active NameNode 가 쓰기를 못 하고 스스로 죽는다.
HA 구성에서는 Standby NameNode 가 체크포인트도 맡는다. 어차피 edits 를 계속 읽어 최신 상태를 들고 있으므로 새 fsimage 를 만들어 Active 에 넘겨주면 된다. 그래서 Secondary NameNode 가 필요 없다.
| 구성 | 체크포인트 담당 | 장애 시 대체 |
|---|---|---|
| 단일 NameNode | Secondary NameNode | 없음. 수동 복구 |
| HA (JournalNode) | Standby NameNode | Standby 가 Active 로 전환 |
Secondary NameNode 와 JournalNode 는 대체 관계가 아니다. 앞의 것은 체크포인트 도구이고 뒤의 것은 edits 공유 장치다. HA 로 가면 체크포인트 역할이 Standby 로 옮겨 가면서 Secondary NameNode 가 사라지는 것뿐이다.
체크포인트가 제때 돌고 있는지 본다. NameNode 웹 UI 의 요약에 마지막 체크포인트 시각이 나온다. 명령으로도 확인한다.
hdfs dfsadmin -report | head -20
edits 파일이 비정상적으로 쌓여 있으면 체크포인트가 멈춘 것이다.
ls -lh /hadoop/hdfs/namenode/current/ | tail -20
HA 구성에서 JournalNode 상태를 본다.
hdfs haadmin -getAllServiceState