쓰기 고려
쓰기 고려는 독립형 mongod
, 복제본 세트 또는 샤딩된 클러스터 에 대한 쓰기 (write) 작업에 대해 MongoDB 에서 요청하는 승인 수준을 설명합니다. 샤딩된 클러스터에서 mongos
인스턴스는 쓰기 고려 (write concern) 고려를 샤드에 전달합니다.
참고
다중 문서 트랜잭션의 경우 개별 작업 수준이 아닌 트랜잭션 수준에서 쓰기 고려를 설정합니다. 트랜잭션에서 개별 쓰기 작업의 쓰기 고려를 명시적으로 설정하면 안 됩니다.
다중 문서 트랜잭션에 "majority"
쓰기 고려를 지정하고 트랜잭션이 복제본 세트 멤버의 계산된 과반수에 복제되지 못할 경우, 트랜잭션이 복제본 세트 멤버에서 즉시 롤백되지 않을 수 있습니다. 결국에는 복제본 세트가 일관성을 갖게 됩니다. 트랜잭션은 항상 모든 복제본 세트 멤버에 적용되거나 롤백됩니다.
복제본 세트와 샤딩된 클러스터는 글로벌 기본 쓰기 고려 설정을 지원합니다. 명시적인 쓰기 고려가 지정되지 않은 작업에는 글로벌 기본 쓰기 고려 설정이 적용됩니다. 자세한 내용은 setDefaultRWConcern
을 참조하세요.
MongoDB Atlas에서 호스팅되는 배포서버에 대한 쓰기 고려 설정에 대해 자세히 알아보려면 MongoDB Atlas로 복원력 있는 애플리케이션 구축을 참조하세요.
쓰기 고려 사양
쓰기 고려에는 다음 필드가 포함될 수 있습니다.
{ w: <value>, j: <boolean>, wtimeout: <number> }
w 옵션은 쓰기 작업이 지정된 수의
mongod
인스턴스로 전파되었거나 지정된 태그를 가진mongod
인스턴스로 전파되었음을 확인 요청하는 데 사용됩니다.쓰기 작업이 온디스크 저널에 기록되었다는 확인을 요청하는 j 옵션 및
쓰기 작업이 무기한 차단되지 않도록 시간 제한을 지정하는 wtimeout 옵션을 사용할 수 있습니다.
w
옵션
w
옵션은 쓰기 작업이 지정된 개수의 mongod
인스턴스 또는 태그가 지정된 mongod
인스턴스로 전파되었음을 확인하도록 요청합니다. 쓰기 고려에 w
필드가 없는 경우, MongoDB는 w
옵션을 기본 쓰기 고려 설정으로 사용합니다.
참고
setDefaultRWConcern
을 사용해 기본 쓰기 고려를 설정하는 경우, 반드시 w
필드 값을 지정해야 합니다.
w
옵션을 사용하면 다음과 같은 w: <value>
쓰기 고려를 사용할 수 있습니다.
값 | 설명 |
---|---|
데이터를 보유한 투표 멤버의 계산된 다수가 로컬 oplog에 변경 사항을 영구적으로 작성했다는 확인을 요청합니다. 그런 다음 멤버는 로컬 oplogs에서 읽을 때 변경 사항을 비동기적으로 적용합니다. 8.0 버전 변경 사항: MongoDB는 이전 릴리스에서처럼 멤버가 변경 사항을 적용할 때까지 기다리지 않고 쓰기를 승인합니다. 복제본 세트의 데이터를 보유한 투표 멤버는 프라이머리 멤버 그리고 자세한 내용은 { w: "majority" } 쓰기 후 읽기를 참조하세요.
예를 들어, 투표권이 있는 노드가 3인 복제본 세트, 즉 프라이머리-세컨더리-세컨더리(P-S-S)가 있다고 고려합니다. 이 복제본 세트의 경우 계산된 과반수는 2이며, 쓰기는 프라이머리와 하나의 세컨더리의 oplog로 전파되어야 클라이언트에게 쓰기 고려를 알릴 수 있습니다.
지연된 세컨더리는 구성된 쓰기 연산이 다중 문서 트랜잭션에 | |
쓰기 작업이 지정된 수의
예를 들어, 1개의 프라이머리와 2개의 세컨더리가 있는 3개의 멤버를 가진 복제본 세트가 있다고 가정해 봅시다. 숨겨지거나, 지연되거나, 우선순위 0인 멤버는 지연된 세컨더리는 구성된 | |
쓰기 작업이 사용자 지정 쓰기 고려가 프라이머리의 인정만을 요구하고, 쓰기 작업이 세컨더리에 복제되기 전에 프라이머리가 강등되었을 경우 데이터가 롤백될 수 있습니다. |
j
옵션
j
옵션은 MongoDB에 쓰기 작업이 온디스크 저널에 작성되었음을 확인 요청합니다.
|
참고
저널링 없이 실행되는
mongod
인스턴스에j: true
를 포함하는 쓰기 고려를 지정하면 오류가 발생합니다.저널링이 활성화된 경우
w: "majority"
는j: true
일 수 있습니다.writeConcernMajorityJournalDefault
복제본 세트 구성을 어떻게 설정하느냐에 따라 동작이 결정됩니다. 자세한 내용은 확인 동작을 참조하세요.j: true
를 포함하거나 암시하는 쓰기 고려는 즉시 저널 동기화를 유발합니다. 자세한 내용은 저널링 프로세스를 참조하세요.
wtimeout
이 옵션은 쓰기 고려의 시간제한을 밀리초 단위로 지정합니다. wtimeout
은 w
가 1
보다 큰 경우에만 적용됩니다.
wtimeout
은 필요한 쓰기 고려가 최종적으로 성공하더라도 지정된 제한 시간이 경과한 후에 쓰기 작업을 오류와 함께 반환하도록 합니다. 이러한 쓰기 고려가 반환되면 MongoDB는 쓰기 고려가 wtimeout
시간 제한을 초과하기 전에 수행된 성공적인 데이터 수정을 되돌리지 않습니다.
wtimeout
옵션을 지정하지 않았고 쓰기 고려 수준을 달성할 수 없는 경우, 쓰기 작업은 무기한으로 차단됩니다. wtimeout
값을 0
으로 지정하면 wtimeout
옵션이 없는 쓰기 고려와 동일해집니다.
자세한 내용은 암시적 기본 쓰기 고려를 참조하세요.
MongoDB 5.0부터는 w: majority
가 암시적 기본 쓰기 고려로 설정되어 있습니다. 하지만 중재자가 포함된 배포의 경우 특별히 고려해야 할 점들이 있습니다.
복제 세트의 투표 과반수는 1에 투표 회원 수의 절반을 반올림한 값입니다. 데이터를 포함하는 투표 구성원의 수가 투표 과반수보다 많지 않은 경우 기본 쓰기 문제는
{ w: 1 }
입니다.다른 모든 시나리오에서 기본 쓰기 우려는
{ w: "majority" }
입니다.
특히 MongoDB는 다음 공식을 사용하여 기본 쓰기 문제를 결정합니다.
if [ (#arbiters > 0) AND (#non-arbiters <= majority(#voting-nodes)) ] defaultWriteConcern = { w: 1 } else defaultWriteConcern = { w: "majority" }
예를 들어 다음 배포와 해당 기본 쓰기 문제를 고려해보세요.
Non-Arbiters | 중재자 | 투표 노드 | 과반수 투표 노드 | 자세한 내용은 암시적 기본 쓰기 고려를 참조하세요. |
---|---|---|---|---|
2 | 1 | 3 | 2 | { w: 1 } |
4 | 1 | 5 | 3 | { w: "majority" } |
첫 번째 예시에서는
총 3개의 투표 노드에는 2명의 비중재자와 1명의 중재자가 있습니다.
투표 노드의 대다수(1 + 3의 절반, 반내림)는 2입니다.
비중재자 수(2)는 대다수의 투표 노드(2)와 동일하므로
{ w: 1 }
의 암시적 쓰기 문제가 발생합니다.
두 번째 예시에서는
총 5개의 투표 노드에는 4명의 비중재자와 1명의 중재자가 있습니다.
투표 노드의 대다수(1 + 5의 절반, 반내림)는 3입니다.
비 중재자 (4) 의 수가 투표 노드 (3) 의 과반수보다 많아서 암묵적인 쓰기 문제가
{ w: "majority" }
발생합니다.
승인 동작
w 옵션과 j 옵션은 mongod
인스턴스가 쓰기 연산을 승인하는 시기를 결정합니다.
독립형
독립형 mongod
는 메모리에 쓰기를 적용하거나 디스크 저널에 쓰기를 완료한 후 쓰기 작업을 확인합니다. 다음 표에는 독립형의 확인 동작과 관련된 쓰기 고려가 설명되어 있습니다.
j 는 지정되지 않음 | j:true | j:false | |
---|---|---|---|
w: 1 | inMemory | On-disk journal | inMemory |
w: "majority" | 저널링을 사용하여 실행하는 경우 온디스크 저널 | On-disk journal | inMemory |
참고
writeConcernMajorityJournalDefault
를 false
로 설정하면 MongoDB는 w: "majority"
쓰기가 디스크 저널에 작성되는 것을 기다리지 않고 쓰기를 확인합니다. 따라서 주어진 복제본 세트의 노드 과반수 이상이 일시적으로 손실된 경우(충돌, 재시작 등), "majority"
쓰기 작업이 롤백될 가능성이 있습니다.
복제본 세트
w에 지정된 값은 성공을 반환하기 전에 쓰기를 승인해야 하는 복제본 세트 노드의 수를 결정합니다. 각 적격 복제본 세트 노드에 대해 j 옵션은 노드가 메모리에 쓰기 연산을 적용한 후 쓰기를 승인할지, 아니면 온디스크 저널에 쓰기를 수행한 후 쓰기를 승인할지를 결정합니다.
w: "majority"
복제본 세트의 데이터 보유 투표 멤버는 모두
"majority"
쓰기 작업의 쓰기 승인에 기여할 수 있습니다.다음 표에는 멤버가 j 값에 따라 쓰기를 확인할 수 있는 시점이 제시되어 있습니다.
j
는 지정되지 않음확인은
writeConcernMajorityJournalDefault
의 값에 따라 달라집니다.true
인 경우, 확인에는 온디스크 저널에 수행된 쓰기 작업이 필요합니다(j: true
).writeConcernMajorityJournalDefault
기본값true
false
인 경우, 확인에는 메모리에 수행된 쓰기 작업이 필요합니다(j: false
).
j: true
확인에는 온디스크 저널에 수행된 쓰기 작업이 필요합니다.j: false
확인에는 메모리에 수행된 쓰기 작업이 필요합니다.
일반적으로
j: false
이 설정하다 경우 디스크 상의 저널 에 작업을 쓸 필요가 없습니다. 그러나writeConcernMajorityJournalDefault: true
이 설정하다 있으면j: false
이 설정하다 있더라도 저널 에 작업을 기록해야 합니다.j: false
및writeConcernMajorityJournalDefault: true
이 설정하다 되면 쓰기 (write) 작업이 저널 에 비동기적으로 기록됩니다.w: majority
이 설정하다 쓰기는 저널 이 디스크로 플러시될 때까지 완료된 것으로 확인되지 않습니다.w: majority
쓰기는j
설정에 관계없이"majority"
읽기 스냅샷 이 완료될 때까지 기다립니다. 이는writeConcernMajorityJournalDefault: true
로 설정하다 되면 대다수 읽기 스냅샷 이 대부분의 저널링된 쓰기를 기반으로 하기 때문입니다.쓰기 (write) 작업이 클라이언트 애플리케이션 에
w: majority
승인과 함께 반환된 후majority
읽기 고려 (read concern) 가 설정하다 있으면 애플리케이션 에서 쓰기 (write) 결과를 읽을 수 있습니다.
동작에 대한 자세한 내용은
w: "majority"
동작을 참조하세요.w: <number>
데이터를 가지고 있는 복제본 세트의 모든 멤버는 w: <number> 쓰기 작업의 쓰기 확인에 기여할 수 있습니다.
다음 표에는 멤버가 j 값에 따라 쓰기를 확인할 수 있는 시점이 제시되어 있습니다.
j
는 지정되지 않음확인에는 메모리에 수행된 쓰기 작업이 필요합니다(j: false
).j: true
확인에는 온디스크 저널에 수행된 쓰기 작업이 필요합니다.j: false
확인에는 메모리에 수행된 쓰기 작업이 필요합니다.
참고
숨겨지거나, 지연되거나, 우선순위 0인 멤버는 w: <number>
쓰기 작업을 확인할 수 있습니다.
지연된 세컨더리는 구성된 secondaryDelaySecs
보다 이전에 완료된 쓰기 확인을 반환할 수 없습니다.
{ w: "majority" } 쓰기 후 읽기
MongoDB 8.0, { w: "majority" }
쓰기는 대다수의 데이터 보유 멤버가 oplog 항목을 안정적으로 작성한 후 승인을 반환합니다. 그런 다음, 멤버들은 로컬 oplog에서 변경 사항을 읽으면서 비동기적으로 적용합니다. 이전 릴리스에서 MongoDB는 멤버가 쓰기를 적용할 때까지 기다렸다가 승인을 반환했습니다.
{ w: "majority" }
쓰기 직후에 세컨더리 데이터베이스에 대한 쿼리는 승인을 반환하고 세컨더리 데이터베이스가 쓰기에서 변경 사항을 적용하기 전에 컬렉션에서 읽을 수 있습니다.
애플리케이션이 세컨더리에서 읽고 { w: "majority" }
쓰기에서 변경된 사항에 즉시 액세스해야 하는 경우 이러한 작업을 인과적 일관성 세션에서 실행하세요.
추가 정보
인과적으로 일관된 세션 및 쓰기 고려
인과적으로 일관된 클라이언트 세션의 경우, 클라이언트 세션은 다음과 같은 경우에만 인과적 일관성을 보장합니다.
관련된 읽기 작업은
"majority"
읽기 고려를 사용합니다.관련된 쓰기 작업은
"majority"
쓰기 고려를 사용합니다.
자세한 내용은 인과적 일관성을 참조하세요.
w: "majority"
행동
writeConcernMajorityJournalDefault
를false
로 설정하면 MongoDB는w: "majority"
쓰기가 디스크 저널에 작성되는 것을 기다리지 않고 쓰기를 확인합니다. 따라서 주어진 복제본 세트의 노드 과반수 이상이 일시적으로 손실된 경우(충돌, 재시작 등),"majority"
쓰기 작업이 롤백될 가능성이 있습니다.members[n].votes
가0
보다 크고 숨겨지거나, 지연되거나, 우선순위가 0인 멤버는"majority"
쓰기 작업을 확인할 수 있습니다.지연된 세컨더리는 구성된
secondaryDelaySecs
보다 이전에 완료된 쓰기 확인을 반환할 수 없습니다.
MongoDB 5.0부터
STARTUP2
상태의 복제본 집합 멤버는 쓰기 과반수에 참여하지 않습니다.
데이터베이스에서 쓰기 고려가 local
지원되지 않음
로컬 데이터베이스는 쓰기 고려를 지원하지 않습니다. MongoDB는 로컬 데이터베이스의 컬렉션에서의 작업에 대해 구성된 쓰기 고려를 자동으로 무시합니다.
쓰기 고려에 대한 과반수 계산
팁
rs.status()
는 계산된 과반수가 포함된 writeMajorityCount
필드를 반환합니다.
쓰기 고려의 과반수 "majority"
는 다음 값 중 더 작은 값으로 계산됩니다.
모든 투표 멤버의 과반수(중재자 포함)와
데이터를 보유한 모든 투표 멤버 수의 비교입니다.
경고
계산된 과반수가 데이터를 가진 모든 투표 구성원의 수와 동일한 상황(3개의 구성원을 가진 프라이머리-세컨더리-중재자 배포에서 등)에서, 데이터를 가진 투표 구성원이 다운되거나 접근할 수 없는 경우 쓰기 고려 "majority"
(은)는 타임아웃되거나 인정되지 않을 수 있습니다. 가능하다면 중재자 대신 데이터를 가진 투표 구성원을 사용하세요.
예를 들어 다음과 같이 생각해 보세요.
3개의 투표 구성원, P-S-S(프라이머리-세컨더리-세컨더리)가 있는 복제본 세트:
모든 투표 멤버의 과반수는 2명입니다.
모든 데이터 보유 투표 멤버의 수는 3명입니다.
The calculated majority is 2, the minimum of 2 and 3. The write must propagate to the primary and one of the secondaries to acknowledge the write concern"majority"
to the client.복제본 세트에는 투표 멤버 3명이 있으며, 프라이머리-세컨더리-중재자(P-S-A)입니다.
모든 투표 멤버의 과반수는 2명입니다.
데이터를 보유한 모든 투표 멤버 수는 2입니다.
The calculated majority is 2, the minimum of 2 and 2. Since the write can only be applied to data-bearing members, the write must propagate to the primary and the secondary to acknowledge the write concern"majority"
to the client.팁
데이터를 보유한 모든 투표권 있는 멤버가 쓰기를 승인할 수 있어야 하는 (P-S-A) 또는 기타 토폴로지에
"majority"
쓰기 고려를 사용하지 마세요."majority"
쓰기 고려를 사용할 때 내구성이 보장되기를 원하는 고객은 대신 P-S-S와 같이 모든 데이터 보유 투표 멤버를 사용할 필요가 없는 토폴로지를 사용해야 합니다.
경고
복제본 세트에 두 개 이상의 중재자를 배치하지 마세요. 복수 중재자 관련 우려 사항을 참조하세요.
기존 레플리카 세트에 중재자를 추가하려면 다음과 같이 하세요:
일반적으로 복제본 세트에 데이터를 보유하는 멤버가 두 개 이하인 경우 먼저 복제본 세트에 대한 클러스터 전체 쓰기 우려를 설정해야 할 수 있습니다.
클러스터 전체 쓰기 우려를 설정해야 하는 이유에 대한 자세한 내용은 클러스터 전체 쓰기 우려를 참조하세요.
중재자로 새로운 복제 세트를 시작하기 전에 클러스터 전체의 쓰기 고려 설정을 변경할 필요는 없습니다.
우려 사항 출처 작성
MongoDB는 특정 쓰기 고려의 원인을 나타내는 쓰기 고려 provenance
를 추적합니다. provenance
는 getLastError
메트릭, 읽기 고려 오류 객체, MongoDB 로그에 표시됩니다.
다음 표는 가능한 쓰기 고려 provenance
의 값과 그 중요성을 보여줍니다.
출처 | 설명 |
---|---|
clientSupplied | 쓰기 우려 사항은 애플리케이션에서 지정되었습니다. |
customDefault | 쓰기 고려는 사용자 정의된 기본값에서 비롯된 것입니다. setDefaultRWConcern 을 참조하십시오. |
getLastErrorDefaults | 쓰기 고려는 복제본 세트의 settings.getLastErrorDefaults 필드에서 발생했습니다. |
implicitDefault | 쓰기 고려는 다른 모든 쓰기 고려 사양이 없는 상태에서
서버에서 발생했습니다. |
쿼럼 커밋과 대조되는 쓰기 고려
쿼럼 커밋과 쓰기 고려(write concern) 간에는 다음과 같은 중요한 차이점이 있습니다.
인덱스 빌드는 쿼럼 커밋 사용합니다.
쓰기 작업은 쓰기 고려 사용합니다.
클러스터 내의 각 데이터 보유 노드는 투표권을 가진 노드입니다.
커밋 쿼럼은 프라이머리 멤버를 포함하여 몇 개의 데이터 보유 투표 멤버 또는 어떤 투표 멤버가 동시 인덱스 빌드를 커밋할 준비가 되어 있어야 하는지를 지정합니다. 이 준비가 완료되면 프라이머리 멤버가 커밋을 실행합니다.
쓰기 고려는 쓰기 작업이 지정된 수의 인스턴스로 전파되었다는 확인 수준입니다.
8.0 버전 변경 사항: 커밋 쿼럼은 프라이머리가 인덱스 빌드를 커밋하기 전에 인덱스 빌드를 완료할 준비가 되어 있어야 하는 노드 수를 지정합니다. 반대로 프라이머리가 인덱스 빌드를 커밋한 경우 쓰기 고려는 명령이 성공을 반환하기 전에 인덱스 빌드 oplog 항목을 복제해야 하는 노드 수를 지정합니다.
이전 릴리스에서는 프라이머리가 인덱스 빌드를 커밋했을 때 쓰기 고려가 명령이 성공적으로 반환되기 전에 인덱스 빌드를 완료해야 하는 노드 수를 지정했습니다.