미새문지

크래프톤 정글 week09, day70 - fsync(), Crash Consistent, 시스템 콜 구현 에러 해결 본문

크래프톤 정글/TIL

크래프톤 정글 week09, day70 - fsync(), Crash Consistent, 시스템 콜 구현 에러 해결

문미새 2024. 3. 17. 22:32
728x90

fsync()

  • 프로그램이 파일 시스템에 데이터를 안전하게 저장하도록 보장하는 데 사용되는 시스템 호출 중 하나이다.
  • 이 함수는 특정 파일의 변경 사항이 디스크에 완전히 쓰여지도록 하여, 시스템 충돌이나 전원 문제 등 예기치 않은 상황에서도 데이터의 손실을 방지하는데 중요한 역할을 한다.

fsync()의 작동 원리

  • 호출과 실행
    • 프로그램이 fsync() 함수를 호출하면, 해당 함수는 인자로 받은 파일 디스크립터가 가리키는 파일에 대한 모든 미완성 I/O 작업(입력/출력 작업)을 완료시킨다.
  • 데이터 및 메타 데이터의 동기화
    • fsync()는 파일의 데이터 뿐만 아니라 메타 데이터(예 : 파일의 수정시간)까지 디스크에 쓰도록 보장한다. 이는 파일 시스템의 일관성을 유지하는 데 중요하다.
  • 성공 및 실패
    • 작업이 성공적으로 완료되면, fsync()는 0을 반환하여 성공을 알린다. 만약 오류가 발생하면, -1을 반환하고 errno 변수에 오류 코드를 설정해 프로그램이 오류의 원인을 알아낼 수 있게 한다.

fsync()의 사용 사례

  • 데이터베이스 시스템
    • 데이터베이스는 데이터의 정확성과 일관성을 유지하기 위해 fsync()를 사용해 트랜잭션 로그와 같은 중요한 정보를 디스크에 안전하게 저장한다.
  • 파일 시스템의 데이터 무결성 금지
    • 파일을 수정한 후, 프로그램이 fsync()를 호출하여 변경 사항이 디스크에 반영되도록 함으로써, 파일 시스템의 데이터 무결성을 유지할 수 있다.
  • 안전한 파일 업데이트
    • 파일을 업데이트할 때, 먼저 임시 파일에 변경 사항을 쓴 후 fsync()를 사용해 디스크에 변경 사항을 반영하고, 마지막으로 원본 파일을 임시 파일로 대체함으로써, 데이터의 안전한 업데이트를 보장할 수 있다.

주의 사항

  • 성능 저하
    • fsync()는 디스크에 데이터를 쓰기 위해 I/O 작업을 수행해야 하기 때문에, 호출 시점에 따라 시스템의 성능 저하를 일으킬 수 있다. 따라서, 성능과 데이터 안정성 사이에서 적절한 균형을 찾는 것이 중요하다.
  • 대안 기술
    • 일부 상황에서는 fsync()의 비용이 너무 높을 수가 있어, fdatasync()같은 메타데이터의 동기화를 제외하고 데이터만 디스크에 쓰는 방식이기 때문에 상황에 따라 성능을 향상 시킬 수 있다.

Crash Consistent(충돌의 일관성)

  • 시스템이 예기치 않게 충돌하거나 다운됐을 때, 시스템이나 데이터가 일관된 상태로 유지되는 것을 의미한다.
    • 여기서 일관된 상태란, 시스템이 정상적으로 복구 될 수 있고, 데이터가 손상되지 않으며, 모든 데이터가 마지막으로 알려진 유효한 상태에 있음을 뜻한다.

Crash Consistent의 중요성

  • 데이터 무결성
    • 시스템이 갑자기 중단되더라도 데이터 무결성을 유지할 수 있어야 한다.
    • Crash Consistent 상태를 유지하면, 데이터가 일관되게 유지되어 데이터 손상의 위험을 줄일 수 있다.
  • 빠른 복구
    • 시스템이 충돌 후에도 데이터가 일관된 상태로 유지되면, 시스템 복귀 시간을 단축 시킬 수 있다.

Crash Consistency를 확보하기 위한 기술

  • 트랜잭션 로깅
    • DBMS 같은 일부 시스템은 트랜잭션 로깅을 사용해 데이터의 일관성을 보장한다.
    • 각 트랜잭션은 로그에 기록되며, 시스템이 충돌한 경우 이 로그를 사용하여 데이터를 마지막 일관된 상태로 복구할 수 있다.
  • 저널링 파일 시스템
    • 파일 시스템 레벨에서는 저널링이라는 기술을 사용하는데, 이는 파일 시스템의 변경 사항을 저널(로그)에 먼저 기록하고, 실제 파일 시스템에 적용하기 전에 이러한 변경 사항을 추적하는 방식이다.
      • 시스템 충돌 시, 저널을 사용해 파일 시스템을 안정적인 상태로 복구할 수 있다.
  • 스냅 샷
    • 일부 스토리지 시스템은 시스템의 일관된 상태를 정기적으로 캡처하는 스냅샷 기능을 제공한다.
    • 이 스냅샷은 시스템이 충돌한 후 데이터를 복구하는데 사용될 수 있다.
  • 동기화 기술
    • 데이터를 디스크에 쓸 때 fsync()와 같은 동기화 호출을 사용해 데이터와 메타 데이터가 디스크에 안전하게 저장되도록 하는 것도 중요하며, 이는 데이터의 일관성을 유지하는 데 도움이 될 수 있다.

Crash Consistency 상태는 시스템이나 데이터의 복구를 위한 기본적인 보호 수단을 제공하지만, 특정 애플리케이션의 요구 사항을 완벽히 충족시키기 위해서는 application-consistent 백업과 같은 보다 세밀한 접근 방법이 필요할 수 있다.


드디어 시스템 콜 에러를 해결했다. 다른 코드에서도 바뀐 부분이 있을 수도 있지만 일단 확실한 부분은 각 테스트 항목을 테스트할 때 입력되는 printf 메세지를 통해 테스트의 성공 실패를 좌우하는 데, 그 부분이 빠져있었다. 분명 기본 코드에 작성이 되있는데, 코드를 건들다가 실수로 지워진 것 같다.

이거 때문에 또 이틀 이상을 날린 것 같긴 하지만, 잃었던 의욕을 다시 일으켜줘서 강민님한테 감사하다. 다시 마음을 잡고 몇몇 공부 키워드만 학습하고 다시 시스템콜 남은 부분 통과를 목표로 잡았다.

 

< 강민 블로그 홍보 >

https://erin-loft.tistory.com/

 

다락방

치-타

erin-loft.tistory.com

 

 

학습 시간 : 12 ~ 23시

728x90