재시도 가능 쓰기를 사용하면 네트워크 오류 발생 후 또는 복제본 세트 또는 샤딩된 클러스터 에서 정상적인 프라이머리 찾을 수 없는 경우드라이버가 특정 쓰기 (write) 작업을 다시 시도할 수 있습니다.
호환성
재시도 가능 쓰기에는 다음이 필요합니다.
- 배포 토폴로지
- 복제본 세트 또는 샤딩된 클러스터. 독립형 인스턴스에서는 지원되지 않습니다.
- 스토리지 엔진
- WiredTiger 또는 인메모리와 같은 문서 수준 잠금 기능이 있는 스토리지 엔진.
- MongoDB 드라이버
MongoDB 3.6+와 호환되는 드라이버입니다.
Java 3.6+
Python 3.6+
C 1.9 이상
Go 1.8+
C# 2.5+
노드 3.0+
Ruby 2.5+
Rust 2.1+
Swift 1.2+
Perl 2.0+
PHPC 1.4+
Scala 2.2+
C++ 3.6.6+
- MongoDB 버전
- 모든 노드의 MongoDB 3.6+ 및
featureCompatibilityVersion3.6+.setFeatureCompatibilityVersion를 참조하세요. - 쓰기 승인
- 쓰기 고려
0가 있는 쓰기는 재시도할 수 없습니다.
동작
재시도 가능 쓰기 및 다중 문서 트랜잭션
트랜잭션 커밋 및 중단 작업 을 다시 시도할 수 있습니다. 드라이버는 retryWrites 가 false인 경우에도 오류가 발생하면 이러한 작업을 한 번 재시도합니다.
트랜잭션 내부의 쓰기 (write)는 retryWrites값에 관계없이 개별적으로 재시도할 수 없습니다.
트랜잭션에 대한 자세한 내용은 트랜잭션을 참조하세요.
재시도 가능 쓰기 활성화
- MongoDB 드라이버
- MongoDB 4.2 이상과 호환되는 드라이버는 기본적으로 재시도 가능 쓰기 를 활성화합니다. 이전 드라이버에는
retryWrites=true옵션이 필요합니다.retryWrites=true옵션은 MongoDB 4 와 호환되는 드라이버를 사용하는 애플리케이션에서 생략할 수 있습니다.2 이상.재시도 가능 쓰기를 사용하지 않으려면 MongoDB 4.2 이상과 호환되는 드라이버를 사용하는 애플리케이션에서 연결 문자열에retryWrites=false를 포함해야 합니다. mongoshmongosh은 기본값 으로 재시도 가능 쓰기를 활성화합니다. 비활성화하려면 를 사용합니다.--retryWrites=falsemongosh --retryWrites=false
재시도 가능 쓰기 작업
MongoDB 쓰기 고려 (write concern) 확인한 경우 이러한 작업을 다시 시도합니다.
참고
트랜잭션 내부의 쓰기는 개별적으로 재시도할 수 없습니다.
방법 | 설명 |
|---|---|
삽입 | |
단일 문서 업데이트 | |
단일 문서 삭제 | |
| |
| 단일 문서 쓰기 작업으로만 구성된 대량 쓰기 작업입니다. 재시도 가능한 일괄 작업에는 지정된 쓰기 작업의 모든 조합이 포함될 수 있지만 |
| 단일 문서 쓰기 작업으로만 구성된 대량 쓰기 작업입니다. 재시도 가능한 대량 작업은 지정된 쓰기 작업의 어떤 조합도 포함할 수 있지만, |
지속적인 네트워크 오류
MongoDB 쓰기를 한 번 재시도합니다. 이는 일시적인 네트워크 오류 및 복제본 세트 투표를 해결하지만 지속적인 네트워크 오류는 해결하지 못합니다.
페일오버 기간
드라이버는 재시도하기 전에 serverSelectionTimeoutMS 동안 새 프라이머리 찾습니다. 페일오버 이 제한 시간보다 오래 걸리면 재시도 가능 쓰기가 실패합니다.
경고
클라이언트가 localLogicalSessionTimeoutMinutes 이상 응답하지 않으면 쓰기 (write) 재시도되고 클라이언트 복구될 때 다시 적용 수 있습니다.
진단
serverStatus 에는 transactions 섹션에 재시도 가능 쓰기 통계가 포함되어 있습니다.
local 데이터베이스에 대해 재시도 가능 쓰기
공식 드라이버는 기본값 으로 재시도 가능 쓰기를 활성화 . 재시도 가능 쓰기를 비활성화하지 않으면 local 데이터베이스 에 대한 쓰기가 실패합니다.
비활성화하려면 retryWrites=false 를 연결 문자열에서 설정하다.
Error Handling
MongoDB 6.1부터 재시도 가능한 쓰기의 첫 번째와 두 번째 시도가 모두 단일 쓰기를 수행하지 않고 실패하면 MongoDB는 NoWritesPerformed 라벨과 함께 오류를 반환합니다.
NoWritesPerformed 라벨은 insertMany()과 같은 배치 작업의 결과를 구분합니다. insertMany 작업에서는 다음 결과 중 하나가 발생할 수 있습니다:
결과 | MongoDB 출력 |
|---|---|
문서가 삽입되지 않습니다. |
|
부분적인 작업이 완료되었습니다. (문서가 하나 이상 삽입되지만 모두 삽입되지는 않습니다.) |
|
모든 문서가 삽입됩니다. | 성공 반환. |
애플리케이션은 NoWritesPerformed 라벨을 사용하여 문서가 삽입되지 않았음을 확실하게 확인할 수 있습니다. 이 오류 보고를 통해 애플리케이션은 재시도 가능한 쓰기를 처리할 때 데이터베이스의 정확한 상태를 유지할 수 있습니다.
이전 버전의 MongoDB에서는 재시도 가능한 쓰기의 첫 번째 시도와 두 번째 시도가 모두 실패하면 오류가 반환되었습니다. 그러나 쓰기가 수행되지 않았음을 나타내는 구분은 이루어지지 않았습니다.