문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/

쓰기 고려

이 페이지의 내용

  • 쓰기 고려 사양
  • 자세한 내용은 암시적 기본 쓰기 고려를 참조하세요.
  • 승인 동작
  • 추가 정보

쓰기 고려는 독립형 mongod, 복제본 세트 또는 샤드 클러스터 에 대한 쓰기 작업에 대해 MongoDB에서 요청하는 승인 수준을 설명합니다. 샤드 클러스터에서 mongos 인스턴스는 쓰기 고려를 샤드에 전달합니다.

참고

다중 문서 트랜잭션의 경우 개별 작업 수준이 아닌 트랜잭션 수준에서 쓰기 고려를 설정합니다. 트랜잭션에서 개별 쓰기 작업의 쓰기 고려를 명시적으로 설정하면 안 됩니다.

다중 문서 트랜잭션"majority" 쓰기 고려를 지정하고 트랜잭션이 복제본 세트 멤버의 계산된 과반수에 복제되지 못할 경우, 트랜잭션이 복제본 세트 멤버에서 즉시 롤백되지 않을 수 있습니다. 결국에는 복제본 세트가 일관성을 갖게 됩니다. 트랜잭션은 항상 모든 복제본 세트 멤버에 적용되거나 롤백됩니다.

복제본 세트와 샤딩된 클러스터는 글로벌 기본 쓰기 고려 설정을 지원합니다. 명시적인 쓰기 고려가 지정되지 않은 작업에는 글로벌 기본 쓰기 고려 설정이 적용됩니다. 자세한 내용은 setDefaultRWConcern을 참조하세요.

MongoDB Atlas에서 호스팅되는 배포서버에 대한 쓰기 고려 설정에 대해 자세히 알아보려면 MongoDB Atlas로 복원력 있는 애플리케이션 구축을 참조하세요.

쓰기 고려에는 다음 필드가 포함될 수 있습니다.

{ w: <value>, j: <boolean>, wtimeout: <number> }
  • w 옵션은 쓰기 작업이 지정된 수의 mongod인스턴스로 전파되었거나 지정된 태그를 가진 mongod 인스턴스로 전파되었음을 확인 요청하는 데 사용됩니다.

  • 쓰기 작업이 온디스크 저널에 기록되었다는 확인을 요청하는 j 옵션 및

  • 쓰기 작업이 무기한 차단되지 않도록 시간 제한을 지정하는 wtimeout 옵션을 사용할 수 있습니다.

w 옵션은 쓰기 작업이 지정된 개수의 mongod 인스턴스 또는 태그가 지정된 mongod 인스턴스로 전파되었음을 확인하도록 요청합니다. 쓰기 고려에 w 필드가 없는 경우, MongoDB는 w 옵션을 기본 쓰기 고려 설정으로 사용합니다.

참고

setDefaultRWConcern을 사용해 기본 쓰기 고려를 설정하는 경우, 반드시 w 필드 값을 지정해야 합니다.

w 옵션을 사용하면 다음과 같은 w: <value> 쓰기 고려를 사용할 수 있습니다.

설명
"majority"

쓰기 (write) 작업이 데이터를 가진 투표 노드 중 계산된 과반수에 성공적으로 커밋되었는지 확인해달라고 요청합니다(투표 노드는 members[n].votes0보다 큰 프라이머리와 세컨더리를 가리킴). 대부분의 MongoDB 배포서버에 적용하는 기본 쓰기 고려 (write concern)는 { w: "majority" }입니다. 자세한 내용은 암시적 기본 쓰기 고려 (write concern)에서 확인하세요.

예를 들어, 투표권이 있는 구성원이 3인 복제본 세트, 즉 프라이머리-세컨더리-세컨더리(P-S-S)가 있다고 고려합니다. 이 복제본 세트의 경우 계산된 과반수는 2이며, 쓰기는 프라이머리와 하나의 세컨더리로 전파되어야 클라이언트에게 쓰기 고려를 알릴 수 있습니다.

참고

members[n].votes0보다 크고 숨겨지거나, 지연되거나, 우선순위가 0인 멤버는 "majority" 쓰기 작업을 확인할 수 있습니다.

지연된 세컨더리는 구성된 secondaryDelaySecs보다 이전에 완료된 쓰기 확인을 반환할 수 없습니다.

쓰기 연산이 w: "majority" 승인과 함께 클라이언트에 반환된 후에는 클라이언트가 "majority" readConcern을 사용하여 해당 쓰기의 결과를 읽을 수 있습니다.

다중 문서 트랜잭션"majority" 쓰기 고려 (write concern)를 지정했지만 해당 트랜잭션이 복제본 세트 노드의 계산된 과반수에 복제되지 못할 경우, 트랜잭션이 복제본 세트 노드에서 즉시 롤백되지 않을 수 있습니다. 복제본 세트는 최종적으로 일관성을 갖게 됩니다. 트랜잭션은 항상 모든 복제본 세트 노드에 적용되거나 롤백됩니다.

