Docs Menu
Docs Home
/
MongoDB Cluster-to-Cluster Sync
/

동기화 필터링

이 페이지의 내용

  • 필터 구문
  • 필터 구성
  • 기존 필터 교체
  • 컬렉션 추가 및 이름 바꾸기
  • mapReduce 및 $out을 사용한 필터링
  • 제한 사항
  • 예시

버전 1.1에 추가 되었습니다.

Cluster-to-Cluster Sync 는 두 MongoDB cluster 간의 지속적인 데이터 동기화 또는 일회성 데이터 마이그레이션 을 제공합니다. 필터링된 동기화 를 사용하여 mongosync 유틸리티가 소스 클러스터와 대상 클러스터 간에 전송하는 데이터베이스 및 컬렉션을 지정할 수 있습니다.

1.1부터 mongosync 는 동기화에 포함할 데이터베이스와 collection을 지정하는 포함 필터를 지원합니다. 1.6부터 mongosync 는 제외 필터와 정규 표현식도 지원합니다.

  • 포함 필터를 사용하면 mongosync는 일치하는 데이터베이스 및 컬렉션을 동기화합니다.

  • 제외 필터를 사용하면 mongosync는 필터와 일치하는 데이터베이스 및 컬렉션을 제외한 모든 데이터베이스 및 컬렉션을 동기화합니다.

  • 포함 필터와 제외 필터를 모두 사용하면 mongosync는 포함 필터와 일치하는 데이터베이스 및 컬렉션만 동기화한 다음 제외 필터와 일치하는 모든 항목을 제외합니다.

  • 필터가 없는 경우 mongosync는 모든 데이터베이스와 컬렉션을 동기화합니다.

start API 엔드포인트는 필터링된 동기화를 구성하는 두 개의 필드인 includeNamespacesexcludeNamespaces를 허용합니다. 각 필드는 동기화에서 포함하거나 제외할 데이터베이스와 컬렉션을 지정하는 필터 배열을 사용합니다.

참고

start 호출이 includeNamespacesexcludeNamespaces 매개변수를 모두 사용하는 경우 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 을(를) 시작하면 필터를 수정할 수 없습니다. 새 필터를 만들어야 하는 경우 기존 필터 교체를 참조하세요.

1

대상 클러스터에 동기화하려는 데이터베이스 및 컬렉션을 식별합니다.

  • 필터에 데이터베이스 집합을 추가하면 클러스터의 다른 데이터베이스도 제외됩니다.

  • 필터에서 컬렉션을 지정하면 동일한 데이터베이스에 있는 다른 컬렉션도 모두 제외됩니다.

2

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 구문을 참조하세요.

3

필터를 사용하려면 /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를 다시 시작하기 전에 해당 데이터베이스를 제거해야 합니다.

새 필터를 위한 대상 클러스터를 준비하려면 다음 단계를 따르세요.

1
  1. mongosync 프로세스를 중단하세요.

  2. mongosh를 사용하여 대상 클러스터에 연결합니다. 대상이 샤딩된 클러스터인 경우 mongos 인스턴스에 연결합니다. 대상이 복제본 세트인 경우 프라이머리 mongod 인스턴스에 연결합니다.

  3. mongosync_reserved_for_internal_use 시스템 데이터베이스를 제거합니다.

    use mongosync_reserved_for_internal_use
    db.dropDatabase()
2
  1. 클러스터의 데이터베이스 나열

    show databases
  2. 사용자 데이터베이스를 제거합니다. admin, local, config 데이터베이스는 시스템 데이터베이스입니다. MongoDB 지원팀의 지침 없이 이러한 시스템 데이터베이스를 편집해서는 안 됩니다.

    show databases 명령이 대상 클러스터의 사용자 데이터베이스를 나열하는 경우 해당 사용자 데이터베이스를 제거해야 합니다.

    각 사용자 데이터베이스 목록에 대해 이 단계를 반복합니다.

    use <user database name>
    db.dropDatabase()

    참고: 첫 번째 db.dropDatabase() 작업이 완료된 후 두 번째로 실행하여 데이터베이스를 제거해야 할 수도 있습니다.

