mongodb는 CAP 정리에서 어디에 서 있습니까?


121

어디를 가든 MongoDB가 CP라는 것을 알 수 있습니다. 하지만 파헤쳐 보면 결국 일관성이 있음을 알 수 있습니다. safe = true를 사용할 때 CP입니까? 그렇다면 safe = true로 쓸 때 결과를 얻기 전에 모든 복제본이 업데이트된다는 의미입니까?

답변:


104

MongoDB는 기본적으로 강력하게 일관됩니다. 쓰기를 한 다음 읽기를 수행하면 쓰기가 성공했다고 가정하면 방금 읽은 쓰기의 결과를 항상 읽을 수 있습니다. 이는 MongoDB가 단일 마스터 시스템이고 모든 읽기가 기본적으로 기본으로 이동하기 때문입니다. 선택적으로 보조에서 읽기를 활성화하면 MongoDB는 오래된 결과를 읽을 수있는 곳에서 결국 일관성을 갖게됩니다.

MongoDB는 복제본 세트에서 자동 장애 조치를 통해 고 가용성을 제공합니다. http://www.mongodb.org/display/DOCS/Replica+Sets


13
aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads 에 따르면 복제본 세트의 기본 노드에서 읽더라도 부실하거나 더티 데이터를 얻을 수 있습니다. 그래서 MongoDB는 일관성이 강합니까 ??
Mike Argyriou 2015 년

3
Kyle의 멋진 실험. 정말 몽고를 사냥합니다. 예를 들어 결제 트랜잭션을 수행하는 MongoDB를 사용하는 프로덕션 시스템이 있는지 궁금합니다. 강력한 일관성을 중요시하는 개인 웹 사이트라면.
xin

5
기록을 위해 MongoDB v3.4는 Kyle이 설계 한 테스트를 통과 했으므로 예, MongoDB는 ReplicaSet 및 Sharding에서도 강력한 일관성을 유지합니다. mongodb.com/mongodb-3.4-passes-jepsen-test
막심 보그 너

2
MongoDB는 구성에 따라 수시로 가용성을 희생 할 수 있기 때문에이 답변은 너무 단순 할 수 있습니다. JoCa는 CA / CP / AP가 작동하는 상황을 더 잘 설명합니다.
PaoloC

37

루카스 포스트에 동의합니다. MongoDB가 CP / AP / CA라고 말할 수는 없습니다. 실제로 데이터베이스 / 드라이버 구성 및 재해 유형에 따라 C, A 및 P 사이절충안 이기 때문 입니다 . 여기에 시각적 요약이 있습니다. 더 자세한 설명.

    Scenario                   | Main Focus | Description
    ---------------------------|------------|------------------------------------
    No partition               |     CA     | The system is available 
                               |            | and provides strong consistency
    ---------------------------|------------|------------------------------------
    partition,                 |     AP     | Not synchronized writes 
    majority connected         |            | from the old primary are ignored                
    ---------------------------|------------|------------------------------------
    partition,                 |     CP     | only read access is provided
    majority not connected     |            | to avoid separated and inconsistent systems

일관성:

MongoDB는 단일 연결 또는 올바른 쓰기 / 읽기 문제 수준 을 사용할 때 강력하게 일관됩니다 ( 실행 속도가 저하됨 ). 이러한 조건을 충족하지 않으면 (특히 보조 복제본에서 읽을 때) MongoDB는 Eventually Consistent가됩니다.

유효성:

MongoDB는 Replica-Sets를 통해 고 가용성을 얻습니다 . 기본이 다운되거나 다른 곳에서 사용할 수 없게되는 즉시 보조는 다시 사용할 수있는 새 기본을 결정합니다. 여기에는 단점이 있습니다. 이전 기본에서 수행되었지만 보조와 동기화되지 않은 모든 쓰기가 롤백됩니다. 및 롤백 파일에 저장이되는 즉시 세트에 다시 연결로 (이전 기본은 보조입니다 지금). 따라서이 경우 가용성을 위해 일부 일관성이 희생됩니다.

파티션 공차 :

