문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

위치별로 데이터 세분화

이 페이지의 내용

  • 시나리오
  • 절차

샤드 클러스터에서는 샤드 키를 기반으로 샤드 데이터의 영역을 만들 수 있습니다. 각 영역을 클러스터에 있는 하나 이상의 샤드와 연결할 수 있습니다. 샤드는 여러 개의 영역과 연결할 수 있습니다. 균형 잡힌 클러스터에서 MongoDB는 영역에 포함된 청크를 해당 영역과 관련된 샤드로만 마이그레이션합니다.

샤드 컬렉션 작업은 비어 있거나 존재하지 않는 컬렉션을 샤딩하기 전에 구역 및 구역 범위를 정의하여 정의된 구역 범위에 대한 청크와 샤드 키 값의 전체 범위를 포함하는 추가 청크를 생성하고 그역 범위를 기반으로 초기 청크 분배를 수행합니다. 이러한 청크의 초기 생성 및 배포를 통해 샤딩을 더 빠르게 설정할 수 있습니다. 초기 분배 이후에는 밸런서가 앞으로의 청크 분배를 관리합니다.

예를 보려면 비어 있거나 존재하지 않는 컬렉션에 대한 구역 및 구역 범위 사전 정의를 참조하세요.

이 튜토리얼에서는 구역을 사용하여 지리적 구역을 기반으로 데이터를 세분화합니다.

다음은 지리적 영역별로 데이터를 분류하는 몇 가지 사용 사례입니다.

  • 국가별로 사용자 데이터를 세분화해야 하는 애플리케이션

  • 국가별로 리소스를 할당해야 하는 데이터베이스

다음 다이어그램은 지리적 구역을 사용하여 데이터 세분화 요구 사항을 관리하고 충족하는 샤드 클러스터를 보여줍니다.

구역을 기반으로 한 지리적 분포 도표

금융 채팅 애플리케이션은 메시지를 기록하고 원본 사용자의 국가를 추적합니다. 애플리케이션이 messages collection 아래의 chat 데이터베이스에 로그를 저장합니다. 채팅에는 해당 국가의 로컬 서버가 해당 국가의 사용자에 대한 읽기 및 쓰기 요청을 처리하기 위해 국가별로 분류해야 하는 정보가 포함되어 있습니다. 리소스를 공유하기 위해 여러 국가 그룹에 동일한 구역을 할당할 수 있습니다.

이 애플리케이션은 현재 미국, 영국, 독일에 사용자가 있습니다. 필드는 country ISO 3166-1 Alpha- 를 기반으로 사용자의2 국가를 나타냅니다. 두 글자로 된 국가 코드.

다음 문서는 세 가지 채팅 메시지의 부분 보기를 나타냅니다.

{
"_id" : ObjectId("56f08c447fe58b2e96f595fa"),
"country" : "US",
"userid" : 123,
"message" : "Hello there",
...,
}
{
"_id" : ObjectId("56f08c447fe58b2e96f595fb"),
"country" : "UK",
"userid" : 456,
"message" : "Good Morning"
...,
}
{
"_id" : ObjectId("56f08c447fe58b2e96f595fc"),
"country" : "DE",
"userid" : 789,
"message" : "Guten Tag"
...,
}

messages collection은 { country : 1, userid : 1 } 복합 인덱스를 샤드 키로 사용합니다.

각 문서의 country 필드를 사용하면 각 국가 값에 대한 구역을 생성할 수 있습니다.

userid 필드는 country에 비해 분할 키에 높은 카디널리티와 낮은 빈도 구성 요소를 제공합니다.

샤드 키 선택에 대한 일반적인 지침은 샤드 키 선택을 참조하십시오.

The 샤드 유클러스터는럽과 북미의 두 데이터 센터에 샤드를 보유하고 있습니다.

지리적 분포 아키텍처를 지원하는 데 사용되는 구역 도표

이 애플리케이션에는 데이터 센터당 하나의 구역이 필요합니다.

EU - 유럽 데이터 센터

이 데이터 센터에 배포된 샤드가 EU 구역에 할당되었습니다.

