"삭제 표식" 문서
삭제 표식 문서는 원래 문서가 삭제될 때 데이터베이스 내에 보관되는 작은 문서입니다. 이 문서는 삭제 항목을 복제할 수 있도록 해주는 용도로 사용됩니다.
복제가 완료되면 삭제 표식이 더 이상 필요하지 않습니다. 자동 압축은 복제 중에 최소한의 데이터만 보존하고 전송할 수 있도록 해줍니다. 그럼에도 불구하고 묘비 문서는 자동으로 제거되지 않습니다.
시간이 경과하면 문서가 작성되고 삭제됨에 따라 삭제 표식 문서의 수가 증가하게 됩니다. 각각의 삭제 표식은 작지만 점차 디스크 공간 사용량 및 1차 인덱스에 대한 조회 시간이 증가합니다. 이러한 영향을 줄이기 위해 삭제 표식을 제거할 수 있습니다.
"삭제 표식" 문서의 단순 제거
삭제 표식을 수동으로 제거하려면 다음 단계를 수행하십시오.
- 필요한 문서를 보관할 데이터베이스를 작성하십시오.
새 데이터베이스는 삭제 표식 문서를 제외한 모든 문서를 보관하기 위해 사용됩니다.
- 원래 데이터베이스의 문서를 새 데이터베이스에 복제하기 위해 필터링된 복제를 설정하십시오.
"_deleted" 속성이 포함된 문서는 복제하지 않도록 필터를 구성하십시오.
-
복제가 완료되면 새 데이터베이스를 사용하도록 애플리케이션 로직을 전환하십시오.
-
애플리케이션이 새 데이터베이스를 사용하여 올바르게 작동하는지 확인하십시오.
모든 기능이 올바르게 작동하는 것으로 확인되면 이전 데이터베이스를 삭제할 수 있습니다.
일반적으로 필요한 최소한의 삭제 작업만 수행하도록 애플리케이션을 디자인하고 구현하십시오.
다음과 같이 복제 중에 삭제된 문서를 제외하는 필터 예제를 참조하십시오.
{
"_id": "_design/filters",
"filters": {
"deleted_filter": "function(doc, req) { return !doc._deleted; };"
}
}
삭제 표식 문서의 고급 제거
복제가 수행되는 동안 소스 데이터베이스에서 문서가 업데이트되지 않을 경우 단순 제거 기술이 올바르게 작동합니다.
복제 중에 업데이트가 수행되는 경우 전체 문서가 대상 데이터베이스에 정상적으로 복제되거나 삭제 표식을 남겨 두고 소스 데이터베이스에서 삭제될 수도 있습니다. 문제점은 삭제 표식은 필터를 통해 제외되기 때문에 삭제 표식이 대상 데이터베이스에 복제되지 않는다는 점입니다. 따라서 소스 데이터베이스에서 삭제된 문서가 대상 데이터베이스에서는 삭제되지 않아 불일치가 발생하게 됩니다.
해결책은 다음을 사용하여 묘비를 더 고급으로 제거하는 것입니다
validate_doc_update 기능을 사용하는 것입니다.
validate_doc_update 함수는 디자인 문서에 저장됩니다. 이 함수는 데이터베이스에서 문서가 업데이트될 때마다 실행됩니다. 이 함수는 올바르지 않거나 권한이 없는 문서 업데이트를 차단하기 위해 사용할 수 있습니다.
이 함수는 다음과 같은 매개변수를 사용하여 작동합니다.
- 문서의 새 버전
- 데이터베이스에 있는 문서의 현재 버전
- 업데이트된 문서를 제공한 사용자에 대한 세부사항을 제공하는 사용자 컨텍스트
이 함수는 요청을 검사하여 업데이트의 진행이 허용되는지 여부를 판별합니다. 업데이트가 허용되는 경우 함수가 리턴됩니다. 업데이트가 허용되지 않는 경우 적합한 오류 오브젝트가 리턴됩니다. 특히 사용자에게 업데이트할 권한이 부여되지 않은 경우 설명 오류 메시지와 함께 unauthorized 오류 오브젝트가 리턴됩니다. 마찬가지로 새 문서에 필수 필드가 누락된 경우와 같은 몇 가지 이유로 인해 요청된 업데이트가
허용되지 않을 수도 있습니다. 이러한 경우 설명 오류 메시지와 함께 forbidden 오류 오브젝트가 리턴됩니다.
삭제 표식 제거의 경우 다음과 같이 적합한 validate_doc_update 함수가 작동합니다.
- 업데이트가 대상 데이터베이스 내에 있는 기존 문서(
oldDoc)에 대한 변경사항을 적용하기 위한 것인 경우 함수에서 리턴을 통해 변경을 허용합니다.
그 이유는 업데이트가 복제 중에 대상 데이터베이스에 복사되었지만 복제 중에 소스 데이터베이스에서 변경된 문서에 영향을 미치기 때문입니다. 변경사항이 DELETE인 경우 대상 데이터베이스에 삭제 표식 레코드가 생성될 수 있습니다. 삭제 표식 레코드는 미래 특정 시점의 후속 복제 프로세스를 통해 제거됩니다. 2. 대상 데이터베이스에 현재 문서의 사본이 존재하지 않으며 업데이트 문서에 _deleted 특성(삭제 표식을 나타냄)이 포함되어 있습니다. 따라서 업데이트가 삭제 표식이어야 하며 이전에 발생했으므로 업데이트를 거부해야 합니다.
다음과 같이 대상 데이터베이스에 아직 존재하지 않는 삭제된 문서를 거부하는 JavaScript validate_doc_update 함수 예제를 참조하십시오.
function(newDoc, oldDoc, userCtx) {
// any update to an existing doc is OK
if(oldDoc) {
return;
}
// reject tombstones for docs we don’t know about
if(newDoc["_deleted"]) {
throw({forbidden : "Deleted document rejected"});
}
return; // Not strictly necessary, but clearer.
}
validate_doc_update 함수를 사용하여 삭제 표식 문서를 제거하려면 다음 작업을 수행하십시오.
- 소스에서 대상 데이터베이스로의 복제를 중지하십시오.
- 해당되는 경우 대상 데이터베이스를 삭제한 후 새 대상 데이터베이스를 작성하십시오.
- 제공된 예제와 마찬가지로 적절한
validate_doc_update함수를 추가하십시오. - 대상 데이터베이스의 디자인 문서에 추가하십시오.
- 소스와 (새) 대상 데이터베이스 간의 복제를 다시 시작하십시오.
- 복제가 완료되면 새 데이터베이스를 사용하도록 애플리케이션 로직을 전환하십시오.
- 애플리케이션이 새 데이터베이스를 사용하여 올바르게 작동하는지 확인하십시오.
모든 기능이 올바르게 작동하는 것으로 확인되면 이전 데이터베이스를 삭제할 수 있습니다.
가능한 경우 validate_doc_update 함수를 사용하여 삭제 표식 문서를 제거하기 위한 변형입니다.
- 예를 들어 삭제 날짜를 기록하기 위해 삭제 표시 문서에 일부 메타데이터를 추가합니다.
- 이 함수는 메타데이터를 검사하여 대상 데이터베이스에 적용해야 하는 경우 삭제 문서를 허용할 수 있습니다.
이 검사를 통해 삭제 항목이 올바르게 복제되도록 할 수 있습니다.
삭제 표식 제거의 성능상 영향
삭제 표식은 데이터베이스에서 더 일관적으로 문서를 삭제하기 위해 사용됩니다. 이 목적은 모바일 디바이스에 특히 중요합니다. 삭제 항목 문서가 없으면 삭제가 모바일 디바이스로 올바르게 복제되지 않을 수 있으며, 문서가 디바이스에서 삭제되지 않는 결과를 초래할 수 있습니다.
데이터베이스를 재작성하는 경우(예: 복제의 새 대상). 서버로 대상 데이터베이스를 사용하는 클라이언트는 데이터베이스 시퀀스 번호가 다를 수 있으므로 모든 변경사항을 다시 작업해야 합니다.
validate_doc_update 함수를 사용하는 경우 클라이언트에 해당 함수를 복제하지 마십시오. 이 규칙은 클라이언트에 해당 함수가 존재하는 것으로 인해 발생하는 원치 않는 부작용의 가능성을 방지하기 위한 것입니다.
IBM Cloudant 동기화 라이브러리에서는 디자인 문서를 복제하지 않으므로 validate_doc_update 함수의 복제가 일반적으로 IBM Cloudant에 대한 문제점이 되지 않습니다. 하지만 다른 클라이언트의 경우 디자인 문서 또는 validate_doc_update 함수를 복제하여 잠재적으로 원치 않는 부작용이 발생할 수 있습니다.