어떤 조건에서 mongod 인스턴스가 쓰기를 인정하는지는 인정 행동을 참조하여 확인하세요.

<number>

쓰기 작업이 지정된 수의 mongod 인스턴스에 전파되었음을 확인 요청합니다. 예를 들면 다음과 같습니다.

w: 1

쓰기 작업이 독립형 mongod 또는 복제본 세트의 프라이머리로 전파되었음을 확인 요청합니다. 쓰기 작업이 세컨더리에 복제되기 전에 프라이머리가 강등되었을 경우 데이터가 롤백될 수 있습니다.

경고

쓰기 작업이 { w: 1 } 쓰기 고려를 사용하는 경우 쓰기 작업이 완료되기 전에 프라이머리가 다시 시작되면 롤백 디렉토리는 oplog hole 이후에 제출된 쓰기를 제외할 수 있습니다.

w: 0

쓰기 고려에 대한 확인을 요청하지 않습니다. 하지만 w: 0은 소켓 예외와 네트워킹 오류에 관한 정보를 애플리케이션에 반환할 수 있습니다. 쓰기 작업이 세컨더리에 복제되기 전에 프라이머리가 강등되었을 경우 데이터가 롤백될 수 있습니다.

w: 0을 지정했지만 j: true를 포함하면 j: true가 우선하여 독립형 mongod 또는 복제본 세트의 프라이머리에서 승인을 요청합니다.

w ~ 값이 1보다 큰 경우, 지정된 쓰기 고려를 충족하기 위해 프라이머리와 필요한 만큼의 데이터를 포함하는 세컨더리로부터 확인이 필요합니다. 쓰기 고려 임곗값을 충족하기 위해 세컨더리가 꼭 투표 구성원일 필요는 없습니다.

예를 들어, 1개의 프라이머리와 2개의 세컨더리가 있는 3개의 멤버를 가진 복제본 세트가 있다고 가정해 봅시다. w: 2를 지정하려면 프라이머리와 2개의 세컨더리 중 하나로부터 확인이 필요합니다. w: 3을 지정하면 프라이머리와 모든 세컨더리의 확인이 필요합니다.

참고

숨겨지거나, 지연되거나, 우선순위 0인 멤버는 w: <number> 쓰기 작업을 확인할 수 있습니다.

지연된 세컨더리는 구성된 secondaryDelaySecs보다 이전에 완료된 쓰기 확인을 반환할 수 없습니다.

어떤 조건에서 mongod 인스턴스가 쓰기를 인정하는지는 인정 행동을 참조하여 확인하세요.

<custom write concern name>

쓰기 작업이 settings.getLastErrorModes에 정의된 사용자 지정 쓰기 고려를 충족하는 tagged 멤버에 전파되었음을 확인 요청합니다. 예시는 사용자 지정 멀티 데이터 센터 쓰기 고려를 참조하세요.

사용자 지정 쓰기 고려가 프라이머리의 인정만을 요구하고, 쓰기 작업이 세컨더리에 복제되기 전에 프라이머리가 강등되었을 경우 데이터가 롤백될 수 있습니다.

어떤 조건에서 mongod 인스턴스가 쓰기를 인정하는지는 인정 행동을 참조하여 확인하세요.

다음도 참조하세요.

j 옵션은 MongoDB에 쓰기 작업이 온디스크 저널에 작성되었음을 확인 요청합니다.

j

j: true인 경우, w: <value>에 지정된 mongod 인스턴스가 온디스크 저널에 기록되었음을 확인하도록 요청합니다. j: true(은)는 그 자체로는 복제본 세트 프라이머리 페일오버로 인해 쓰기가 롤백되지 않을 거라는 것을 보장하지 않습니다.

참고

을 사용하면 MongoDB는 프라이머리를 포함하여 요청된 수의 멤버가 j: true 저널에 쓴 후에만 반환합니다. 이전에는 복제본 세트의 쓰기 고려는w: 쓰기<value> j: true 고려와 관계없이 프라이머 리만 저널에 쓰도록 요구했습니다.

참고

  • 저널링 없이 실행되는 mongod 인스턴스에 j: true를 포함하는 쓰기 고려를 지정하면 오류가 발생합니다.

  • 저널링이 활성화된 경우 w: "majority"j: true일 수 있습니다. writeConcernMajorityJournalDefault 복제본 세트 구성을 어떻게 설정하느냐에 따라 동작이 결정됩니다. 자세한 내용은 확인 동작을 참조하세요.

  • j: true를 포함하거나 암시하는 쓰기 고려는 즉시 저널 동기화를 유발합니다. 자세한 내용은 저널링 프로세스를 참조하세요.