3
  1. 필터링할 데이터베이스 및 컬렉션을 결정합니다. 데이터베이스와 컬렉션을 includeNamespaces 배열에 추가합니다. 구성에 대한 자세한 내용은 필터 구성을 참조하세요.

  2. mongosync를 실행하여 소스 및 대상 클러스터에 다시 연결합니다.

  3. /start API 엔드포인트를 사용하여 동기화를 시작합니다. /start를 호출할 때는 새 필터를 연결해야 합니다.

몇 가지 제한 사항이 있지만 필터링된 동기화 중에 컬렉션을 추가 또는 rename a collection할 수 있습니다.

경고

이름 변경 작업이 이름 변경 제한을 위반하는 경우 mongosync는 동기화를 중지하고 오류를 보고합니다.

오류 발생 후 정리하고 다시 시작하려면 기존 필터 교체 단계를 따르세요.

전체 데이터베이스가 필터의 일부인 경우 새 컬렉션을 추가하거나 기존 컬렉션의 이름을 변경할 수 있습니다.

필터에 이전 이름과 새 이름이 모두 지정된 경우 컬렉션의 이름을 변경할 수도 있습니다.

이름 변경 예시를 참조하세요.

전체 대상 데이터베이스가 필터의 일부인 경우에만 데이터베이스 전체에서 컬렉션 이름을 바꿀 수 있습니다. 필터가 대상 데이터베이스의 개별 컬렉션을 지정하는 경우 데이터베이스 간에 이름을 바꿀 수 없습니다.

이름 변경 예시를 참조하세요.

필터링과 함께 $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로 필터링하기를 참조하세요.

다음 예는 cluster0cluster1 간에 동기화 작업을 시작합니다. 소스 클러스터는 cluster0 이고 대상 클러스터는 cluster1 입니다.

cluster0 sales, marketingengineering 데이터베이스를 포함합니다.

sales 데이터베이스에는 EMEA, APACAMER 컬렉션이 포함되어 있습니다.

이 예시의 includeNamespaces 배열은 salesmarketing의 두 데이터베이스에 적용할 필터를 정의합니다.

sales 데이터베이스는 EMEAAPAC 컬렉션도 필터링합니다.

"includeNamespaces" : [
{
"database" : "sales",
"collections": [ "EMEA", "APAC" ]
},
{
"database" : "marketing"
}
]

이 필터를 사용하여 /start API를 호출한 후 mongosync:

  • marketing 데이터베이스의 모든 컬렉션 동기화

  • engineering 데이터베이스 필터링

  • sales 데이터베이스에서 EMEAAPAC 컬렉션 동기화

  • AMER 컬렉션 필터링

다음 예는 cluster0cluster1 간에 동기화 작업을 시작합니다. 소스 클러스터는 cluster0 이고 대상 클러스터는 cluster1 입니다.

cluster0 students, staffprospects 데이터베이스를 포함합니다.

  • students 데이터베이스에는 undergradgraduate 컬렉션이 포함되어 있습니다.

  • staff 데이터베이스에는 employeescontractors 컬렉션이 포함되어 있습니다.

이 예시의 includeNamespaces 배열은 두 데이터베이스에 적용할 필터를 정의합니다.

{
"source": "cluster0",
"destination": "cluster1",
"includeNamespaces":
[
{ "database" : "students", "collections": ["undergrad", "graduate", "adjuncts"] },
{ "database" : "staff" }
]
}

이 필터를 사용하면 mongosync 동기화가 다음과 같이 수행됩니다.

  • 전체 staff 데이터베이스

  • students 데이터베이스의 undergrad, graduateadjuncts 컬렉션

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" } )

중요

컬렉션 이름을 변경할 예정이라면 개별 컬렉션을 지정하는 대신 전체 데이터베이스를 필터에 추가하는 것이 좋습니다.

돌아가기

mongosync 상태