상기 레플리카 세트의 사용을 통해 MongoDB는 파티션 허용도를 달성합니다. 레플리카 세트의 서버 중 절반 이상이 서로 연결되어 있는 한 새로운 1 차 서버를 선택할 수 있습니다 . 왜? 두 개의 분리 된 네트워크를 보장하기 위해 둘 다 새로운 기본을 선택할 수는 없습니다. 충분한 보조가 서로 연결되지 않은 경우에도 여전히 읽을 수 있지만 (일관성이 보장되지 않음) 쓰기는 불가능합니다. 이 세트는 일관성을 위해 사실상 사용할 수 없습니다.


따라서 올바른 쓰기 / 읽기 문제 수준을 사용하는 경우 모든 쓰기 및 읽기가 기본으로 이동한다는 의미입니다 (올바르게 이해 한 경우). 그러면 보조가 정확히 무엇을합니까? 기본이 중단 될 경우를 대비하여 대기 상태로 앉아 계십니까?
tomer.z

@ tomer.z 매뉴얼 의이 섹션 을 읽고 싶을 수 있습니다. 읽기를 위해 보조 파일을 사용할 수 있습니다. "다수"읽기 수준을 사용하는 경우 회원의 과반수가 읽기를 승인하는 즉시 읽기가 유효합니다. "다수"쓰기 수준도 마찬가지입니다. 두 가지 모두에 대해 "다수"우려 수준을 사용하는 경우 일관된 데이터베이스가 있습니다. 이에 대한 자세한 내용은 설명서를 참조하십시오 .
JoCa

18

A와 화려한 새로운 기사가 나타나서 일부 카일로 멋진 실험 이 분야에서 C 또는 A로 MongoDB를, 그리고 다른 데이터베이스를 라벨 때주의해야

물론 CAP는 데이터베이스가 우세한 내용을 많은 말없이 추적하는 데 도움이되지만, 사람들은 예를 들어 CAP의 C가 원자 일관성 (선형성)을 의미한다는 사실을 종종 잊습니다. 그리고 이것은 분류하려고 할 때 이해하는 데 많은 고통을주었습니다. 따라서 MongoDB가 강력한 일관성을 제공하는 것 외에도 이것이 C라는 것을 의미하지는 않습니다. 이런 식으로이 분류를 만들면 실제로 작동하는 방식에 대해 더 깊이 설명하여 의심을 남기지 않는 것이 좋습니다.


10

네, 사용시 CP safe=true입니다. 이것은 단순히 데이터가 마스터 디스크로 전송되었음을 의미합니다. 일부 복제본에도 도착했는지 확인하려면 'w = N'매개 변수를 살펴보십시오. 여기서 N은 데이터를 저장해야하는 복제본의 수입니다.

자세한 내용은 thisthis 를 참조하십시오.


3

Mongo의 P에 대해 잘 모르겠습니다. 상황을 상상해보십시오.

  • 복제본은 두 개의 파티션으로 분할됩니다.
  • 새로운 마스터가 선출됨에 따라 양측에 계속 쓰기
  • 파티션이 해결됨-이제 모든 서버가 다시 연결됨
  • 새로운 마스터가 선택됩니다. 즉 oplog가 가장 높은 마스터가 선택되지만 다른 마스터의 데이터는 파티션 이전의 공통 상태로 되돌아가 수동 복구를 위해 파일로 덤프됩니다.
  • 모든 보조가 새 마스터를 따라 잡습니다.

여기서 문제는 덤프 파일 크기가 제한되어 있고 파티션이 오랫동안 있으면 데이터를 영원히 잃을 수 있다는 것입니다.

당신은 그것이 일어날 것 같지 않다고 말할 수 있습니다. 그렇습니다. 클라우드에서 생각하는 것보다 더 흔하지 않다면 말입니다.

이 예는 데이터베이스에 문자를 할당하기 전에 매우주의해야하는 이유입니다. 너무 많은 시나리오와 구현이 완벽하지 않습니다.

이 시나리오가 Mongo의 이후 릴리스에서 해결되었는지 아는 사람이 있으면 의견을 보내주십시오! (나는 한동안 일어난 모든 일을 따르지 않았습니다 ..)


