일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 읽기쉬운코드
- cleancode
- framework
- 개발자
- JPA
- 애자일프로그래밍
- Elasticsearch
- ES
- database
- 알고리즘
- 데이터베이스
- Spring
- 그리디
- 그리디알고리즘
- Java
- 코딩테스트
- 클린코드
- Baekjoon
- 자바
- 백준
- mongoDB
- spring boot
- 코드
- 엘라스틱서치
- 코딩
- 개발
- 프레임워크
- API
- 스프링
- 애자일기법
- Today
- Total
튼튼발자 개발 성장기🏋️
[MongoDB] 영속성 본문
영속성은 데이터베이스에 커밋된 쓰기 작업이 영구적으로 유지되도록 보장하는 데이터베이스 시스템의 속성이다. MongoDB에서는 클러스터 또는 복제 셋 수준에서 영속성을 고려해야한다.
저널링을 통한 멤버 수준의 영속성
MongoDB는 데이터의 일관성과 복구 기능을 향상시키기 위해 Write-Ahead Logging(WAL) 방식의 저널링을 사용한다. 이는 데이터 손실을 방지하고 장애 발생 시 복구할 수 있도록 설계된 기능이다. 특히 WiredTiger 스토리지 엔진을 사용하는 경우 저널링을 통해 데이터 무결성을 유지할 수 있다.
MongoDB 6.1 버전부터는 저널링이 기본적으로 활성화되며, 별도의 설정 없이 자동으로 적용된다. 이를 통해 데이터 충돌 방지 및 장애 복구 시간 단축과 같은 이점을 얻을 수 있다.
저널: 강제 종료 시 데이터베이스를 유효한 상태로 만드는 데 사용되는 순차적인 바이너리 트랜잭션 로그. 저널링은 먼저 데이터를 저널에 쓴 다음 핵심 데이터 파일에 기록한다. MongoDB 버전 2.0 이상의 64비트 빌드에서 기본적으로 저널링을 활성화한다. 저널 파일은 미리 할당되어 데이터 디렉토리(데이터 파일을 저장하는 파일 시스템 위치)에 파일로 존재한다.
체크포인트: 데이터 파일을 플러시하는 간격(기본값은 60초)
MongoDB의 저널링 프로세스를 알아보자.
- 저널 레코드 생성
- 각 클라이언트 쓰기 작업마다 하나의 저널 레코드가 생성
- 내부 쓰기 작업도 포함 (예: 문서 업데이트 시 인덱스 수정도 함께 기록)
- 인메모리 버퍼링
- WiredTiger는 저널 기록을 인메모리 버퍼(최대 128KB)에서 저장
- 여러 개의 스레드가 각자의 버퍼를 할당받아 데이터를 복사 및 조정
- 일정 조건이 충족되면 버퍼링된 데이터를 디스크로 동기화
- 저널 기록을 디스크로 동기화
저널 파일의 경우, 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 |