AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

인과적 일관성 및 읽기 및 쓰기 고려

MongoDB의 인과적으로 일관된 클라이언트 세션을 사용하면 읽기 및 쓰기 문제의 다양한 조합을 통해 서로 다른 인과적 일관성을 보장할 수 있습니다.

다음 표에는 다양한 조합이 제공하는 구체적인 보장이 나열되어 있습니다.

readConcern
쓰기 고려
쓰기 읽기
단조적 읽기
단조로운 쓰기
읽기 후 쓰기

✅

✅

✅

✅

✅

✅

✅

데이터 내구성과 인과적 일관성을 원하는 경우, 표에서 볼 수 있듯이 "majority" 읽기 고려가 있는 읽기 작업과 "majority" 쓰기 고려가 있는 쓰기 작업만 네 가지 인과적 일관성을 모두 보장할 수 있습니다. 즉, 인과적으로 일관된 클라이언트 세션은 다음에 대해서만 인과적 일관성을 보장할 수 있습니다.

  • "majority" 읽기 고려가 있는 읽기 작업, 즉, 대부분의 복제본 세트 멤버가 승인하고 지속적으로 데이터를 반환하는 읽기 작업입니다.

  • "majority" 쓰기 고려가 있는 쓰기 작업, 다시 말해, 복제본 세트의 투표 노드 과반수에게 작업이 적용되었다는 승인을 요청하는 쓰기 작업입니다.

데이터 내구성이 없는(즉, 쓰기가 롤백될 수 있음) 인과적 일관성을 원하는 경우 { w: 1 } 쓰기 고려가 있는 쓰기 연산도 인과적 일관성을 제공할 수 있습니다.

참고

읽기 및 쓰기 고려의 다른 조합도 일부 상황에서는 네 가지 인과적 일관성 보장을 모두 충족할 수 있지만 모든 상황에서 반드시 그런 것은 아닙니다.

읽기 고려 "majority" 및 쓰기 고려 "majority"는 네트워크 파티션과 같이 복제본 세트의 두 노드가 일시적으로 자신이 프라이머리라고 믿는 상황에서도 네 가지 인과적 일관성이 보장되도록 합니다. 그리고 두 프라이머리 모두 { w: 1 } 쓰기 고려로 쓰기를 완료할 수 있지만, 하나의 프라이머리만 "majority" 쓰기 고려로 쓰기를 완료할 수 있습니다.

예를 들어 네트워크 파티션이 5명의 복제본 세트 멤버를 분할하는 상황을 생각해 보세요:

네트워크 파티션: 한쪽에서 새 프라이머리가 선출되었지만 이전 프라이머리가 아직 물러나지 않은 상태입니다.
클릭하여 확대

예시

위의 파티션으로

  • "majority" 쓰기 고려로 쓸 경우 P 새로운 항목에서 완료할 수 있지만 P 오래된 항목에서는 완료할 수 없습니다.

  • { w: 1 } 쓰기 고려를 가진 쓰기는 P 이전 또는 P 신규 항목에서 완료할 수 있습니다. 그러나 P 이전에 대한 쓰기(S 1에 복제된 쓰기 포함)는 이러한 멤버가 나머지 복제본 세트와 다시 통신하면 롤백됩니다.

  • P 새로운 "majority"쓰기 고려가 있는 성공적인 쓰기 후 "majority" 읽기 고려가 있는 일관된 읽기는 P 새로운 항목, S 2 및 S 3에 대한 쓰기를 관찰할 수 있습니다. 또한 읽기는 복제본 세트의 나머지 부분과 통신하고 복제본 세트의 다른 멤버와 동기화할 수 있게 되면 P 오래된 항목 및 S 1에 대한 쓰기를 관찰할 수 있습니다. 이전에 P 오래된 항목에 쓰거나 파티션 처리 동안 S1에 복제된 모든 쓰기는 롤백됩니다.

읽기 고려 및 쓰기 고려 관련 요구 사항을 설명하기 위해 다음 시나리오에서는 클라이언트가 읽기 및 쓰기 고려가 다양하게 조합된 일련의 작업을 복제본 세트에 실행하도록 합니다.

인과적으로 일관된 세션에서 읽기 고려 "majority"와 쓰기 고려 "majority"을 사용하면 다음과 같은 인과적 일관성이 보장됩니다.

자체 쓰기 읽기 ✅ 단조적 읽기 ✅ 단조적 쓰기 ✅ 읽기 후 쓰기