2
MongoDB의 선거 프로토콜은 (최대) 단일 기본을 갖도록 설계되었습니다. 기본은 구성된 복제 세트 투표 구성원의 엄격한 과반수 (n / 2 +1)에 의해서만 선택 (및 유지) 될 수 있습니다. 네트워크 파티션의 경우 하나의 파티션 (투표 멤버의 과반수 포함) 만 1 차 파티션을 선택할 수 있습니다. 소수 파티션의 이전 기본은 단계적으로 내려가 보조가됩니다. 이것이 복제 세트가 항상 작동하는 방식입니다. 이전 기본이 복제되지 않은 쓰기를 수락 한 경우 해당 구성원이 복제 세트에 다시 참여하면 해당 쓰기가 롤백 (디스크에 저장)됩니다.
Stennie

2

Mongodb는 보조 쓰기를 허용하지 않습니다. 보조 읽기는 허용되지만 쓰기는 허용되지 않습니다. 따라서 기본이 중단되면 보조가 다시 기본이 될 때까지 쓸 수 없습니다. 이것이 바로 CAP 정리에서 고 가용성을 희생하는 방법입니다. 기본에서만 읽기를 유지함으로써 강력한 일관성을 가질 수 있습니다.


2

MongoDB는 파티션이있을 때마다 가용성보다 일관성을 선택합니다. 의미하는 바는 파티션 (P)이있을 때 가용성 (A)보다 일관성 (C)을 선택한다는 것입니다.

이것을 이해하기 위해 MongoDB가 복제 세트가 작동하는 방식을 이해합시다. 복제 세트에는 단일 기본 노드가 있습니다. 데이터를 커밋하는 유일한 "안전한"방법은 해당 노드에 쓴 다음 해당 데이터가 집합의 대부분의 노드에 커밋 될 때까지 기다리는 것입니다. (쓰기를 보낼 때 w = majority 플래그가 표시됩니다)

파티션은 다음과 같은 두 가지 시나리오에서 발생할 수 있습니다.

  • 기본 노드가 다운되면 새 기본 노드를 선택할 때까지 시스템을 사용할 수 없습니다.
  • 1 차 노드가 너무 많은 2 차 노드에서 연결이 끊어지면 시스템을 사용할 수 없게됩니다. 다른 보조원은 새로운 예비 선거를 선출하고 현재 예비 선거는 물러날 것입니다.

기본적으로 파티션이 발생하고 MongoDB가 수행 할 작업을 결정해야 할 때마다 가용성보다 일관성을 선택합니다. 해당 쓰기를 안전하게 완료 할 수 있다고 판단 될 때까지 시스템에 대한 쓰기 허용을 중지합니다.


"그 쓰기 를 안전하게 완료 할 수있을 때까지 시스템에 대한 쓰기 허용 을 중지 합니다. " 읽기는 어떻습니까? 그 시간 동안 계속 읽을 수 있습니까?
Josh

1

Mongodb는 일관성파티션 허용 오차를 제공합니다 .

분산 (NoSQL) 데이터베이스의 맥락에서 이것은 일관성과 가용성 사이에 항상 절충안이 있음을 의미합니다. 이는 분산 시스템이 항상 파티션을 허용하기 때문입니다 (즉, 파티션 허용이 아니라면 분산 데이터베이스가 아닐 것입니다).

일관성 -시스템은 결국 일관성이 있습니다. 데이터는 조만간 모든 곳으로 전파되지만 시스템은 계속해서 입력을 받고 다음 트랜잭션으로 이동하기 전에 모든 트랜잭션의 일관성을 확인하지 않습니다.

가용성 -기본적으로 Mongo DB Client (MongoDB 드라이버)는 모든 읽기 / 쓰기 요청을 리더 / 기본 노드로 보냅니다. 시스템을 일관성있게 만들지 만 다음과 같은 이유로 사용할 수 없습니다.-리더가 클러스터에서 연결이 끊어지면 새 리더를 선택하는 데 몇 초가 걸립니다. 따라서 해당 기간 동안 쓰기 및 읽기에 사용할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.