재시도 가능한 쓰기
재시도 가능 쓰기를 사용하면 MongoDB 드라이버에 네트워크 오류가 발생하거나 복제본 세트 또는 샤드 클러스터 에서 정상적인 프라이머리 를 찾을 수 없는 경우 특정 쓰기 작업을 한 번만 자동으로 재시도할 수 있습니다.
전제 조건
재시도 가능 쓰기에는 다음과 같은 요구 사항이 있습니다.
- 지원되는 배포 토폴로지
- 재시도 가능 쓰기에는 복제본 세트 또는 샤드 클러스터가 필요하며 독립형 인스턴스는 지원하지 않습니다.
- 지원되는 스토리지 엔진
- 재시도 가능 쓰기를 사용하려면 WiredTiger 또는 인메모리 와 같이 문서 수준의 잠금을 지원하는 스토리지 엔진이 필요합니다.
- 3.6+ MongoDB 드라이버
클라이언트는 MongoDB 3.6 이상용으로 업데이트된 MongoDB 드라이버가 필요합니다.
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
이상이어야 하며, 클러스터에 있는 각 노드의featureCompatibilityVersion
는3.6
이상이어야 합니다.featureCompatibilityVersion
플래그에 대한 자세한 내용은setFeatureCompatibilityVersion
를 참조하십시오. - 쓰기 승인
- 쓰기 작업에서 쓰기 고려가
0
으로 설정되어 있다면, 이러한 쓰기 작업은 다시 시도할 수 없습니다 .
재시도 가능 쓰기 및 다중 문서 트랜잭션
버전 4.0에 추가.
트랜잭션 커밋 및 중단 작업은 재시도 가능한 쓰기 작업입니다. 커밋 작업 또는 중단 작업에서 오류가 발생하면 MongoDB 드라이버는 retryWrites
설정이 false
로 되어 있더라도 해당 작업을 한 번만 재시도합니다.
트랜잭션 내부의 쓰기 작업은 retryWrites
값에 관계없이 개별적으로 재시도할 수 없습니다.
트랜잭션에 대한 자세한 내용은 트랜잭션을 참조하세요.
재시도 가능 쓰기 활성화
- MongoDB 드라이버
- MongoDB 4 와 호환되는 드라이버입니다.2 이상에서는 기본적으로 재시도 가능 쓰기 를 활성화합니다. 이전 드라이버에는
retryWrites=true
옵션이 필요합니다.retryWrites=true
옵션은 MongoDB 4 와 호환되는 드라이버를 사용하는 애플리케이션에서 생략할 수 있습니다.2 이상.재시도 가능 쓰기를 사용하지 않으려면 MongoDB 4.2 이상과 호환되는 드라이버를 사용하는 애플리케이션에서 연결 문자열에retryWrites=false
를 포함해야 합니다. mongosh
재시도 가능 쓰기는
mongosh
에서 기본적으로 활성화되어 있습니다. 재시도 가능 쓰기를 비활성화하려면--retryWrites=false
명령줄 옵션을 사용합니다.mongosh --retryWrites=false
재시도 가능 쓰기 작업
다음 쓰기 작업은 승인된 쓰기 고려로 실행된 경우 다시 시도할 수 있습니다. 예를 들어 쓰기 고려는 {w: 0}
일 수 없습니다.
참고
트랜잭션 내부의 쓰기 연산은 개별적으로 재시도할 수 없습니다.
방법 | 설명 |
---|---|
삽입 작업 | |
단일 문서 업데이트 작업 | |
단일 문서 삭제 작업 | |
findAndModify 작업입니다. 모든 findAndModify 작업은 단일 문서 작업입니다. | |
| 단일 문서 쓰기 작업으로만 구성된 대량 쓰기 작업입니다. 재시도 가능한 일괄 작업에는 지정된 쓰기 작업의 모든 조합이 포함될 수 있지만 updateMany 등의 다중 문서 쓰기 작업은 포함될 수 없습니다. |
| 단일 문서 쓰기 작업으로만 구성된 대량 쓰기 작업입니다. 재시도 가능한 대량 작업은 지정된 쓰기 작업의 어떤 조합도 포함할 수 있지만, multi 옵션에 true 가 지정된 update 와 같은 다중 문서 쓰기 작업은 포함할 수 없습니다. |
행동
지속적인 네트워크 오류
MongoDB 재시도 가능 쓰기는 한 번만 재시도합니다. 이는 일시적인 네트워크 오류 및 복제본 세트 투표를 해결하는 데 도움이 되지만 지속적인 네트워크 오류는 해결하지 못합니다.
페일오버 기간
드라이버가 대상 복제본 세트 또는 샤드된 클러스터 샤드에서 정상 프라이머리를 찾을 수 없는 경우 드라이버는 serverSelectionTimeoutMS
밀리초 동안 새 프라이머리를 확인하기 위해 대기한 후 작업을 다시 시도합니다. 재시도 가능 쓰기(Retryable writes)는 페일오버 기간이 serverSelectionTimeoutMS
을 초과하는 경우를 처리하지 않습니다.
경고
쓰기 연산을 실행한 후 클라이언트 애플리케이션이 일시적으로 localLogicalSessionTimeoutMinutes
이상 응답하지 않게 되는 경우에는 클라이언트 애플리케이션이 다시 시작되지 않고 응답을 시작할 때 쓰기 연산이 다시 시도되어 적용될 수 있습니다.
진단
serverStatus
명령 및 해당 mongosh
셸 헬퍼 db.serverStatus()
에는 transactions
섹션에 재시도 가능 쓰기에 대한 통계가 포함되어 있습니다.
local
데이터베이스에 대해 재시도 가능 쓰기
공식 MongoDB 드라이버는 기본적으로 재시도 가능 쓰기를 활성화합니다. local
데이터베이스 에 쓰는 애플리케이션은 재시도 가능 쓰기를 명시적으로 비활성화 하지 않는 한 쓰기 오류가 발생합니다.
재시도 가능 쓰기를 사용하지 않으려면 MongoDB cluster의 연결 문자열에retryWrites=false
를 지정합니다.
오류 처리
MongoDB 6.1부터 재시도 가능한 쓰기의 첫 번째와 두 번째 시도가 모두 단일 쓰기를 수행하지 않고 실패하면 MongoDB는 NoWritesPerformed
라벨과 함께 오류를 반환합니다.
NoWritesPerformed
라벨은 insertMany()
과 같은 배치 작업의 결과를 구분합니다. insertMany
작업에서는 다음 결과 중 하나가 발생할 수 있습니다:
결과 | MongoDB 출력 |
---|---|
문서가 삽입되지 않습니다. | NoWritesPerformed 라벨이 있는 오류 반환. |
부분적인 작업이 완료되었습니다. (문서가 하나 이상 삽입되지만 모두 삽입되지는 않습니다.) | NoWritesPerformed 라벨 없이 오류가 반환. |
모든 문서가 삽입됩니다. | 성공 반환. |
애플리케이션은 NoWritesPerformed
라벨을 사용하여 문서가 삽입되지 않았음을 확실하게 확인할 수 있습니다. 이 오류 보고를 통해 애플리케이션은 재시도 가능한 쓰기를 처리할 때 데이터베이스의 정확한 상태를 유지할 수 있습니다.
이전 버전의 MongoDB에서는 재시도 가능한 쓰기의 첫 번째 시도와 두 번째 시도가 모두 실패하면 오류가 반환되었습니다. 그러나 쓰기가 수행되지 않았음을 나타내는 구분은 이루어지지 않았습니다.