참고

시나리오 1(읽기 고려 '대다수' 및 쓰기 고려 '대다수')

프라이머리가 두 개인 이 일시적인 기간 동안에는 P 새로운 항목만이 { w: "majority" } 쓰기 고려를 통해 쓰기를 수행할 수 있으므로 클라이언트 세션에서 다음 작업 순서를 성공적으로 실행할 수 있습니다.

시퀀스
예시

1. 1을 쓰기 고려 (write concern) "majority"를 사용하여 P new에 쓰기 (write)합니다.
2. 1을(를) 읽기 고려 (read concern) "majority"를 사용하여 2에 S으로 읽습니다.
3. 2를 쓰기 고려 (write concern) "majority"를 사용하여 P에 new쓰기 (write)

4. 읽기 2 고려 (read concern) 로 을(를) "majority" 읽어(으)로 보냅니다.S 3

항목 A의 경우 qty에서 50로 업데이트합니다.
항목 A을 읽습니다.
qty이 50보다 작거나 이와 같은 경우,
restock을 true(으)로 업데이트합니다.
A 항목을 읽습니다.

읽기 고려 대다수 및 쓰기 고려 대다수를 사용하는 두 개의 프라이머리가 있는 데이터 상태
클릭하여 확대

✅ 자체 쓰기 읽기

읽기 1는 쓰기 (write) 1 이후의 상태를 반영하는 S 2의 데이터를 읽습니다.
읽기 2는 쓰기 1 다음 쓰기 2 이후의 상태를 반영하는 S 3의 데이터를 읽습니다.

✅ 단조적 읽기

읽기 2는 읽기 1 이후의 상태를 반영하는 S3에서 데이터를 읽습니다.

✅ 단조적 쓰기

쓰기는 2 쓰기 이후의 상태를 반영하는 1 P 새로운 항목에서 데이터를 업데이트합니다.

✅ 읽기 다음에 쓰기

쓰기 2는 읽기 1 이후의 데이터 상태를 반영하는 P 신규에 데이터를 업데이트합니다. 즉, 읽기 1에서 읽은 데이터가 이전 상태에 반영된다는 의미입니다.

참고

시나리오 2 (읽기 고려 '대다수' 및 쓰기 고려 '대다수')

읽기 고려가 있는 읽기1의 경우 "majority"가 S 1으로 라우팅되는 대체 시퀀스를 고려합니다:

시퀀스
예시

1.1 "majority" P
2쓰기 고려 (write concern) 가 1 있는 를 새 "majority" 에 S 1
3 씁니다. 읽기 고려 2 (read concern) "majority" 가 P 있는 를 로

4 읽습니다. 쓰기 고려 (write concern) 가 있는 2 를 새 에 씁니다. 읽기 고려 (read concern) 가 있는 를 로 "majority" 읽습니다.S 3

항목 A의 경우 qty에서 50로 업데이트합니다.
항목 A을 읽습니다.
qty이 50보다 작거나 이와 같은 경우,
restock을 true(으)로 업데이트합니다.
A 항목을 읽습니다.

이 시퀀스에서 읽기는 1 P 오래된 항목에서 과반수 커밋 포인트가 진행되기 전에 반환될 수 없습니다. 이는 P 오래된 항목 및 S 1이 복제본 세트의 나머지 부분과 통신할 수 있을 때까지 진행될 수 없습니다. 이때 P 오래된 항목이 중단(아직 중단되지 경우)되며, 두 멤버가 복제본 세트의 다른 멤버로부터 동기화(쓰기 포함1)합니다.

✅ 자체 쓰기 읽기

읽기 1은 네트워크 파티션이 복구되고 멤버가 복제본 세트의 다른 멤버와 동기화된 후에도 쓰기 1 이후의 데이터 상태를 반영합니다.

읽기 2가 쓰기 1과 쓰기 2 이후의 상태를 반영하는 S 3에서 데이터를 읽습니다.

✅ 단조적 읽기

읽기는2 S에서3 읽기1 이후의 상태를 반영하는 데이터를 읽습니(즉, 읽기1에 의해 데이터 읽기에 이전 상태가 반영됨).

✅ 단조적 쓰기

쓰기는 2 쓰기 이후의 상태를 반영하는 1 P 새로운 항목에서 데이터를 업데이트합니다.

✅ 읽기 다음에 쓰기

