고급 복제
고급 복제 개념 및 다음 목록 등의 태스크에 대한 정보를 확인할 수 있습니다.
- 복제 데이터베이스 유지보수
- 복제 스케줄링 및 모니터링
- 복제 중 인증
또한 기본이 되는 복제 프로토콜의 세부 사항을 확인하고, API 참조 문서를 살펴보는 것도 도움이 될 수 있습니다.
복제 데이터베이스 유지보수
복제 데이터베이스는 다른 데이터베이스와 같이 모니터링해야 합니다. 정기적인 데이터베이스 유지보수를 수행하지 않을 경우 복제 프로세스에 대한 인터럽트로 인해 발생하는 올바르지 않은 문서가 누적될 수 있습니다. 대량의 올바르지 않은 문서가 존재하는 경우 IBM® Cloudant® for IBM Cloud® 오퍼레이션을 통해 복제자 프로세스를 다시 시작할 때 클러스터에서 과도한 로드가 발생할 수 있습니다.
복제 데이터베이스를 유지보수하려면 오래된 문서를 제거하십시오. 사용 기간을 판별하여 오래된 문서를 제거하고 더 이상 필요하지 않을 경우 해당 문서를 삭제하십시오.
복제 스케줄러
새로운 IBM Cloudant 복제 스케줄러는 이전 IBM Cloudant 복제 메커니즘과 비교하여 다양한 개선사항을 제공합니다.
특히 복제 중 네트워크 사용량이 더욱 효율적입니다. 스케줄러는 복제 태스크의 할당을 판별할 때 클러스터 내의 개별 데이터베이스 노드에 대한 현재 로드를 계산합니다.
마지막으로 이제 복제의 상태가 더 상세하며 7개의 개별 상태로 구성됩니다.
initializing- 복제가 스케줄러에 추가되었으나 아직 초기화되거나 실행하도록 스케줄되지 않았습니다. 이 상태는 새로 작성하거나 업데이트된 복제 문서가_replicator데이터베이스 내에 저장된 경우에 발생합니다.error- 복제를 작업으로 변환할 수 없습니다. 이 오류는 몇 가지 다른 방식으로 발생할 수 있습니다. 예를 들어 복제를 필터링해야 하지만 소스 데이터베이스에서 필터 코드를 페치할 수 없는 경우입니다.pending- 복제 작업을 실행하도록 스케줄되었지만 아직 실행되지 않고 있습니다.running- 복제 작업이 실행 중입니다.crashing- 복제 작업에 영향을 미치는 일시적인 오류가 발생했습니다. 나중에 자동으로 작업을 재시도합니다.completed- 복제 작업이 완료되었습니다. 지속적 복제에는 이 상태가 적용되지 않습니다.failed- 복제 작업이 실패했습니다. 이 실패는 영구적입니다. 이 상태는 더 이상 이 복제 태스크를 사용하여 복제를 시도하지 않음을 의미합니다. 이 실패는 몇 가지 다른 방식으로 발생할 수 있습니다. 예를 들어 소스 또는 대상 URL이 올바르지 않은 경우입니다.
다음 다이어그램에는 세 가지 상태 간의 상태 전이가 표시되어 있습니다.
스케줄러에 두 개의 새로운 엔드포인트가 도입되었습니다.
이러한 엔드포인트를 사용하여 더욱 빠르고 쉽게 복제 상태를 관리 및 판별할 수 있습니다.
다음과 같이 복제 스케줄러를 사용하여 복제를 관리 및 모니터하는 일반적인 프로세스를 참조하십시오.
- 필요한 복제를 설명하는 복제 문서를 생성하고, 해당 문서를 복제기 데이터베이스에 저장하십시오.
/_scheduler/docs엔드포인트를 사용하여 복제 상태를 모니터하십시오.
복제 중 인증
프로덕션 애플리케이션의 경우 소스 및 대상 데이터베이스에 대한 보안이 필수입니다. 복제를 계속 진행하려면 데이터베이스에 액세스하기 위한 인증이 필요합니다. 복제를 위한 체크포인트는 기본적으로 활성화되어 있으며, 이는 소스 데이터베이스를 복제하려면 쓰기 권한이 필요함을 의미합니다.
복제 중 인증을 사용으로 설정하려면 데이터베이스 URL에 사용자 이름 및 비밀번호를 포함시키십시오. 복제 프로세스에서는 HTTP 기본 인증을 위해 제공된 값을 사용합니다.
다음과 같이 복제 중에 소스 및 대상 데이터베이스에 액세스하기 위해 사용자 이름 및 비밀번호 값을 지정하는 예제를 참조하십시오.
{
"source": {
"url": "https://example.com/db",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"target": {
"url": "https://$ACCOUNT.cloudant.com/db",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
}
}
IAM 자격 증명의 경우 아래 예시를 사용하여 IAM API 키로 인증합니다:
{
"source": {
"url": "https://example.com/db",
"auth": {
"iam": {
"apikey": "$APIKEY"
}
}
},
"target": {
"url": "https://$ACCOUNT.cloudant.com/db",
"auth": {
"iam": {
"apikey": "$APIKEY"
}
}
}
}
필터링된 복제
소스에서 대상으로 일부 문서를 전송하지 않을 경우도 있습니다. 전송할 문서를 선택하려면 소스의 디자인 문서에 하나 이상의 filter 함수를 포함시키십시오. 이제 복제자에게 이러한 filter 함수를 사용하도록 지시할 수 있습니다.
복제 중 문서를 필터링하는 작업은 _changes 피드 필터링의 프로세스와 유사합니다.
filter 함수에서는 두 개의 인수를 사용합니다.
- 복제할 문서
- 복제 요청
filter 함수에서는 true 또는 false 값을 리턴합니다. 결과가 true인 경우 해당 문서가 복제됩니다.
필터링을 설정하려는 경우 가능하면 selector 필드를 사용하십시오. selector 필드를 사용하는 경우 전체 데이터베이스를 복제하지 않고도 필터를 지정할 수 있습니다. 이 방법은 더 빠른 필터링을 가능하게 하며 IBM Cloudant의 로드를 줄여줍니다. 자세한 내용은 ‘ selector ’ 필드 설명서를 참조하십시오.
다음과 같이 filter 함수의 예제를 참조하십시오.
function(doc, req) {
return !!(doc.type && doc.type == "foo");
}
필터는 디자인 문서의 맨 위에 있는 filters 키 아래에 저장됩니다.
다음과 같이 디자인 문서에 filter 함수를 저장하는 예제를 참조하십시오.
{
"_id": "_design/myddoc",
"filters": {
"myfilter": "function goes here"
}
}
필터링된 복제는 다음과 같은 항목을 식별하는 JSON 명령문을 사용하여 시작됩니다.
- 소스 데이터베이스
- 대상 데이터베이스
- 디자인 문서의
filters키 아래에 저장되는 필터의 이름
다음과 같이 필터링된 복제를 시작하기 위한 JSON 예제를 참조하십시오.
{
"source": {
"url": "https://example.org/example-database",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"target": {
"url": "https://$ACCOUNT.cloudant.com/example-database",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"filter": "myddoc/myfilter"
}
인수는 호출의 query_params 필드에 키:값 쌍을 포함시켜 filter 함수에 제공할 수 있습니다.
다음과 같이 제공된 매개변수를 사용하여 필터링된 복제를 시작하기 위한 JSON 예제를 참조하십시오.
{
"source": {
"url": "https://example.org/example-database",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"target": {
"url": "https://$ACCOUNT.cloudant.com/example-database",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"filter": "myddoc/myfilter",
"query_params": {
"key": "value"
}
}
selector 옵션은 filter 옵션을 사용하는 경우와 비교하여 성능상의 이점을 제공합니다. 가능하면 selector 옵션을 사용하십시오. 자세한 내용은 selector 문서를
참조하십시오.
복제를 사용하는 충돌 제거하기
우승한 문서를 복제하려면 winning_revs_only: true 옵션을 사용하세요 수정본만 복제합니다. 이러한 리비전은 기본적으로 GET $ACCOUNT/$DATABASE/$DOCID API 엔드포인트에서 반환되거나
_changes 피드에 기본 매개변수를 추가합니다.
{
"source": {
"url": "https://example.org/example-database",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"target": {
"url": "https://$ACCOUNT.cloudant.com/example-database",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"winning_revs_only": true
}
이 모드로 복제하면 충돌하는 수정본이 삭제되므로 이 모드를 사용하는 것이 복제를 통해 충돌을 제거하는 방법 중 하나일 수 있습니다.
다음에 의해 생성된 복제 ID 및 체크포인트 ID는 winning_revs_only: true 이 복제 작업들은 기본적으로 생성되는 복제 작업들과는 다르므로, 먼저 승리한 리비전을 복제한 다음, 나중에 일반 복제 작업을 통해 나머지 리비전들을 소급 적용할 수 있습니다.
winning_revs_only: true 옵션은 필터 또는 다른 옵션과 결합할 수 있습니다
continuous: true 또는 create_target: true 과 같은 옵션과 결합할 수 있습니다.
이름 지정된 문서 복제
문서를 복제하지 않을 경우도 있습니다. 단순 복제의 경우 filter 함수를 작성할 필요가 없습니다. 대신 특정 문서를 복제하기 위해 doc_ids 필드에 키 목록을 배열로 추가하십시오.
다음과 같이 특정 문서를 복제하는 예제를 참조하십시오.
{
"source": {
"url": "https://example.org/example-database",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"target": {
"url": "https://127.0.0.1:5984/example-database",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"doc_ids": ["foo", "bar", "baz"]
}
user_ctx 특성 및 위임
복제 문서에는 사용자 정의 user_ctx 특성이 포함될 수 있습니다. 이 특성은 복제가 실행되는 사용자 컨텍스트를 정의합니다.
이전 방식으로 POST 엔드포인트에 대한 /_replicate/를 작성하여 복제를 트리거하는 경우 user_ctx 특성이 필요하지 않습니다. 그 이유는 복제를 트리거하는 시점에 인증된 사용자에 대해 필요한 모든 정보를 사용할 수 있기 때문입니다.
반면 복제자 데이터베이스는 일반 데이터베이스입니다. 인증된 사용자에 대한 정보는 복제 문서가 데이터베이스에 기록되는 시점에 한해 존재합니다. 즉, 복제자 데이터베이스 구현은 _changes가 설정된 ?include_docs=true 피드 이용 애플리케이션과 유사합니다.
복제 측면에서 볼 때, 이러한 구현상의 차이로 인해 관리자 권한이 없는 사용자의 경우, 사용자 이름과 해당 사용자의 역할 중 일부를 포함하는 user_ctx 속성을 복제 문서에 반드시 정의해야 합니다. 이 요구사항은 복제자 데이터베이스의 기본 디자인 문서에 존재하는 validation 함수를 통해 해결됩니다. 이 함수는 각 문서의 업데이트를 유효성 검증합니다. 또한 이 유효성 검사
함수는 관리자 권한이 없는 사용자가 user_ctx 속성에서 올바른 사용자 이름과 일치하지 않는 사용자 이름 속성을 설정할 수 없도록 보장합니다. 역할에도 동일한 원칙이 적용됩니다.
다음과 같이 위임된 복제 문서 예제를 참조하십시오.
{
"_id": "my_rep",
"source": {
"url": "https://$SERVER.com:5984/foo",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"target": {
"url": "https://$ACCOUNT.cloudant.com/bar",
"auth": {
"basic": {
"username": "$USERNAME",
"password": "$PASSWORD"
}
}
},
"continuous": true,
"user_ctx": {
"name": "joe",
"roles": ["erlanger", "researcher"]
}
}
관리자의 경우 user_ctx 특성이 선택사항입니다. 이 특성이 누락된 경우 이름이 null이고 역할 목록이 비어 있는 사용자 컨텍스트인 기본값으로 값이 설정됩니다.
비어 있는 역할 목록은 복제 중에 로컬 대상에 디자인 문서를 작성하지 않음을 의미합니다. 로컬 대상에 디자인 문서를 작성하려면 _admin 역할의 사용자 컨텍스트를 명시적으로 설정해야 합니다.
또한 관리자의 경우 user_ctx 특성을 사용하여 다른 사용자에 대한 복제를 트리거할 수 있습니다. 이 사용자 컨텍스트는 로컬 대상 데이터베이스 문서 validation 함수에 전달됩니다.
user_ctx 특성은 로컬 엔드포인트에만 적용됩니다.
요약하자면, 관리자의 경우, user_ctx 속성은 선택 사항입니다. 일반(비관리자) 사용자의 경우 필수 항목입니다.
user_ctx의 역할 특성이 누락된 경우 기본값인 비어 있는 목록 [ ]으로 설정됩니다.
대형 첨부 파일의 영향
문서에 대량의 첨부 파일이 존재하는 경우 복제 성능에 악영향을 미칠 수 있습니다.
복제 성능과 관련된 첨부 파일의 영향에 대한 자세한 정보는 성능 고려사항을 참조하십시오.
/_replicate 엔드포인트 방지
엔드포인트 대신 _replicator 스케줄러/_replicate를 사용하십시오.
복제 중에 지연, 제한시간 초과 또는 복제 충돌 등의 문제점이 발생하는 경우 시스템에서 _replicator 데이터베이스 내에 정의된 복제를 자동으로 다시 시작합니다. 하지만 /_replicate 엔드포인트로 요청을 전송하여 복제를 정의하는 경우 복제 요청이 지속되지 않기 때문에 문제점이 발생해도 시스템에서 복제를 다시 시작할 수 없습니다. _replicator 데이터베이스에 정의된 복제를 더 간단히 모니터할 수 있습니다.