이 옵션은 쓰기 고려의 시간제한을 밀리초 단위로 지정합니다. wtimeoutw1보다 큰 경우에만 적용됩니다.

wtimeout 은 필요한 쓰기 고려가 최종적으로 성공하더라도 지정된 제한 시간이 경과한 후에 쓰기 작업을 오류와 함께 반환하도록 합니다. 이러한 쓰기 고려가 반환되면 MongoDB는 쓰기 고려가 wtimeout 시간 제한을 초과하기 전에 수행된 성공적인 데이터 수정을 되돌리지 않습니다.

wtimeout 옵션을 지정하지 않았고 쓰기 고려 수준을 달성할 수 없는 경우, 쓰기 작업은 무기한으로 차단됩니다. wtimeout 값을 0으로 지정하면 wtimeout 옵션이 없는 쓰기 고려와 동일해집니다.

MongoDB 5.0부터는 w: majority가 암시적 기본 쓰기 고려로 설정되어 있습니다. 하지만 중재자가 포함된 배포의 경우 특별히 고려해야 할 점들이 있습니다.

  • 복제 세트의 투표 과반수는 1에 투표 회원 수의 절반을 반올림한 값입니다. 데이터를 포함하는 투표 구성원의 수가 투표 과반수보다 많지 않은 경우 기본 쓰기 문제는 { w: 1 } 입니다.

  • 다른 모든 시나리오에서 기본 쓰기 우려는 { w: "majority" }입니다.

  • 샤드 클러스터 의 경우, 기본 쓰기 고려는 항상 config 서버 에서 검색됩니다. config 서버에는 중재자가 있어야 하므로 샤딩된 클러스터에 대한 암시적 기본 쓰기 고려는 항상 "majority" 입니다. 샤드가 프라이머리-세컨더리-중재자 토폴로지에 있더라도 기본 쓰기 고려는 "majority" 입니다. MongoDB 5.1부터는 클러스터 전체 쓰기 고려가 설정되지 않은 경우 이 구성이 허용되지 않습니다.

특히 MongoDB는 다음 공식을 사용하여 기본 쓰기 문제를 결정합니다.

