All Articles

MongoDB의 journal 이란 무엇인가?

what is mongo db journal

wiredTiger engine 의 동작방식을 공부하던 도중 journal 이라는 단어가 나왔는데 정확히 무엇을 의미하는지 모르겠다.

빠르게 읽어 보니 복구에 쓰이고 어디에서 database 가 unexpectly shutdown 되었을 때 그래서 어디서부터 recover 가 필요한지 확인하는데 쓰이는 것 으로 보인다.

정의: To provide durability in the event of a failure, MongoDB uses write ahead logging to on-disk journal files.

WiredTiger engine 은 consistent view 를 제공하기 위해 check point 를 사용한다. MongoDB 는 마지막 check point 를 사용해 recover 를 실행하지만, last check point 와 journal 사이에서 unexpectly shutdown 이 일어난다면, journal 을 이용해 어떻게 복구할지 recover information 을 찾게된다.

check point 란 recover point 로 봐도 무방하다. 출처

MongoDB 4.0 부터 WiredTiger storage engine 을 사용한다면 --nojournal 옵션이나 sotrage.journal.enabled: false 설정을 replica set member 에게 사용할 수 없다.

with journaling, the recover process

  1. data file 들에서 last checkpoint 의 identifier 를 찾아낸다.
  2. journal files 에서 last checkpoint 의 identifier 와 일치하는 record 를 찾는다.
  3. operation 을 journal file 에 적용하는데 last checkpoint 부터 적용된다.

Journaling Process.

client 가 write operation 을 실행하면 wiredTiger engine 은 하나의 journal record 를 만들어 낸다. 이 journal에 포함된 내용은 initial write 으로 부터 발생된 write operation 에 대한 모든 internal write operation 을 포함하고 있다. (예를 들어, document 를 update 하면서 collection 의 index 를 수정하는 작업이 동반되는) wiredTiger 는 update 쿼리와 index 수정이 모두 포함된 단일 record 를 생성합니다.

MongoDB 는 journal record 를 저장하기 위해 in-memory buffering 을 사용하도록 wiredTiger 를 configure 합니다. thread 는 buffer 에 복사하도록 할당한다.

모든 journal records 는 128kb 까지 buffered 된다.

WiredTiger 는 buffered 된 journal record 를 다음 조건에 의해 disk 로 동기화 시킨다.

  • For replica set members(primary and secondary members)

    • 만약 oplog entries 를 대기하는 operation 이 있다면 다음 조건에 의해 대기한다.
    • oplog 에 의한 scanning query 전달
    • read operations 이 causal consistency 의 일 부분일 경우
    • 또한 oplog 항목의 모든 batch 적용 후 secondary member 인 경우
  • 만약 write operation 이 write concern 의 j:true 를 포함하고 있거나 의미 하는경우

    Write concern ”majority” implies j: true if the writeConcernMajorityJournalDefault is true.

  • every 10 miliseonds 마다
  • wiredTiger 가 새로운 journal file 을 만든 경우 왜냐하면 MongoDB 는 journal file size 가 100MB 제한이 있기 때문이다. 100MB 마다 새로운 journal 을 만든다.

optlog: master node 에 요청되는 연산들이 log 로 기록되는 파일 참조

Journal Files

MongoDB 에서 journal 파일을 만들때 dbPath 하위 directory journal 에 WiredTigerLog.<sequence> 로 만들고 <sequence> 는 zero-padded number 로 0000000001 부터 시작한다.

journal records

journal files 은 각 client 가 일으킨 write operation 마다 record 를 포함하고 있다.

  • journal record 는 내부적인 write 시작 시 write operation 들을 포함하고 있다. document update 시 index 가 변경되면 이 내용도 함께 포함한다.
  • record 는 unique identifier 를 가지고 있다.
  • WiredTiger 의 가장 작은 journal record 의 사이즈는 128bytes 이다.

Compression

MongoDB 의 default compression 은 snappy 이다.

이것을 수정하고 싶거나 compression 을 하지 않으려면 store.wiredTiger.engineConfig.journalCompressor 의 값을 변경하면 된다.

journal file size limit

file size 는 최대 100MB 이다.

  • 한 번 파일 사이즈가 초과 되면 바로 새로운 journal file 을 만든다.
  • wiredTiger 가 자동으로 오래된 journal file 을 제거하는데 유지하는 파일은 last checkpoint 이후에 해당하는 파일만이 그 대상이다.

Result: MongoDB 의 문서를 읽으면서 나온 결론

journal 은 복구를 위한 기능이다. last checkpoint 이후 복구해야 하는 지점은 알 수 없기 때문에 wiredTiger engine 에서 last checkpoint 이후의 write operation 의 로그를 저장 해두고, MongoDB 에 문제가 생겨 복구가 필요해진다면, last checkpoint 까지는 recover를 하고 그 이후에 해당하는 동작들에 대해 journal 을 참고해 복구한다.

출처