모든 이야기

저널링 파일 시스템은 정전 뒤에 무엇을 복구할까

파일 하나를 늘리는 작업도 저장 장치에서는 여러 변경이 될 수 있다. 새 블록을 사용 중으로 표시하고, 아이노드에 위치를 기록하고, 파일 크기를 바꿔야 한다. 이 중 일부만 기록된 순간 정전이 나면 메타데이터 사이의 관계가 깨질 수 있다. 저널링은 변경 의도를 로그에 먼저 기록하고 커밋 상태를 이용해 불완전한 작업을 구분하는 방법이다.

저널에 변경을 기록하고 커밋한 뒤 최종 위치에 적용하며 중단 시 커밋 기록을 재실행하는 흐름

저널링은 중단된 변경의 일관성을 복구하며 백업과는 역할이 다르다.

한 변경을 하나의 거래로 묶는다

단순한 로그 모델에서는 필요한 변경 내용을 저널에 기록하고, 해당 묶음이 완성됐음을 나타내는 커밋 정보를 남긴다. 이후 최종 위치에 내용을 적용하는 체크포인트 작업을 한다. 기록 순서와 실제 저장 완료를 보장하는 절차가 중요하다. 단순히 함수 호출 순서만 맞아도 장치가 모든 내용을 그 순서대로 영구 저장했다고 가정할 수는 없다.

복구 과정은 커밋된 변경을 다시 적용하고 미완성 기록은 적절히 무시하는 방식으로 일관성을 회복한다. Linux ext4의 저널 문서는 트랜잭션 기록과 커밋, 복구에 관한 형식을 설명한다. 구체적인 로그 종류와 데이터 저장 규칙은 파일 시스템과 설정에 따라 다르다.

파일 확장 중 전원이 끊기면

빈 블록 B를 파일에 연결하는 상황을 생각해 보자. 사용 비트만 바뀌고 아이노드가 B를 가리키지 못하면 공간이 사용된 것으로 남을 수 있다. 반대로 아이노드는 B를 가리키는데 배정 정보가 바뀌지 않으면 같은 블록을 다른 파일에 다시 배정할 위험이 있다. 저널은 관련된 메타데이터 변경을 함께 복구할 수 있는 단위를 제공한다.

커밋 전 중단과 커밋 후 중단은 구분한다. 커밋 전 기록은 완료된 거래로 볼 수 없고, 커밋 뒤 최종 위치에 일부만 적용됐다면 로그를 이용해 나머지를 적용할 수 있다. 재실행해도 의도한 최종 상태로 복원되는 기록 방식이 필요하다. 로그에 있는 데이터를 계속 보관하지 않으려면 안전한 체크포인트와 공간 재사용 규칙도 있어야 한다.

메타데이터 일관성과 최신 내용은 다르다

모든 저널링 파일 시스템이 파일의 모든 데이터까지 저널에 두 번 쓰는 것은 아니다. 메타데이터만 기록하는 방식, 데이터도 기록하는 방식, 데이터와 메타데이터의 순서를 조절하는 방식이 있다. 어떤 방법인지에 따라 쓰기량, 성능, 정전 뒤 보일 수 있는 파일 내용이 달라진다. 저널이 있다는 사실만으로 마지막 문서 내용이 반드시 보존된다고 말할 수 없다.

응용 프로그램의 쓰기 요청 완료와 영구 저장도 구분해야 한다. 사용자 공간 버퍼, 커널 캐시, 장치 내부 캐시가 여러 단계로 존재할 수 있다. 프로그램이 요구하는 내구성을 얻으려면 해당 파일 시스템과 API가 제공하는 동기화·저장 규칙을 따라야 한다. 파일 교체 같은 작업에서는 파일 내용뿐 아니라 디렉터리 변경의 저장도 의미가 있다.

저널링은 복구 범위를 최근 로그로 줄일 수 있어, 전체 저장 장치를 검사하는 접근보다 부팅 복구를 빠르게 할 수 있다. 그 대신 로그 쓰기와 최종 위치 쓰기, 커밋 관리가 추가 비용이 된다. 묶어서 커밋하면 비용을 나누지만 저장 확정까지의 지연과 균형을 맞춰야 한다.

저널은 과거 버전을 오래 보관하는 백업과 역할이 다르다. 이미 정상 커밋된 삭제나 잘못된 내용 변경을 사용자 의도에 맞게 되돌리는 기능을 자동으로 제공하지 않는다. 저널링의 약속은 중단된 저장 작업에서 구조적 일관성을 회복하는 데 있다. 일관성, 내구성, 사용자 데이터 복원은 각각 다른 요구라는 점을 구분해야 정확하다.

참고 자료

저널링 파일 시스템은 정전 뒤에 무엇을 복구할까 · ariser