문서 버전화 및 충돌 FAQ
분산 데이터베이스를 사용하는 경우 데이터 사본은 여러 위치에 저장될 수 있습니다. 이 데이터를 동기화 상태로 유지하는 것이 중요합니다. 그러나 작업 환경에서는 사용자가 변경사항이 있는 문서를 즉시 업데이트하거나 데이터베이스에 복제하지 못할 수 있습니다.
따라서 문서 사본에는 다른 업데이트가 있을 수 있습니다. IBM® Cloudant® for IBM Cloud®가 정확한 사본을 판별할 수 없으므로 "충돌"이 발생합니다.
IBM Cloudant는 각 데이터베이스 클러스터에 있는 모든 노드가 최신 버전의 문서만 포함하도록 하기 위해 다중 버전 동시성 제어(MVCC)를 사용합니다.
결과적 일관성의 개념
IBM Cloudant 데이터베이스는 결과적으로 일관됩니다. 즉, IBM Cloudant에서는 노드 간에 차이점이 존재하지 않아야 합니다. 이러한 불일치는 오래된 문서가 동기화될 때 발생할 수 있습니다.
IBM Cloudant 데이터베이스에 동시 읽기 및 쓰기 액세스 권한이 있는 것이 중요합니다. MVCC에서는 해당 기능을 사용할 수 있도록 합니다. MVCC는 읽기 및 쓰기 조작에 데이터베이스 잠금이 필요하지 않으므로 IBM Cloudant 데이터베이스에서 읽기 및 쓰기 조작을 더 빨리 수행하는 낙관적 동시성 제어 의 형식입니다. 동시에 MVCC는 IBM Cloudant 데이터베이스 노드 간 동기화를 가능하게 합니다.
충돌 발생 여부를 확인하는 방법
충돌 발생 여부를 확인할 수 없습니다. 충돌이 있는 문서를 요청하는 경우도 있습니다. 해당 경우에는 IBM Cloudant가 충돌이 존재하지 않는 것 처럼 정상적으로 문서를 리턴합니다. 그러나 리턴되는 버전이 반드시 최신 버전은 아닙니다. 대신 여러 요소를 고려하는 내부 알고리즘에 따라 버전이 선택됩니다. 문서가 리턴될 때 항상 최신 상태라고 간주하면 안 됩니다.
충돌이 있는 문서를 식별할 수 있는 방법은 무엇입니까?
특정 문서와의 충돌이 존재하는 상태에서 이를 업데이트하려는 경우 IBM Cloudant에서 409 응답을 리턴합니다. 오프라인 상태에서 문서를 업데이트하려는 경우 IBM Cloudant가 잠재적인 충돌을 확인할 수 없으며 409 응답을 수신하지 않습니다.
이러한 상황이 발생하면 온라인 상태로 전환될 때 문서 충돌을 확인하는 것이 가장 좋습니다. 문서 충돌을 찾아야 하는 경우 다음 map 함수 예를 사용하십시오.
function (doc) {
if (doc._conflicts) {
emit(null, [doc._rev].concat(doc._conflicts));
}
}
데이터베이스에서 여러 문서 내의 충돌을 찾으려면 보기를 작성하십시오.
충돌을 무시하면 어떻게 됩니까?
충돌을 확인하지 않거나 해결하지 않으면 IBM Cloudant 데이터베이스에 다음과 같은 문제점이 발생합니다.
- 충돌하는 문서가 크게 늘어남에 따라 문서 불일치가 증가합니다.
- 충돌이 해결될 때까지 충돌이 있는 문서를 유지해야 하므로 데이터베이스 크기가 증가합니다.
- IBM Cloudant가 "최적의" 버전을 찾기 위해 충돌하는 모든 문서를 검토해야 하므로 각 요청에 응답하는 데 더욱 많은 작업이 필요함에 따라 성능이 저하됩니다.
충돌을 해결하는 방법
충돌을 찾으면 다음 네 가지 단계를 수행하여 해결하십시오.