쓰기 2는 읽기 1 이후의 데이터 상태를 반영하는 P 신규에 데이터를 업데이트합니다. 즉, 읽기 1에서 읽은 데이터가 이전 상태에 반영된다는 의미입니다.

인과적으로 일관된 세션에서 읽기 고려 "majority"와 쓰기 고려 { w: 1 }을 사용하면 데이터 내구성에 대한 인과적 일관성을 원하는 경우 다음과 같은 인과적 일관성이 보장됩니다.

자체 쓰기 읽기 ❌ 단조적 읽기 ❌ 단조적 쓰기 ✅ 읽기 후 쓰기

데이터 내구성 없이 인과적 일관성을 유지하려는 경우:

자체 쓰기 읽기 ✅ 단조적 읽기 ✅ 단조적 쓰기 ✅ 읽기 후 쓰기

참고

시나리오 3(읽기 고려 '대다수' 및 쓰기 고려 {w: 1})

두 개의 프라이머리가 있는 일시적인 기간 동안 P 오래된 항목 및 P 새로운 항목 모두 { w: 1 } 쓰기 고려를 통해 쓰기를 수행할 수 있으므로 클라이언트 세션에서 다음 작업 순서를 성공적으로 실행할 수 있지만 데이터 내구성이 유지되는 인과적 일관성을 원하는 경우 인과적으로 일관되지 않을 수 있습니다:

시퀀스
예시

1. 쓰기 1 { w: 1 } P 고려 (write concern)
2 를 사용하여 이전 에 쓰기 (write) 를 씁니다.. 1을(를) 읽기 고려 (read concern) "majority"를 사용하여 2에 S으로 읽습니다.
3. 2를 쓰기 고려 (write concern) { w: 1 }를 사용하여 P에 new쓰기 (write)

4. 2를 읽기 고려 (read concern) "majority"를 사용하여 S 3로 읽습니다.

항목 A의 경우 qty에서 50로 업데이트합니다.
항목 A을 읽습니다.
qty이 50보다 작거나 이와 같은 경우,
restock을 true(으)로 업데이트합니다.
A 항목을 읽습니다.

읽기 고려 대다수 및 쓰기 고려 1을 사용하는 두 개의 프라이머리가 있는 데이터 상태
클릭하여 확대

해당 시퀀스에서,

  • 읽기 1은 쓰기 1의 시점을 지나 P에서 새로 과반수 커밋 포인트가 진행될 때까지 반환할 수 없습니다.

  • 읽기 2는 과반수 커밋 포인트가 쓰기2 시점을 지나 P 새로운 항목으로 진행될 때까지 반환할 수 없습니다.

  • 쓰기 1은 네트워크 파티션이 복구될 때 롤백됩니다.

데이터 내구성이 유지된 인과적 일관성을 원하는 경우

❌ 자체 쓰기 읽기

읽기1은 쓰기1 이후의 상태를 반영하지 않는 S 2의 데이터를 읽습니다.

✅ 단조적 읽기

읽기는2 S에서3 읽기1 이후의 상태를 반영하는 데이터를 읽습니(즉, 읽기1에 의해 데이터 읽기에 이전 상태가 반영됨).

❌ 단조적 쓰기

쓰기2는 쓰기1 이후의 상태를 반영하지 않는 P 새로운 항목에 대한 데이터를 업데이트합니다.

✅ 읽기 다음에 쓰기

쓰기 2는 읽기 1 이후의 데이터 상태를 반영하는 P 신규에 데이터를 업데이트합니다. 즉, 읽기 1에서 읽은 데이터가 이전 상태에 반영된다는 의미입니다.

➤ 데이터 내구성이 유지된 인과적 일관성을 원하는 경우

✅ 자체 쓰기 읽기

읽기1은 쓰기1에 해당하는 상태 를 반영하는 S 2에서 데이터를 읽은 다음 쓰기1을 롤백 합니다.

✅ 단조적 읽기

읽기는2 S에서3 읽기1 이후의 상태를 반영하는 데이터를 읽습니(즉, 읽기1에 의해 데이터 읽기에 이전 상태가 반영됨).

✅ 단조적 쓰기

쓰기2는 쓰기1을 롤백한 후 쓰기1 해당하는 P 새로운 항목에 대한 데이터를 업데이트합니다.

✅ 읽기 다음에 쓰기

쓰기 2는 읽기 1 이후의 상태를 반영하는 P 신규에 데이터를 업데이트합니다. 즉, 읽기 1에서 읽은 데이터가 이전 상태에 반영된다는 의미입니다.