로컬 읽기 및 쓰기에 EU 데이터 센터를 사용하는 각 국가에 대해 다음을 사용하여 EU 구역의 구역 범위를 생성합니다.

  • 의 하한 값 { "country" : <country>, "userid" : MinKey }

  • 의 상한 값 { "country" : <country>, "userid" : MaxKey }

NA - 북미 데이터 센터

이 데이터 센터에 배포된 샤드가 NA 구역에 할당되었습니다.

로컬 읽기 및 쓰기에 NA 데이터 센터를 사용하는 각 국가에 대해 다음을 사용하여 NA 구역의 구역 범위를 생성합니다.

  • 의 하한 값 { "country" : <country>, "userid" : MinKey }

  • 의 상한 값 { "country" : <country>, "userid" : MaxKey }

참고

MinKeyMaxKey 값은 비교를 위해 예약된 특수 값입니다.

구역을 사용하면 삽입되거나 업데이트된 문서가 구성된 구역과 일치하는 경우 해당 구역 내부의 샤드에만 쓸 수 있습니다.

MongoDB는 구성된 구역과 일치하지 않는 문서를 클러스터의 샤드에 작성할 수 있습니다.

참고

위에서 설명한 동작을 수행하려면 클러스터가 구성된 구역을 위반하는 청크가 없는 정상 상태여야 합니다. 자세한 내용은 밸런서 에 대한 다음 섹션을 참조하세요.

쿼리에 적어도 country 필드가 포함된 경우 MongoDB는 쿼리를 특정 샤드로 라우팅할 수 있습니다.

예를 들어, MongoDB는 다음 쿼리에 대해 대상 읽기 연산을 시도할 수 있습니다.

chatDB = db.getSiblingDB("chat")
chatDB.messages.find( { "country" : "UK" , "userid" : "123" } )

country 필드가 없는 쿼리는 브로드캐스트 연산을 수행합니다.

밸런서는 구성된 모든 구역과 관련하여 청크를 적절한 분할 데이터베이스로 마이그레이션 합니다. 마이그레이션이 완료될 때까지 샤드에는 구성된 구역을 위반하는 청크가 포함될 수 있습니다. 밸런싱이 완료되면 샤드에는 범위가 할당된 구역을 위반하지 않는 청크만 포함되어야 합니다.

구역 또는 구역 범위를 추가하거나 제거하면 청크 마이그레이션이 발생할 수 있습니다. 데이터 세트의 크기와 구역 또는 구역 범위가 영향을 미치는 청크의 수에 따라 이러한 마이그레이션은 클러스터 성능에 영향을 미칠 수 있습니다. 특정 예약 기간 동안 밸런서를 실행하는 것을 고려해보세요. 스케줄링 기간을 설정하는 방법에 대한 튜토리얼은 밸런싱 기간 예약을 참조하세요.

역할 기반 액세스 제어로 실행되는 샤드 클러스터의 경우 admin 데이터베이스에서 최소 clusterManager 역할이 있는 사용자로 인증합니다.

구역 및 구역 범위를 만들려면 mongos에 연결되어 있어야 합니다. 구역 또는 구역 범위는 분할된 데이터베이스에 직접 연결하여 만들 수 없습니다.

1

성능에 미치는 영향을 줄이기 위해 컬렉션에서 밸런서를 비활성화하여 새 구역을 구성하는 동안 마이그레이션이 발생하지 않도록 할 수 있습니다.

컬렉션의 네임스페이스를 지정하는 sh.disableBalancing()을 사용하여 밸런서를 중지합니다.

sh.disableBalancing("chat.message")

sh.isBalancerRunning()을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요. 계속 진행하기 전에 현재 밸런싱 라운드가 완료될 때까지 기다립니다.

2

북미 데이터 센터의 각 샤드를 NA 구역에 추가합니다.

sh.addShardTag(<shard name>, "NA")

유럽 데이터 센터의 각 샤드를 EU 구역에 추가합니다.

sh.addShardTag(<shard name>, "EU")

