튼튼발자 개발 성장기🏋️

[MongoDB] 영속성 본문

기타/MongoDB

[MongoDB] 영속성

시뻘건 튼튼발자 2025. 3. 23. 12:59
반응형

영속성은 데이터베이스에 커밋된 쓰기 작업이 영구적으로 유지되도록 보장하는 데이터베이스 시스템의 속성이다. MongoDB에서는 클러스터 또는 복제 셋 수준에서 영속성을 고려해야한다.

 

저널링을 통한 멤버 수준의 영속성

MongoDB는 데이터의 일관성과 복구 기능을 향상시키기 위해 Write-Ahead Logging(WAL) 방식의 저널링을 사용한다. 이는 데이터 손실을 방지하고 장애 발생 시 복구할 수 있도록 설계된 기능이다. 특히 WiredTiger 스토리지 엔진을 사용하는 경우 저널링을 통해 데이터 무결성을 유지할 수 있다.

MongoDB 6.1 버전부터는 저널링이 기본적으로 활성화되며, 별도의 설정 없이 자동으로 적용된다. 이를 통해 데이터 충돌 방지 및 장애 복구 시간 단축과 같은 이점을 얻을 수 있다.

더보기

저널: 강제 종료 시 데이터베이스를 유효한 상태로 만드는 데 사용되는 순차적인 바이너리 트랜잭션 로그. 저널링은 먼저 데이터를 저널에 쓴 다음 핵심 데이터 파일에 기록한다. MongoDB 버전 2.0 이상의 64비트 빌드에서 기본적으로 저널링을 활성화한다. 저널 파일은 미리 할당되어 데이터 디렉토리(데이터 파일을 저장하는 파일 시스템 위치)에 파일로 존재한다.

 

체크포인트: 데이터 파일을 플러시하는 간격(기본값은 60초)

MongoDB의 저널링 프로세스를 알아보자.

  1. 저널 레코드 생성
    1. 각 클라이언트 쓰기 작업마다 하나의 저널 레코드가 생성
    2. 내부 쓰기 작업도 포함 (예: 문서 업데이트 시 인덱스 수정도 함께 기록)
  2. 인메모리 버퍼링
    1. WiredTiger는 저널 기록을 인메모리 버퍼(최대 128KB)에서 저장
    2. 여러 개의 스레드가 각자의 버퍼를 할당받아 데이터를 복사 및 조정
    3. 일정 조건이 충족되면 버퍼링된 데이터를 디스크로 동기화
  3. 저널 기록을 디스크로 동기화

저널 파일의 경우, MongoDB는 dbPath 디렉터리 아래에 journal 이라는 이름의 하위 디렉터리를 만든다. WiredTiger 저널 파일은 `WiredTigerLog.<sequence>`형식의 이름을 가지며, 여기서 <sequence> 는`0000000001`부터 시작하는 `0`으로 채워진 숫자다. 저널 파일이 제한(100MB)을 초과하면 새 저널 파일을 만든다. 저널 파일은 마지막 체크포인트 이후의 데이터를 복구하는데만 필요하므로, MongoDB는 새 체크포인트가 작성되면 오래된 저널파일을 제거한다.

만약 애플리케이션에서 저널 플러시 간격이 짧아야 한다면 commitIntervalMs 옵션을 사용해 간격을 1ms - 500ms까지 변경할 수 있다.

 

쓰기 결과 확인을 사용하는 클러스터 수준의 영속성

쓰기 결과 확인을 사용하면 애플리케이션이 쓰기 요청에 응답하는 데 필요한 승인 수준을 지정할 수 있다. 복제 셋에서는 네트워크 파티션이나 서버 오류 또는 데이터 센터 중단으로 인해 일부 멤버에 쓰기가 복제되지 않을 수 있다. 복제 셋에 정상 상태가 복원되면 대다수의 멤버에 복제되지 않은 쓰기가 롤백된다. 이런 상황에서는 커밋된 데이터가 클라이언트와 데이터베이스에서 서로 다르게 보일 수 있다.

WriteConcern

쓰기 고려(Write Concern)는 쓰기 작업이 얼마나 신뢰성 있게 수행되었는지를 결정하는 중요한 설정이다.
쓰기 고려를 통해 데이터 일관성과 내구성을 유지할 수 있으며, 이를 적절히 조정하면 성능과 안정성을 동시에 확보할 수 있다.

MongoDB는 독립형 서버뿐만 아니라 복제본 세트 샤딩 클러스터 환경에서도 쓰기 고려를 적용할 수 있도록 설계되어 있다.

결국에는 MongoDB가 데이터를 성공적으로 기록했다고 간주하는 기준을 정의하는 설정인 것이다.
이는 데이터가 특정 개수의 노드에 성공적으로 저장되었을 때 클라이언트에 성공 응답을 반환하는 방식으로 작동한다.

쓰기 고려가 필요한 이유

  • 데이터 손실 방지: 네트워크 장애나 장애 조치(Failover) 발생 시 데이터의 영구 저장을 보장할 수 있음
  • 성능 최적화: 낮은 쓰기 고려 값을 설정하면 빠른 응답이 가능하지만, 데이터 손실 위험이 증가할 수 있음
  • 일관성 유지: 특정 복제본 세트 노드에서 데이터를 읽을 때, 올바른 최신 데이터를 제공할 수 있도록 보장

쓰기 고려 기본 동작

MongoDB는 기본적으로 w: "majority" 값을 사용한다. 이는 과반수 이상의 복제본 세트 멤버가 데이터를 저장해야 쓰기 작업이 완료됨을 의미한다.

 

쓰기 고려 옵션

w 옵션

w 옵션은 쓰기 작업이 적용될 노드의 개수를 정의한다.

  • w: 0 → 쓰기 성공 여부를 확인하지 않고 즉시 응답 (속도는 빠르지만 데이터 손실 위험 높음)
  • w: 1 → 프라이머리 노드에서만 데이터를 저장한 후 응답
  • w: "majority" → 복제본 세트에서 과반수 이상이 데이터를 저장한 후 응답
  • w: <number> → 지정된 개수의 노드에서 쓰기 성공을 확인한 후 응답
db.collection.insertOne(
   { name: "MongoDB", type: "Database" },
   { writeConcern: { w: 2 } }
);

 

j 옵션

j 옵션은 저널(Journal) 기록 여부를 설정하는 옵션이다.

  • j: false → 데이터를 메모리에 저장한 후 즉시 응답
  • j: true → 데이터가 디스크의 저널 파일에 기록된 후 응답
db.collection.insertOne(
   { name: "MongoDB", type: "Database" },
   { writeConcern: { w: 1, j: true } }
);

wtimeout 옵션

wtimeout 옵션은 쓰기 작업이 완료되지 않을 경우의 타임아웃(Timeout) 시간을 지정한다.

  • 기본값은 0(무제한 대기)
  • wtimeout을 설정하면 지정된 시간 내에 w 옵션을 충족하지 못할 경우 오류 반환
db.collection.insertOne(
   { name: "MongoDB", type: "Database" },
   { writeConcern: { w: 2, wtimeout: 5000 } }
);

 

 

반응형

'기타 > MongoDB' 카테고리의 다른 글

[MongoDB] 트랜잭션  (0) 2025.03.23
[MongoDB] 특수 인덱스  (0) 2025.03.17
[MongoDB] 인덱싱 #2  (0) 2025.03.16
[MongoDB] 인덱싱 #1  (0) 2025.03.15
[MongoDB] 도큐먼트 생성, 갱신, 삭제  (0) 2025.03.06