NameNode 메타데이터가 손상돼 기동하지 못하거나, 실수로 지운 파일을 edit log 수준에서 되돌려 보려 한다. 이 작업은 위험도가 매우 높으므로 전제와 한계를 먼저 못 박는다.
edit log 는 메타데이터 변경 기록이다. 삭제 연산을 지운다고 해서 데이터 블록이 돌아오지는 않는다. 블록은 DataNode 에서 이미 회수돼 사라졌을 수 있다. 삭제 직후이고 블록이 아직 물리적으로 지워지지 않았을 때만 의미가 있다.
되돌리는 정상 경로는 세 가지다. 휴지통에서 복구하거나, HDFS 스냅샷에서 복구하거나, 별도 백업에서 복구한다. edit log 편집은 이 세 가지가 모두 불가능할 때 마지막으로 검토하는 방법이며, 실패하면 네임스페이스 전체를 잃을 수 있다.
| 명령 | 대상 | 용도 |
|---|---|---|
hdfs oev |
edits 파일 | edit log 를 XML 등으로 변환하고 되돌린다 |
hdfs oiv |
fsimage 파일 | fsimage 를 사람이 읽을 형태로 덤프한다 |
혼동하기 쉽다. edit log 를 다루는 것은 oev(Offline Edits Viewer)다. oiv(Offline Image Viewer)는 fsimage 전용이다.
hdfs oev -i edits_0000000000000000123-0000000000000000456 -o /tmp/edits.xml -p XML
hdfs oev -i /tmp/edits_modified.xml -o /tmp/edits_new -p binary
hdfs oiv -i fsimage_0000000000000000456 -o /tmp/fsimage.txt -p Delimited
hdfs oev 는 -f(fix-txids), -r(recover) 옵션을 지원한다. -r 은 손상된 edit log 에서 읽을 수 있는 부분까지만 복구한다.
작업 전에 NameNode 를 모두 정지하고 메타데이터 디렉터리 전체를 백업한다. HA 라면 JournalNode 의 dfs.journalnode.edits.dir 도 함께 백업한다.
tar czf /backup/nn-meta-$(date +%Y%m%d%H%M).tar.gz /dfs/nn/current
hdfs getconf -confKey dfs.namenode.name.dir
hdfs getconf -confKey dfs.journalnode.edits.dir
이후 XML 로 변환해 문제가 되는 <RECORD> 블록을 트랜잭션 ID 단위로 통째로 제거하고 다시 바이너리로 변환한다. 레코드 일부만 지우거나 txid 연속성이 깨지면 NameNode 가 기동하지 못한다. 변환 후에는 반드시 다시 XML 로 풀어 txid 가 연속인지 확인한다.
기동 시 edit log 를 건너뛰며 복구하는 모드도 있다. 손상 구간을 사람이 확인하며 건너뛴다.
hdfs namenode -recover
HA 클러스터에서는 edit log 가 JournalNode 쿼럼에 저장된다. 로컬 dfs.nn.current 만 고쳐도 반영되지 않으며, 쿼럼의 과반이 같은 상태여야 한다. 실무에서는 HA 를 일시적으로 해제한 상태에서 작업하고, 정상화 후 hdfs namenode -bootstrapStandby 로 다른 NameNode 를 다시 만든다.
원본 대화에서는 edit log 편집으로 삭제를 되돌리는 구체적 절차만 논의됐고 실제 복구 성공 여부는 확인되지 않았다. 블록이 이미 회수된 뒤라면 메타데이터를 되살려도 파일은 읽을 수 없다. 운영 환경에서는 이 방법에 기대지 말고 휴지통 보존 기간과 스냅샷 정책을 먼저 갖춘다.