sh.status()를 실행하여 특정 샤드에 할당된 구역을 검토할 수 있습니다.

3

country : US인 샤드 키 값의 경우 샤드 키 범위를 정의하고 sh.addTagRange() 메서드를 사용하여 이를 NA 구역에 연결합니다. 이 메서드에는 다음이 필요합니다.

  • collection의 전체 네임스페이스입니다.

  • 범위의 포괄적인 하한입니다.

  • 범위의 배타적 상한선입니다.

  • 구역의 이름입니다.

sh.addTagRange(
"chat.messages",
{ "country" : "US", "userid" : MinKey },
{ "country" : "US", "userid" : MaxKey },
"NA"
)

country : UK인 샤드 키 값의 경우 샤드 키 범위를 정의하고 sh.addTagRange() 메서드를 사용하여 이를 EU 구역에 연결합니다. 이 메서드에는 다음이 필요합니다.

  • collection의 전체 네임스페이스입니다.

  • 범위의 포괄적인 하한입니다.

  • 범위의 배타적 상한선입니다.

  • 구역의 이름입니다.

sh.addTagRange(
"chat.messages",
{ "country" : "UK", "userid" : MinKey },
{ "country" : "UK", "userid" : MaxKey },
"EU"
)

country : DE인 샤드 키 값의 경우 샤드 키 범위를 정의하고 sh.addTagRange() 메서드를 사용하여 이를 EU 구역에 연결합니다. 이 메서드에는 다음이 필요합니다.

  • collection의 전체 네임스페이스입니다.

  • 범위의 포괄적인 하한입니다.

  • 범위의 배타적 상한선입니다.

  • 구역의 이름입니다.

sh.addTagRange(
"chat.messages",
{ "country" : "DE", "userid" : MinKey },
{ "country" : "DE", "userid" : MaxKey },
"EU"
)

MinKeyMaxKey 값은 비교를 위해 예약된 특수 값입니다. MinKey는 항상 가능한 다른 모든 값보다 낮게 비교되는 반면, MaxKey는 항상 다른 모든 가능한 값보다 높게 비교됩니다. 구성된 범위는 각 device에 대한 모든 사용자를 캡처합니다.

country : UKcountry : DE 모두 EU 구역에 할당됩니다. 이렇게 하면 UK 또는 DEcountry의 값으로 가진 모든 문서가 EU 데이터 센터에 연결됩니다.

4

이전 단계에서 밸런서가 비활성화된 경우 이 절차가 완료되면 밸런서를 다시 활성화하여 cluster의 균형을 재조정합니다.

collection의 네임스페이스를 지정하는 sh.enableBalancing()을 사용하여 밸런서를 시작합니다.

sh.enableBalancing("chat.message")

sh.isBalancerRunning()을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요.

5

다음에 밸런서가 실행되면 필요한 경우 청크를 분할하고 구성된 구역에 따라 샤드 간에 청크를 마이그레이션합니다.

밸런싱이 완료된 후에는 다음이 수행되어야 합니다.

  • NA 구역의 샤드에는 country : US이 있는 문서만 포함되어야 하며

  • EU 구역의 샤드에는 country : UK 또는 country : DE이 있는 문서만 포함되어야 합니다.

US, UK 또는 DE 이외의 country 값을 가진 문서는 클러스터의 모든 샤드에 있을 수 있습니다.

청크 분포를 확인하려면 sh.status()를 실행하세요.

애플리케이션을 사용하려면 다음 업데이트가 필요합니다.

  • 이제 country : UK가 있는 문서를 새 UK 데이터 센터에 연결해야 합니다. EU 데이터 센터의 모든 데이터를 마이그레이션해야 합니다.

  • 이제 채팅 애플리케이션이 멕시코의 사용자를 지원합니다. country : MX가 있는 문서는 NA 데이터 센터로 라우팅되어야 합니다.

다음 절차에 따라 구역 범위를 업데이트합니다.

1

성능에 미치는 영향을 줄이기 위해 컬렉션에서 밸런서를 비활성화하여 새 영역을 구성하거나 이전 영역을 제거하는 동안 마이그레이션이 발생하지 않도록 할 수 있습니다.

