버전 1.1에 추가 되었습니다.
Mongosync는 두 MongoDB 클러스터 간에 데이터를 마이그레이션합니다. 필터링된 동기화 사용하여 mongosync 유틸리티가 소스 클러스터와 대상 클러스터 간에 전송하는 데이터베이스 및 컬렉션을 지정할 수 있습니다.
1.1부터 mongosync 는 동기화 에 포함할 데이터베이스와 컬렉션을 지정하는 포함 필터를 지원합니다. 1.6부터 mongosync 는 제외 필터와 정규 표현식도 지원합니다.
포함 필터를 사용하면
mongosync는 일치하는 데이터베이스 및 컬렉션을 동기화합니다.제외 필터를 사용하면
mongosync는 필터와 일치하는 데이터베이스 및 컬렉션을 제외한 모든 데이터베이스 및 컬렉션을 동기화합니다.포함 필터와 제외 필터를 모두 사용하면
mongosync는 포함 필터와 일치하는 데이터베이스 및 컬렉션만 동기화한 다음 제외 필터와 일치하는 모든 항목을 제외합니다.필터가 없는 경우
mongosync는 모든 데이터베이스와 컬렉션을 동기화합니다.
필터 구문
start API 엔드포인트는 필터링된 동기화를 구성하는 두 개의 필드인 includeNamespaces 및 excludeNamespaces를 허용합니다. 각 필드는 동기화에서 포함하거나 제외할 데이터베이스와 컬렉션을 지정하는 필터 배열을 사용합니다.
참고
start 호출이 includeNamespaces 및 excludeNamespaces 매개변수를 모두 사용하는 경우 mongosync는 먼저 포함 필터의 데이터베이스 및 컬렉션을 일치시킨 다음 제외 필터와도 일치하는 항목을 제외합니다.
필터의 구문은 다음과 같습니다.
"includeNamespaces": [ { "database": "<database-name>", "collections": [ "<collection-name>" ] "databaseRegex": { "pattern": "<regex-pattern>", "options": "<options>" }, "collectionsRegex": { "pattern": "<regex-pattern>", "options": "<options>" } } ], "excludeNamespaces": [ { "database": "<database-name>", "collections": [ "<collection-name>" ] "databaseRegex": { "pattern": "<regex-pattern>", "options": "<options>" }, "collectionsRegex": { "pattern": "<regex-pattern>", "options": "<options>" } } ]
필터에는 database 필드 또는 databaseRegex 필드가 포함되어야 합니다.
특정 컬렉션과 일치하는 필터가 필요한 경우 collections 배열을 사용하여 컬렉션을 개별적으로 지정하거나 collectionsRegex 필드를 사용하여 정규식을 정의할 수 있습니다.
필터 구성
중요
필터를 적용한 상태에서 mongosync을(를) 시작하면 필터를 수정할 수 없습니다. 새 필터를 만들어야 하는 경우 기존 필터 교체를 참조하세요.
필터를 만듭니다.
start API는 선택적 필터를 구성하는 두 개의 매개변수를 받아들입니다.
includeNamespaces매개 변수는 필터 배열을 취합니다. 즉,mongosync가 동기화에 어떤 데이터베이스와 컬렉션을 포함해야 하는지 결정하는 데 사용하는 필터입니다.excludeNamespaces매개변수는mongosync동기화에서 제외해야 하는 데이터베이스 및 컬렉션을 결정하는 데 사용되는 필터 배열을 사용합니다.
필터를 지정하지 않으면 mongosync는 전체 클러스터 동기화를 수행합니다.
포함 및/또는 제외 필터를 생성하여 동기화하려는 데이터베이스 및 컬렉션을 식별합니다.
예를 들어, 이 포함 필터는 accounts_old 컬렉션을 제외하고 sales 데이터베이스에서 이름이 accounts_(으)로 시작하는 컬렉션만 동기화하도록 mongosync(을)를 구성합니다.
"includeNamespaces": [ { "database": "sales", "collectionsRegex": { "pattern": "^accounts_.+?$", "options": "ms" } ], "excludeNamespaces": [ { "database": "sales", "collections": [ "accounts_old" ] } ]
필터에 대한 자세한 내용은 Filter 구문을 참조하세요.
필터를 사용합니다.
필터를 사용하려면 /start API를 호출하여 동기화를 시작할 때 필터 json을 첨부하세요.
curl -X POST "http://localhost:27182/api/v1/start" --data ' { "source": "cluster0", "destination": "cluster1", "includeNamespaces": [ { "database": "sales", "collectionsRegex": { "pattern": "^accounts_.+$", "options": "i" } }, { "database": "marketing" } ] } '
예시 구성은 필터로 mongosync 시작을 참조하세요.
기존 필터 교체
기존 필터는 업데이트할 수 없습니다. 진행 중인 동기화 프로세스를 중지하고 대상 클러스터를 준비한 다음 새 필터로 mongosync를 다시 시작해야 합니다.
mongosync에서 원래 필터를 실행하면 사용자의 데이터('사용자 데이터베이스')와 mongosync_reserved_for_internal_use 시스템 데이터베이스를 포함하는 데이터베이스가 대상 클러스터에 생성됩니다. 새 필터로 mongosync를 다시 시작하기 전에 해당 데이터베이스를 제거해야 합니다.
새 필터를 위한 대상 클러스터를 준비하려면 다음 단계를 따르세요.
사용자 데이터베이스를 제거합니다.
클러스터의 데이터베이스 나열
show databases 사용자 데이터베이스를 제거합니다.
admin,local,config데이터베이스는 시스템 데이터베이스입니다. MongoDB 지원팀의 지침 없이 이러한 시스템 데이터베이스를 편집해서는 안 됩니다.show databases명령이 대상 클러스터의 사용자 데이터베이스를 나열하는 경우 해당 사용자 데이터베이스를 제거해야 합니다.각 사용자 데이터베이스 목록에 대해 이 단계를 반복합니다.
use <user database name> db.dropDatabase() 참고: 첫 번째
db.dropDatabase()작업이 완료된 후 두 번째로 실행하여 데이터베이스를 제거해야 할 수도 있습니다.
컬렉션 추가 및 이름 바꾸기
몇 가지 제한 사항이 있지만 필터링된 동기화 중에 컬렉션을 추가 또는 rename a collection할 수 있습니다.
경고
이름 변경 작업이 이름 변경 제한을 위반하는 경우 mongosync는 동기화를 중지하고 오류를 보고합니다.
오류 발생 후 정리하고 다시 시작하려면 기존 필터 교체 단계를 따르세요.
단일 데이터베이스 내에서 추가 및 이름 변경
전체 데이터베이스가 필터의 일부인 경우 새 컬렉션을 추가하거나 기존 컬렉션의 이름을 변경할 수 있습니다.
필터에 이전 이름과 새 이름이 모두 지정된 경우 컬렉션의 이름을 변경할 수도 있습니다.
이름 변경 예시를 참조하세요.
여러 데이터베이스에서 이름 바꾸기
전체 대상 데이터베이스가 필터의 일부인 경우에만 데이터베이스 전체에서 컬렉션 이름을 바꿀 수 있습니다. 필터가 대상 데이터베이스의 개별 컬렉션을 지정하는 경우 데이터베이스 간에 이름을 바꿀 수 없습니다.
이름 변경 예시를 참조하세요.
mapReduce 및 $out을 사용한 필터링
필터링과 함께 $out 집계 단계 또는 mapReduce 명령(컬렉션을 생성하거나 대체하도록 설정된 경우)을 사용하려면 지정된 컬렉션뿐만 아니라 전체 데이터베이스를 필터링해야 합니다.
예를 들어 이 집계 파이프라인을 생각해 보세요.
use library db.books.aggregate( [ { $group : { _id : "$author", titles: { $push: "$title" } } }, { $out : "authors" } ] )
$out 단계에서는 library 데이터베이스에 authors 컬렉션을 생성합니다. authors 컬렉션을 동기화하려면 필터에 전체 library 데이터베이스를 지정해야 합니다. authors 컬렉션만 지정하는 경우 필터가 작동하지 않습니다.
이 필터는 다음과 같이 작동합니다.
"includeNamespaces": [ { "database": "library" } ]
이 필터는 작동하지 않습니다.
"includeNamespaces": [ { "database": "library", "collections": [ "authors", "books" ] // DOES NOT WORK WITH $OUT } ]
제한 사항
역동기화에서는 필터링이 지원되지 않습니다.
시작하기 전에 대상 클러스터에 사용자 데이터가 포함되어 있지 않아야 합니다.
시작하기 전에 대상 클러스터에
mongosync_reserved_for_internal_use시스템 데이터베이스가 포함되어 있지 않아야 합니다.사용 중인 필터는 수정할 수 없습니다. 새 필터를 만들려면 기존 필터 대체하기를 참조하세요.
컬렉션 이름은 특정 상황에서만 변경할 수 있습니다. 자세한 내용은 컬렉션 추가 및 이름 바꾸기를 참조하세요.
필터에 보기가 포함되어 있지만 기본 컬렉션은 포함되지 않은 경우 보기 메타데이터만 대상 클러스터에 동기화됩니다. 보기 문서를 포함하려면 기본 컬렉션도 동기화해야 합니다.
필터에 시스템 컬렉션이나 시스템 데이터베이스를 지정할 수 없습니다.
필터링과 함께
$out집계 단계 또는mapReduce명령(컬렉션을 만들거나 대체하도록 설정된 경우)을 사용하려면 전체 데이터베이스를 사용하도록 필터를 구성해야 합니다. 필터를 데이터베이스 내의 컬렉션으로 제한할 수 없습니다.자세한 내용은 mapReduce 및 $out로 필터링하기를 참조하세요.
예시
필터로 시작 mongosync
다음 예는 cluster0 와 cluster1 간에 동기화 작업을 시작합니다. 소스 클러스터는 cluster0 이고 대상 클러스터는 cluster1 입니다.
cluster0 sales, marketing 및 engineering 데이터베이스를 포함합니다.
sales 데이터베이스에는 EMEA, APAC 및 AMER 컬렉션이 포함되어 있습니다.
이 예시의 includeNamespaces 배열은 sales 및 marketing의 두 데이터베이스에 적용할 필터를 정의합니다.
sales 데이터베이스는 EMEA 및 APAC 컬렉션도 필터링합니다.
"includeNamespaces" : [ { "database" : "sales", "collections": [ "EMEA", "APAC" ] }, { "database" : "marketing" } ]
이 필터를 사용하여 /start API를 호출한 후 mongosync:
marketing데이터베이스의 모든 컬렉션 동기화engineering데이터베이스 필터링sales데이터베이스에서EMEA및APAC컬렉션 동기화AMER컬렉션 필터링
동기화 중 컬렉션 추가 및 이름 바꾸기
다음 예는 cluster0 와 cluster1 간에 동기화 작업을 시작합니다. 소스 클러스터는 cluster0 이고 대상 클러스터는 cluster1 입니다.
cluster0 students, staff 및 prospects 데이터베이스를 포함합니다.
students데이터베이스에는undergrad,graduate및adjuncts컬렉션이 포함되어 있습니다.staff데이터베이스에는employees및contractors컬렉션이 포함되어 있습니다.
이 예시의 includeNamespaces 배열은 두 데이터베이스에 적용할 필터를 정의합니다.
{ "source": "cluster0", "destination": "cluster1", "includeNamespaces": [ { "database" : "students", "collections": ["undergrad", "graduate", "adjuncts"] }, { "database" : "staff" } ] }
이 필터를 사용하면 mongosync 동기화가 다음과 같이 수행됩니다.
전체
staff데이터베이스students데이터베이스의undergrad,graduate및adjuncts컬렉션
mongosync prospects 데이터베이스의 어떤 정보도 동기화하지 않습니다.
컬렉션 추가하기
mongosync 전체 staff 데이터베이스를 동기화합니다. staff 데이터베이스에 새로운 collection을 추가하면 mongosync 도 해당 collection을 동기화합니다.
mongosync collection이 필터의 일부가 아닌 경우 students 데이터베이스에 추가된 새 collection을 동기화하지 않습니다.
예를 들어 postdocs 컬렉션을 students 데이터베이스에 추가하는 경우 mongosync는 새 컬렉션을 동기화하지 않습니다. adjuncts 컬렉션을 추가하면 adjuncts가 필터의 일부이므로 mongosync가 컬렉션을 동기화합니다.
컬렉션 이름 바꾸기
staff 데이터베이스에 있는 컬렉션의 이름을 바꿀 수 있습니다.
// This code works use admin db.runCommand( { renameCollection: "staff.employees", to: "staff.salaried" } )
필터하다 에 새 이름과 이전 이름이 모두 있는 경우에만 students 데이터베이스 내에서 컬렉션 이름을 변경할 수 있습니다. 이름 중 하나라도 필터하다 에 없으면 monogsync 오류를 보고하고 종료합니다.
// This code works use admin db.runCommand( { renameCollection: "students.graduate", to: "students.adjuncts" } )
컬렉션이 필터에 지정된 경우 이를 삭제할 수 있지만, 이름을 변경하여 필터에서 제거할 수는 없습니다.
// This code produces an error and mongosync stops syncing use admin db.runCommand( { renameCollection: "students.graduate", to: "students.notAFilteredCollection" } )
전체 대상 데이터베이스가 필터에 포함된 경우 컬렉션의 이름을 변경하여 필터에 추가할 수 있습니다.
소스 컬렉션은 필터에 지정됩니다
use admin db.runCommand( { renameCollection: "students.adjuncts", to: "staff.adjuncts" } ) 필터에 소스 컬렉션이 지정되지 않음
use admin db.runCommand( { renameCollection: "prospects.current", to: "staff.newHires" } )
전체 대상 데이터베이스가 필터에 있는 경우 소스 데이터베이스의 컬렉션 이름을 변경할 수도 있습니다.
use admin db.runCommand( { renameCollection: "staff.employees", to: "staff.onPayroll" } )
중요
컬렉션 이름을 변경할 예정이라면 개별 컬렉션을 지정하는 대신 전체 데이터베이스를 필터에 추가하는 것이 좋습니다.