if [ (#arbiters > 0) AND (#non-arbiters <= majority(#voting-nodes)) ]
defaultWriteConcern = { w: 1 }
else
defaultWriteConcern = { w: "majority" }

예를 들어 다음 배포와 해당 기본 쓰기 문제를 고려해보세요.

비중재자
중재자
투표 노드
과반수 투표 노드
자세한 내용은 암시적 기본 쓰기 고려를 참조하세요.
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
온디스크 저널
inMemory
w: "majority"
저널링을 사용하여 실행하는 경우 온디스크 저널
온디스크 저널
inMemory

참고

writeConcernMajorityJournalDefaultfalse로 설정하면 MongoDB는 w: "majority" 쓰기가 디스크 저널에 작성되는 것을 기다리지 않고 쓰기를 확인합니다. 따라서 주어진 복제본 세트의 노드 과반수 이상이 일시적으로 손실된 경우(충돌, 재시작 등), "majority" 쓰기 작업이 롤백될 가능성이 있습니다.

w에 지정된 값은 성공을 반환하기 전에 쓰기를 승인해야 하는 복제본 세트 노드의 수를 결정합니다. 각 적격 복제본 세트 노드에 대해 j 옵션은 노드가 메모리에 쓰기 연산을 적용한 후 쓰기를 승인할지, 아니면 온디스크 저널에 쓰기를 수행한 후 쓰기를 승인할지를 결정합니다.

w: "majority"

복제본 세트의 데이터 보유 투표 멤버는 모두 "majority" 쓰기 작업의 쓰기 승인에 기여할 수 있습니다.

다음 표에는 멤버가 j 값에 따라 쓰기를 확인할 수 있는 시점이 제시되어 있습니다.

j 는 지정되지 않음

확인은 writeConcernMajorityJournalDefault의 값에 따라 달라집니다.

  • true인 경우, 확인에는 온디스크 저널에 수행된 쓰기 작업이 필요합니다(j: true).

    writeConcernMajorityJournalDefault 기본값 true

  • false인 경우, 확인에는 메모리에 수행된 쓰기 작업이 필요합니다(j: false).

j: true
확인에는 온디스크 저널에 수행된 쓰기 작업이 필요합니다.
j: false
확인에는 메모리에 수행된 쓰기 작업이 필요합니다.

참고

동작에 대한 자세한 내용은 w: "majority" 동작을 참조하세요.

w: <number>

데이터를 가지고 있는 복제본 세트의 모든 멤버는 w: <number> 쓰기 작업의 쓰기 확인에 기여할 수 있습니다.

다음 표에는 멤버가 j 값에 따라 쓰기를 확인할 수 있는 시점이 제시되어 있습니다.

j 는 지정되지 않음
확인에는 메모리에 수행된 쓰기 작업이 필요합니다(j: false).
j: true
확인에는 온디스크 저널에 수행된 쓰기 작업이 필요합니다.
j: false
확인에는 메모리에 수행된 쓰기 작업이 필요합니다.

참고

숨겨지거나, 지연되거나, 우선순위 0인 멤버는 w: <number> 쓰기 작업을 확인할 수 있습니다.

지연된 세컨더리는 구성된 secondaryDelaySecs보다 이전에 완료된 쓰기 확인을 반환할 수 없습니다.

인과적으로 일관된 클라이언트 세션의 경우, 클라이언트 세션은 다음과 같은 경우에만 인과적 일관성을 보장합니다.

  • 관련된 읽기 작업은 "majority" 읽기 고려를 사용합니다.

  • 관련된 쓰기 작업은 "majority" 쓰기 고려를 사용합니다.

자세한 내용은 인과적 일관성을 참조하세요.

로컬 데이터베이스는 쓰기 고려를 지원하지 않습니다. MongoDB는 로컬 데이터베이스의 컬렉션에서의 작업에 대해 구성된 쓰기 고려를 자동으로 무시합니다.

rs.status()는 계산된 과반수가 포함된 writeMajorityCount 필드를 반환합니다.

쓰기 고려의 과반수 "majority"는 다음 값 중 더 작은 값으로 계산됩니다.

  • 모든 투표 멤버의 과반수(중재자 포함)와

  • 데이터를 보유한 모든 투표 멤버 수의 비교입니다.

경고

계산된 과반수가 데이터를 가진 모든 투표 구성원의 수와 동일한 상황(3개의 구성원을 가진 프라이머리-세컨더리-중재자 배포에서 등)에서, 데이터를 가진 투표 구성원이 다운되거나 접근할 수 없는 경우 쓰기 고려 "majority"(은)는 타임아웃되거나 인정되지 않을 수 있습니다. 가능하다면 중재자 대신 데이터를 가진 투표 구성원을 사용하세요.

예를 들어 다음과 같이 생각해 보세요.

  • 3개의 투표 구성원, P-S-S(프라이머리-세컨더리-세컨더리)가 있는 복제본 세트:

    • 모든 투표 멤버의 과반수는 2명입니다.

    • 모든 데이터 보유 투표 멤버의 수는 3명입니다.

    계산된 과반수는 2이고 최소값은 2와 3입니다. 쓰기 고려 "majority"를 클라이언트에 확인하려면 쓰기가 프라이머리 및 세컨더리 중 하나에 전파되어야 합니다.
  • 복제본 세트에는 투표 멤버 3명이 있으며, 프라이머리-세컨더리-중재자(P-S-A)입니다.

    • 모든 투표 멤버의 과반수는 2명입니다.

    • 데이터를 보유한 모든 투표 멤버 수는 2입니다.

    계산된 과반수는 2이고 최소값은 2, 2입니다. 쓰기는 데이터를 보유한 구성원에게만 적용될 수 있으므로 쓰기가 프라이머리와 세컨더리에 전파되어야만 클라이언트에 대한 쓰기 고려 "majority"(을)를 확인할 수 있습니다.

    데이터를 보유한 모든 투표권 있는 멤버가 쓰기를 승인할 수 있어야 하는 (P-S-A) 또는 기타 토폴로지에 "majority" 쓰기 고려를 사용하지 마세요. "majority" 쓰기 고려를 사용할 때 내구성이 보장되기를 원하는 고객은 대신 P-S-S와 같이 모든 데이터 보유 투표 멤버를 사용할 필요가 없는 토폴로지를 사용해야 합니다.

MongoDB는 특정 쓰기 고려의 원인을 나타내는 쓰기 고려 provenance를 추적합니다. provenancegetLastError 메트릭, 읽기 고려 오류 객체, MongoDB 로그에 표시됩니다.

다음 표는 가능한 쓰기 고려 provenance 의 값과 그 중요성을 보여줍니다.

출처
설명
clientSupplied
쓰기 우려 사항은 애플리케이션에서 지정되었습니다.
customDefault
쓰기 고려는 사용자 정의된 기본값에서 비롯된 것입니다. setDefaultRWConcern을 참조하십시오.
getLastErrorDefaults
쓰기 고려는 복제본 세트의 settings.getLastErrorDefaults 필드에서 발생했습니다.
implicitDefault
쓰기 고려는 다른 모든 쓰기 고려 사양이 없는 상태에서 서버에서 발생했습니다.

돌아가기

"snapshot"

다음

CRUD 개념