참고

시나리오 4(읽기 고려 '대다수' 및 쓰기 고려 {w: 1})

읽기 고려가 있는 읽기1의 경우 "majority"가 S 1으로 라우팅되는 대체 시퀀스를 고려합니다:

시퀀스
예시

1. 쓰기 1 { w: 1 } P 고려 (write concern)
2 를 사용하여 이전 에 쓰기 (write) 를 씁니다.. 1을(를) 읽기 고려 (read concern) "majority"를 사용하여 1에 S으로 읽습니다.
3. 2를 쓰기 고려 (write concern) { w: 1 }를 사용하여 P에 new쓰기 (write)

4. 2를 읽기 고려 (read concern) "majority"를 사용하여 S 3로 읽습니다.

항목 A의 경우 qty에서 50로 업데이트합니다.
항목 A을 읽습니다.
qty이 50보다 작거나 이와 같은 경우,
restock을 true(으)로 업데이트합니다.
A 항목을 읽습니다.

해당 시퀀스에서:

  • 읽기 1은 S 1에서 과반수 커밋 포인트가 진행될 때까지 반환할 수 없습니다. P 이전 및 S 1이 나머지 복제본 세트와 통신할 수 있을 때까지는 이 문제가 발생하지 않습니다. 이때 P 이전이 물러나고(아직 물러나지 않은 경우), 쓰기 1이 P 이전과 S 1에서 롤백되고, 두 노드는 복제본 세트의 다른 노드로부터 동기화됩니다.

데이터 내구성이 유지된 인과적 일관성을 원하는 경우

❌ 자체 쓰기 읽기

읽기 1에서 읽은 데이터는 롤백된 쓰기 1의 결과를 반영하지 않습니다.

✅ 단조적 읽기

읽기2는 읽기1 이후의 상태를 반영하는 S 3에서 데이터를 읽습니다(즉, 읽기 1에서 읽은 데이터를 반영하는 이전 상태를 의미함).

❌ 단조적 쓰기

쓰기 2는 쓰기 1 이후의 상태를 반영하지 않는 P 신규에 데이터를 업데이트하는데, 이 데이터는 쓰기 2보다 앞서 있었지만 롤백되는 것입니다.

✅ 읽기 다음에 쓰기

쓰기 2는 읽기 1 이후의 상태를 반영하는 P 신규에 데이터를 업데이트합니다. 즉, 읽기 1에서 읽은 데이터가 이전 상태에 반영된다는 의미입니다.

➤ 데이터 내구성이 유지된 인과적 일관성을 원하는 경우

✅ 자체 쓰기 읽기

읽기1은 궁극적으로 쓰기1이 롤백된 이후 쓰기 1의 최종 결과를 반영하는 데이터를 반환합니다.

✅ 단조적 읽기

읽기2는 읽기1 이후의 상태를 반영하는 S 3에서 데이터를 읽습니다(즉, 이전 상태가 읽기 1에서 읽은 데이터를 반영한다는 의미).

✅ 단조적 쓰기

쓰기2는 쓰기1을 롤백한 후 쓰기1 해당하는 P 새로운 항목에 대한 데이터를 업데이트합니다.

✅ 읽기 다음에 쓰기

쓰기 2는 읽기 1 이후의 데이터 상태를 반영하는 P 신규에 데이터를 업데이트합니다. 즉, 읽기 1에서 읽은 데이터가 이전 상태에 반영된다는 의미입니다.

인과적으로 일관된 세션에서 읽기 고려 "local"와 쓰기 고려 { w: 1 }를 사용하면 인과적 일관성을 보장할 수 없습니다.

❌ 자체 쓰기 읽기 ❌ 단조적 읽기 ❌ 단조적 쓰기 ❌ 읽기 후 쓰기

이 조합은 상황에 따라 네 가지 인과적 일관성 보장을 모두 충족할 수 있지만 모든 상황에서 반드시 그런 것은 아닙니다.

참고

시나리오 5(읽기 고려 '로컬' 및 쓰기 고려 {w: 1})

이 일시적인 기간 동안에는 P 이전 및 P 신규 모두 { w: 1 } 쓰기 고려를 통해 쓰기를 수행할 수 있으므로 클라이언트 세션에서 다음 작업 순서를 성공적으로 실행할 수 있지만 인과적으로 일관되지 않을 수 있습니다:

시퀀스
예시

1. 쓰기 1 { w: 1 } P 고려 (write concern)
2 를 사용하여 이전 에 쓰기 (write) 를 씁니다.. 1을(를) 읽기 고려 (read concern) "local"를 사용하여 1에 S으로 읽습니다.
3. 2를 쓰기 고려 (write concern) { w: 1 }를 사용하여 P에 new쓰기 (write)

4. 읽기 2 고려 (read concern) 로 을(를) "local" 읽어(으)로 보냅니다.S 3

항목 A의 경우 qty에서 50로 업데이트합니다.
항목 A을 읽습니다.
qty이 50보다 작거나 이와 같은 경우,
restock을 true(으)로 업데이트합니다.
A 항목을 읽습니다.

읽기 고려 로컬 및 쓰기 고려 1을 사용하는 두 개의 프라이머리가 있는 데이터 상태
클릭하여 확대

❌ 자체 쓰기 읽기

읽기 2가 쓰기 1과 쓰기 2가 아니라 Write 2 이후의 상태만 반영하는 S 3에서 데이터를 읽습니다.

❌ 단조적 읽기

읽기 2는 읽기 1 이후의 상태를 반영하지 않는 S 3에서 데이터를 읽습니다(즉, 이전 상태는 읽기 1에서 읽은 데이터를 반영하지 않음).

❌ 단조적 쓰기

쓰기2는 쓰기1 이후의 상태를 반영하지 않는 P 새로운 항목에 대한 데이터를 업데이트합니다.

❌ 읽기 후 쓰기

쓰기 2는 읽기 1 이후의 상태를 반영하지 않는 P 신규에 데이터를 업데이트합니다(즉, 이전 상태는 읽기 1에서 읽은 데이터를 반영하지 않음).

인과적으로 일관된 세션에서 읽기 고려 "local"와 쓰기 고려 "majority"을 사용하면 다음과 같은 인과적 일관성이 보장됩니다.

❌ 자체 쓰기 읽기 ❌ 단조적 읽기 ✅ 단조적 쓰기 ❌ 읽기 후 쓰기

이 조합은 상황에 따라 네 가지 인과적 일관성 보장을 모두 충족할 수 있지만 모든 상황에서 반드시 그런 것은 아닙니다.

참고

시나리오 6(읽기 고려 '로컬' 및 쓰기 고려 '대다수')

이 일시적인 기간 동안에는 P 새로운 항목만이 { w: "majority" } 쓰기 고려를 통해 쓰기를 수행할 수 있으므로 클라이언트 세션에서 다음 작업 순서를 성공적으로 실행할 수 있지만 인과적으로 일관되지 않을 수 있습니다:

시퀀스
예시

1. 1을 쓰기 고려 (write concern) "majority"를 사용하여 P new에 쓰기 (write)합니다.
2. 1을(를) 읽기 고려 (read concern) "local"를 사용하여 1에 S으로 읽습니다.
3. 2를 쓰기 고려 (write concern) "majority"를 사용하여 P에 new쓰기 (write)

4. 읽기 2 고려 (read concern) 로 을(를) "local" 읽어(으)로 보냅니다.S 3

항목 A의 경우 qty에서 50로 업데이트합니다.
항목 A을 읽습니다.
qty이 50보다 작거나 이와 같은 경우,
restock을 true(으)로 업데이트합니다.
A 항목을 읽습니다.

읽기 고려 로컬 및 쓰기 고려 대다수를 사용하는 두 개의 프라이머리가 있는 데이터 상태
클릭하여 확대

❌ 자체 쓰기 읽기

읽기1은 쓰기 1 이후의 상태를 반영하지 않는 S 1의 데이터를 읽습니다.

❌ 단조적 읽기입니다.

읽기 2는 읽기 1 이후의 상태를 반영하지 않는 S 3에서 데이터를 읽습니다(즉, 이전 상태는 읽기 1에서 읽은 데이터를 반영하지 않음).

✅ 단조적 쓰기

쓰기는 2 쓰기 이후의 상태를 반영하는 1 P 새로운 항목에서 데이터를 업데이트합니다.

❌ 읽기 후 쓰기

쓰기 2는 읽기 1 이후의 상태를 반영하지 않는 P 신규에 데이터를 업데이트합니다(즉, 이전 상태는 읽기 1에서 읽은 데이터를 반영하지 않음).

이 페이지 평가하기