컬렉션의 네임스페이스를 지정하는 sh.disableBalancing()을(를) 사용하여 밸런서를 중지합니다.

sh.disableBalancing("chat.messages")

sh.isBalancerRunning()을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요. 계속 진행하기 전에 현재 밸런싱 라운드가 완료될 때까지 기다립니다.

2

UK 데이터 센터의 각 샤드를 UK 구역에 추가합니다.

sh.addShardTag("<shard name>", "UK")

sh.status()를 실행하여 특정 샤드에 할당된 구역을 검토할 수 있습니다.

3

sh.removeTagRange() 메소드를 사용하여 UK 국가와 연관된 이전 구역 범위를 제거하십시오. 이 메서드에는 다음이 필요합니다.

  • collection의 전체 네임스페이스입니다.

  • 범위의 포괄적인 하한입니다.

  • 범위의 배타적 상한선입니다.

sh.removeTagRange(
"chat.messages",
{ "country" : "UK", "userid" : MinKey },
{ "country" : "UK", "userid" : MaxKey }
)
4

country : UK인 샤드 키 값의 경우 샤드 키 범위를 정의하고 sh.addTagRange() 메서드를 사용하여 이를 UK 구역에 연결합니다. 이 메서드에는 다음이 필요합니다.

  • collection의 전체 네임스페이스입니다.

  • 범위의 포괄적인 하한입니다.

  • 범위의 배타적 상한선입니다.

  • 구역의 이름입니다.

sh.addTagRange(
"chat.message",
{ "country" : "UK", "userid" : MinKey },
{ "country" : "UK", "userid" : MaxKey },
"UK"
)

country : MX인 샤드 키 값의 경우 샤드 키 범위를 정의하고 sh.addTagRange() 메서드를 사용하여 이를 NA 구역에 연결합니다. 이 메서드에는 다음이 필요합니다.

  • collection의 전체 네임스페이스입니다.

  • 범위의 포괄적인 하한입니다.

  • 범위의 배타적 상한선입니다.

  • 구역의 이름입니다.

sh.addTagRange(
"chat.messages",
{ "country" : "MX", "userid" : MinKey },
{ "country" : "MX", "userid" : MaxKey },
"NA"
)

MinKeyMaxKey 값은 비교를 위해 예약된 특수 값입니다. MinKey는 항상 가능한 다른 모든 값보다 낮게 비교되는 반면, MaxKey는 항상 다른 모든 가능한 값보다 높게 비교됩니다. 이렇게 하면 두 범위가 userid의 가능한 전체 값 공간을 캡처할 수 있습니다.

5

이전 단계에서 밸런서가 비활성화된 경우 이 절차가 완료되면 밸런서를 다시 활성화하여 cluster의 균형을 재조정합니다.

컬렉션의 네임스페이스를 지정하는 sh.enableBalancing()을(를) 사용하여 밸런서를 시작합니다.

sh.enableBalancing("chat.messages")

sh.isBalancerRunning()을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요.

6

다음에 밸런서가 실행되면 필요한 경우 청크를 분할하고 구성된 구역에 따라 샤드 간에 청크를 마이그레이션합니다.

밸런싱 전:

  • EU 구역의 샤드에는 country : DE 또는 country : UK인 문서만 포함됩니다.

  • country : MX이 샤딩된 클러스터의 모든 샤드에 저장될 수 있는 문서.

밸런싱 후:

  • EU 구역의 샤드에는 country : DE인 문서만 포함됩니다.

  • UK 구역의 샤드에는 country : UK인 문서만 포함됩니다.

  • NA 구역의 샤드에는 country : US 또는 country : MX인 문서만 포함됩니다.

US, MX, UK, DE 이외의 country 값을 가진 문서는 클러스터의 모든 샤드에 있을 수 있습니다.

청크 분포를 확인하려면 sh.status()를 실행하세요.

다음도 참조하세요.

← 기존 샤드 영역 업데이트

이 페이지의 내용