동기화 필터링
버전 1.1에 추가 되었습니다.
Cluster-to-Cluster Sync 는 두 MongoDB cluster 간의 지속적인 데이터 동기화 또는 일회성 데이터 마이그레이션 을 제공합니다. 필터링된 동기화 를 사용하여 mongosync 유틸리티가 소스 클러스터와 대상 클러스터 간에 전송하는 데이터베이스 및 컬렉션을 지정할 수 있습니다.
1.1부터 mongosync
는 동기화에 포함할 데이터베이스와 collection을 지정하는 포함 필터를 지원합니다. 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
컬렉션이 포함되어 있습니다.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" } )
중요
컬렉션 이름을 변경할 예정이라면 개별 컬렉션을 지정하는 대신 전체 데이터베이스를 필터에 추가하는 것이 좋습니다.