애플리케이션 또는 고객별로 데이터 세분화
샤딩된 클러스터에서는 샤드 키 를 기반으로 샤딩된 데이터의구역 을 만들 수 있습니다. 각 구역 을 클러스터 에 있는 하나 이상의 샤드와 연결할 수 있습니다. 샤드 는 여러 개의 구역과 연결할 수 있습니다. 균형 잡힌 클러스터 에서 MongoDB 는 구역 에 포함된 청크 를 해당 구역 과 관련된 샤드로만 마이그레이션합니다.
팁
샤드 컬렉션 작업은 비어 있거나 존재하지 않는 컬렉션을 샤딩하기 전에 구역 및 구역 범위를 정의하여 정의된 구역 범위에 대한 청크와 샤드 키 값의 전체 범위를 포함하는 추가 청크를 생성하고 그역 범위를 기반으로 초기 청크 분배를 수행합니다. 이러한 청크의 초기 생성 및 배포를 통해 샤딩을 더 빠르게 설정할 수 있습니다. 초기 분배 이후에는 밸런서가 앞으로의 청크 분배를 관리합니다.
예를 보려면 비어 있거나 존재하지 않는 컬렉션에 대한 구역 및 구역 범위 사전 정의를 참조하세요.
이 튜토리얼에서는 구역을 사용하여 데이터를 세분화하는 방법을 보여줍니다.
애플리케이션 또는 고객별로 데이터를 세분화해야 할 수 있는 다음 시나리오를 고려하세요.
여러 애플리케이션을 제공하는 데이터베이스
여러 고객에게 서비스를 제공하는 데이터베이스
애플리케이션 또는 고객 데이터의 범위 또는 하위 집합을 격리해야 하는 데이터베이스
애플리케이션 또는 고객 데이터의 범위 또는 하위 집합에 대한 리소스 할당이 필요한 데이터베이스
이 다이어그램은 구역을 사용하여 애플리케이션 또는 고객을 기반으로 데이터를 세분화하는 샤드 cluster를 보여줍니다. 이를 통해 데이터를 특정 샤드로 격리할 수 있습니다. 또한 각 샤드에는 해당 샤드에 저장된 데이터의 성능 요구 사항에 맞게 특정 hardware를 할당할 수 있습니다.
Scenario
애플리케이션은 client
필드와 함께 사용자 점수를 추적하여 users
collection의 gamify
데이터베이스에 점수를 저장합니다. 가능한 각 값 client
에는 데이터 세분화를 허용하기 위해 자체 구역이 필요합니다. 또한 관리자가 client
에 연결된 각 샤드의 하드웨어를 성능 및 비용 측면에서 최적화할 수 있습니다.
다음 문서는 두 사용자의 부분적인 관점을 나타냅니다.
{ "_id" : ObjectId("56f08c447fe58b2e96f595fa"), "client" : "robot", "userid" : 123, "high_score" : 181, ..., } { "_id" : ObjectId("56f08c447fe58b2e96f595fb"), "client" : "fruitos", "userid" : 456, "high_score" : 210, ..., }
샤드 키
users
collection은 { client : 1, userid : 1 }
복합 인덱스를 샤드 키로 사용합니다.
각 문서의 client
필드를 사용하면 각 고유 클라이언트 값에 대한 구역을 만들 수 있습니다.
userid
필드는 country
에 비해 샤드 키에 높은 카디널리티와 낮은 빈도 구성 요소를 제공합니다.
샤드 키 선택에 대한 일반적인 지침은 샤드 키 선택을 참조하십시오.
아키텍처
애플리케이션이 특정 client
에 연결된 구역에 샤드를 추가해야 합니다.
샤드 cluster 배포는 현재 4개의 샤드로 구성되어 있습니다.
Zones
이 애플리케이션에는 두 개의 클라이언트 영역이 있습니다.
- 로보트 클라이언트('로봇')
- 이 구역은
client : robot
인 모든 문서를 나타냅니다. - 과일 OS 클라이언트('프루도스')
- 이 구역은
client : fruitos
인 모든 문서를 나타냅니다.
쓰기 작업
구역을 사용하면 삽입되거나 업데이트된 문서가 구성된 구역과 일치하는 경우 해당 구역 내부의 샤드에만 쓸 수 있습니다.
MongoDB는 구성된 구역과 일치하지 않는 문서를 클러스터의 샤드에 작성할 수 있습니다.
참고
위에서 설명한 동작을 수행하려면 cluster가 구성된 구역을 위반하는 청크가 없는 정상 상태여야 합니다. 자세한 내용은 밸런서 에 대한 다음 섹션을 참조하세요.
읽기 작업
쿼리에 적어도 client
필드가 포함된 경우 MongoDB는 쿼리를 특정 샤드로 라우팅할 수 있습니다.
예를 들어, MongoDB는 다음 쿼리에 대해 대상 읽기 연산을 시도할 수 있습니다.
chatDB = db.getSiblingDB("gamify") chatDB.users.find( { "client" : "robot" , "userid" : "123" } )
client
필드가 없는 쿼리는 브로드캐스트 연산을 수행합니다.
밸런서
밸런서는 구성된 모든 구역과 관련하여 청크를 적절한 분할 데이터베이스로 마이그레이션 합니다. 마이그레이션이 완료될 때까지 샤드에는 구성된 구역을 위반하는 청크가 포함될 수 있습니다. 밸런싱이 완료되면 샤드에는 범위가 할당된 구역을 위반하지 않는 청크만 포함되어야 합니다.
구역 또는 구역 범위를 추가하거나 제거하면 청크 마이그레이션이 발생할 수 있습니다. 데이터 세트의 크기와 구역 또는 구역 범위가 영향을 미치는 청크의 수에 따라 이러한 마이그레이션은 클러스터 성능에 영향을 미칠 수 있습니다. 특정 예약 기간 동안 밸런서를 실행하는 것을 고려해보세요. 스케줄링 기간을 설정하는 방법에 대한 튜토리얼은 밸런싱 기간 예약을 참조하세요.
보안
자체 관리 배포서버에서 역할 기반 액세스 제어를 사용하여 실행 샤딩된 클러스터의 경우 admin
데이터베이스 에서 최소한 clusterManager
역할 을 가진 사용자로 인증합니다.
절차
계속 진행하려면 대상 샤드 mongos
cluster 에 연결된 에 연결되어 있어야 합니다. 샤드에 직접 연결하여 구역 또는 구역 범위를 생성할 수 없습니다.
밸런서 비활성화
새로운 구역을 구성하는 동안 마이그레이션이 발생하지 않도록 하려면 collection에서 밸런서를 비활성화해야 합니다.
컬렉션의 네임스페이스를 지정하는 sh.disableBalancing()
을 사용하여 밸런서를 중지합니다.
sh.disableBalancing("chat.message")
sh.isBalancerRunning()
을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요. 계속 진행하기 전에 현재 밸런싱 라운드가 완료될 때까지 기다립니다.
각 샤드를 적절한 구역에 추가
robot
구역에 shard0000
을(를) 추가합니다.
sh.addShardTag("shard0000", "robot")
robot
구역에 shard0001
을(를) 추가합니다.
sh.addShardTag("shard0001", "robot")
fruitos
구역에 shard0002
을(를) 추가합니다.
sh.addShardTag("shard0002", "fruitos")
fruitos
구역에 shard0003
을(를) 추가합니다.
sh.addShardTag("shard0003", "fruitos")
sh.status()
를 실행하여 샤드 클러스터에 대해 구성된 구역을 검토합니다.
각 구역의 범위 정의
robot
클라이언트의 범위를 정의하고 sh.addTagRange()
메서드를 사용하여 이를 robot
구역에 연결합니다.
이 메서드에는 다음이 필요합니다.
대상 collection의 전체 네임스페이스
범위의 포괄적 하한
범위의 배타적 상한
구역 이름
sh.addTagRange( "gamify.users", { "client" : "robot", "userid" : MinKey }, { "client" : "robot", "userid" : MaxKey }, "robot" )
fruitos
클라이언트의 범위를 정의하고 sh.addTagRange()
메서드를 사용하여 이를 fruitos
구역에 연결합니다.
이 메서드에는 다음이 필요합니다.
대상 collection의 전체 네임스페이스
범위의 포괄적 하한
범위의 배타적 상한
구역 이름
sh.addTagRange( "gamify.users", { "client" : "fruitos", "userid" : MinKey }, { "client" : "fruitos", "userid" : MaxKey }, "fruitos" )
MinKey
및 MaxKey
값은 비교를 위해 예약된 특수 값입니다. MinKey
는 항상 가능한 다른 모든 값보다 낮게 비교되는 반면, MaxKey
는 항상 다른 모든 가능한 값보다 높게 비교됩니다. 구성된 범위는 각 client
에 대한 모든 사용자를 캡처합니다.
밸런서 활성화
밸런서를 다시 활성화하여 cluster의 균형을 재조정합니다.
collection의 네임스페이스를 지정하는 sh.enableBalancing()
을 사용하여 밸런서를 시작합니다.
sh.enableBalancing("chat.message")
sh.isBalancerRunning()
을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요.