다양한 SLA 또는 SLO를 위한 자체 관리형 계층형 하드웨어
샤딩된 클러스터에서는 샤드 키 를 기반으로 샤딩된 데이터의구역 을 만들 수 있습니다. 각 구역 을 클러스터 에 있는 하나 이상의 샤드와 연결할 수 있습니다. 샤드 는 여러 개의 구역과 연결할 수 있습니다. 균형 잡힌 클러스터 에서 MongoDB 는 구역 에 포함된 청크 를 해당 구역 과 관련된 샤드로만 마이그레이션합니다.
팁
샤드 컬렉션 작업은 비어 있거나 존재하지 않는 컬렉션을 샤딩하기 전에 구역 및 구역 범위를 정의하여 정의된 구역 범위에 대한 청크와 샤드 키 값의 전체 범위를 포함하는 추가 청크를 생성하고 그역 범위를 기반으로 초기 청크 분배를 수행합니다. 이러한 청크의 초기 생성 및 배포를 통해 샤딩을 더 빠르게 설정할 수 있습니다. 초기 분배 이후에는 밸런서가 앞으로의 청크 분배를 관리합니다.
예를 보려면 비어 있거나 존재하지 않는 컬렉션에 대한 구역 및 구역 범위 사전 정의를 참조하세요.
이 튜토리얼에서는 구역 을 사용하여 생성 날짜를 기준으로 문서를 최근 문서를 지원하도록 구역이 지정된 샤드 또는 보관된 문서를 지원하도록 구역이 지정된 샤드로 라우팅합니다.
다음은 SLA(서비스 수준 계약) 또는 SLO(서비스 수준 목표)에 따라 데이터를 세분화하는 사용 사례입니다.
애플리케이션에 최근에 삽입/업데이트된 문서에 대한 지연 시간이 짧은 액세스를 제공해야 하는 경우
애플리케이션이 문서의 범위 또는 하위 집합에 대해 지연 시간이 짧은 액세스에 우선순위를 부여해야 하는 경우
데이터의 특정 범위나 하위 집합을 해당 데이터에 액세스하기 위한 SLA에 적합한 hardware를 갖춘 서버에 저장하도록 하는 이점을 누릴 수 있는 애플리케이션입니다.
다음 다이어그램은 hardware 기반 구역을 사용하여 데이터 액세스 SLA 또는 SLO를 충족하는 sharded cluster를 보여줍니다.
Scenario
사진 공유 애플리케이션은 지난 6개월 이내에 업로드된 사진에 대한 빠른 액세스를 요구합니다. 애플리케이션은 각 사진의 위치와 메타데이터를 data
collection의 photoshare
데이터베이스에 저장합니다.
다음 문서는 단일 사용자가 업로드한 사진을 나타냅니다.
{ "_id" : 10003010, "creation_date" : ISODate("2012-12-19T06:01:17.171Z"), "userid" : 123, "photo_location" : "example.net/storage/usr/photo_1.jpg" } { "_id" : 10003011, "creation_date" : ISODate("2013-12-19T06:01:17.171Z"), "userid" : 123, "photo_location" : "example.net/storage/usr/photo_2.jpg" } { "_id" : 10003012, "creation_date" : ISODate("2016-01-19T06:01:17.171Z"), "userid" : 123, "photo_location" : "example.net/storage/usr/photo_3.jpg" }
_id : 10003012
가 포함된 문서만 지난 1년(2016년 6월 기준) 이내에 업로드된 문서라는 점에 유의하세요.
샤드 키
사진 collection은 { creation_date : 1 }
인덱스를 샤드 키로 사용합니다.
각 문서의 creation_date
필드를 사용하면 생성 날짜에 구역을 만들 수 있습니다.
아키텍처
샤드 cluster 배포는 현재 3개의 샤드로 구성되어 있습니다.
Zones
애플리케이션은 하드웨어 계층을 기반으로 구역에 각 샤드를 추가해야 합니다. 각 hardware 계층은 지정된 SLA 또는 SLO를 충족하도록 설계된 특정 hardware 구성을 나타냅니다.
- 빠른 계층("최근")
이들은 대량의 RAM, 빠른 SSD 디스크, 강력한 CPU를 갖추고 가장 성능이 뛰어난 머신입니다.
구역에는 다음과 같은 범위가 필요합니다.
YYYY-mm-dd
로 지정된 연도, 월, 날짜가 지난 6개월 이내인{ creation_date : ISODate(YYYY-mm-dd)}
의 하한입니다.{ creation_date : MaxKey }
의 상한입니다.
- 아카이브 계층("archive")
이러한 머신은 RAM을 덜 사용하고, 디스크 속도가 느리고, 기본 CPU를 더 많이 사용합니다. 그러나 서버당 더 많은 양의 스토리지를 보유합니다.
구역에는 다음과 같은 범위가 필요합니다.
{ creation_date : MinKey }
의 하한선입니다.{ creation_date : ISODate(YYYY-mm-dd)}
의 상한으로, 연도, 월, 날짜가recent
계층의 하한에 사용된 값과 일치합니다.
성능 요구 사항이 증가하면 추가 샤드를 추가하고 hardware 계층에 따라 적절한 구역에 연결하면 cluster를 수평으로 확장할 수 있습니다.
기간을 기준으로 구역 범위를 정의할 때는 업데이트 시 마이그레이션해야 하는 데이터 양과 구역 범위를 자주 업데이트하지 않을 때 얻을 수 있는 이점을 비교 분석합니다. 예를 들어 데이터를 '최근'으로 간주하는 데 1년으로 제한을 설정하는 것은 1개월로 제한을 설정하는 것보다 더 많은 데이터를 포함할 수 있습니다. 1개월 단위로 로테이션할 때는 더 많은 마이그레이션이 필요하지만, 마이그레이션해야 하는 문서의 양은 1년 단위로 로테이션할 때보다 적습니다.
쓰기 작업
구역을 사용하면 삽입되거나 업데이트된 문서가 구성된 구역과 일치하는 경우 해당 구역 내부의 샤드에만 쓸 수 있습니다.
MongoDB는 구성된 구역과 일치하지 않는 문서를 클러스터의 샤드에 작성할 수 있습니다.
참고
위에서 설명한 동작을 수행하려면 클러스터가 구성된 구역을 위반하는 청크가 없는 정상 상태여야 합니다. 자세한 내용은 밸런서 에 대한 다음 섹션을 참조하세요.
읽기 작업
쿼리에 샤드 키가 포함된 경우 MongoDB는 쿼리를 특정 샤드로 라우팅할 수 있습니다.
예를 들어 MongoDB는 쿼리 문서에 creation_date
가 포함되어 있기 때문에 다음 쿼리에 대해 대상 지정 읽기 작업 을 시도할 수 있습니다.
photoDB = db.getSiblingDB("photoshare") photoDB.data.find( { "creation_date" : ISODate("2015-01-01") } )
요청된 문서가 recent
zone 범위 내에 있는 경우 MongoDB는 이 쿼리를 해당 zone 내부의 샤드로 라우팅하여 cluster 전체 브로드캐스트 읽기 작업에 비해 더 빠른 읽기를 보장합니다.
밸런서
밸런서는 구성된 모든 구역과 관련하여 청크를 적절한 분할 데이터베이스로 마이그레이션 합니다. 마이그레이션이 완료될 때까지 샤드에는 구성된 구역을 위반하는 청크가 포함될 수 있습니다. 밸런싱이 완료되면 샤드에는 범위가 할당된 구역을 위반하지 않는 청크만 포함되어야 합니다.
구역 또는 구역 범위를 추가하거나 제거하면 청크 마이그레이션이 발생할 수 있습니다. 데이터 세트의 크기와 구역 또는 구역 범위가 영향을 미치는 청크의 수에 따라 이러한 마이그레이션은 클러스터 성능에 영향을 미칠 수 있습니다. 특정 예약 기간 동안 밸런서를 실행하는 것을 고려해보세요. 스케줄링 기간을 설정하는 방법에 대한 튜토리얼은 밸런싱 기간 예약을 참조하세요.
보안
자체 관리 배포서버에서 역할 기반 액세스 제어를 사용하여 실행 샤딩된 클러스터의 경우 admin
데이터베이스 에서 최소한 clusterManager
역할 을 가진 사용자로 인증합니다.
절차
구역 또는 구역 범위를 만들려면 mongos
에 연결되어 있어야 합니다. 샤드에 직접 연결하여 구역 또는 구역 범위를 생성할 수 없습니다.
밸런서 비활성화
새 구역을 구성하는 동안 마이그레이션이 발생하지 않도록 하려면 전체 샤딩된 클러스터 에서 밸런서 를 비활성화해야 합니다.
sh.stopBalancer()
를 사용하여 클러스터 에 대한 밸런서 를 중지합니다.
sh.stopBalancer()
sh.isBalancerRunning()
을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요. 계속 진행하기 전에 현재 밸런싱 라운드가 완료될 때까지 기다립니다.
각 구역의 범위 정의
최근 사진의 범위를 정의하고 sh.addTagRange()
메서드를 사용하여 이를 recent
구역에 연결합니다. 이 메서드에는 다음이 필요합니다.
collection의 전체 네임스페이스입니다.
범위의 포괄적인 하한입니다.
범위의 배타적 상한선입니다.
구역.
sh.addTagRange( "photoshare.data", { "creation_date" : ISODate("2016-01-01") }, { "creation_date" : MaxKey }, "recent" )
오래된 사진의 범위를 정의하고 sh.addTagRange()
메서드를 사용하여 이를 archive
구역에 연결합니다. 이 메서드에는 다음이 필요합니다.
collection의 전체 네임스페이스입니다.
범위의 포괄적인 하한입니다.
범위의 배타적 상한선입니다.
구역.
sh.addTagRange( "photoshare.data", { "creation_date" : MinKey }, { "creation_date" : ISODate("2016-01-01") }, "archive" )
밸런서 활성화
밸런서를 다시 활성화하여 cluster의 균형을 재조정합니다.
컬렉션의 네임스페이스를 지정하는 sh.enableBalancing()
을(를) 사용하여 밸런서를 시작합니다.
sh.enableBalancing("photoshare.data")
sh.isBalancerRunning()
을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요.
구역 범위 업데이트
샤드 범위를 업데이트하려면 크론 작업 또는 기타 예약된 절차의 일부로 다음 작업을 수행합니다.
밸런서 비활성화
새 구역을 구성하는 동안 마이그레이션이 발생하지 않도록 하려면 전체 샤딩된 클러스터 에서 밸런서 를 비활성화해야 합니다.
sh.stopBalancer()
를 사용하여 클러스터 에 대한 밸런서 를 중지합니다.
sh.stopBalancer()
sh.isBalancerRunning()
을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요. 계속 진행하기 전에 현재 밸런싱 라운드가 완료될 때까지 기다립니다.
이전 샤드 구역 범위 제거
sh.removeTagRange()
메서드를 사용하여 이전 recent
구역 범위를 제거합니다. 이 메서드에는 다음이 필요합니다.
collection의 전체 네임스페이스입니다.
범위의 포괄적인 하한입니다.
범위의 배타적 상한선입니다.
sh.removeTagRange( "photoshare.data", { "creation_date" : ISODate("2016-01-01") }, { "creation_date" : MaxKey } )
sh.removeTagRange()
메서드를 사용하여 이전 archive
구역 범위를 제거합니다. 이 메서드에는 다음이 필요합니다.
collection의 전체 네임스페이스입니다.
범위의 포괄적인 하한입니다.
범위의 배타적 상한선입니다.
sh.removeTagRange( "photoshare.data", { "creation_date" : MinKey }, { "creation_date" : ISODate("2016-01-01") } )
각 구역에 대해 새 구역 범위 추가
최근 사진의 범위를 정의하고 sh.addTagRange()
메서드를 사용하여 이를 recent
구역에 연결합니다. 이 메서드에는 다음이 필요합니다.
collection의 전체 네임스페이스입니다.
범위의 포괄적인 하한입니다.
범위의 배타적 상한선입니다.
구역.
sh.addTagRange( "photoshare.data", { "creation_date" : ISODate("2016-06-01") }, { "creation_date" : MaxKey }, "recent" )
오래된 사진의 범위를 정의하고 sh.addTagRange()
메서드를 사용하여 이를 archive
구역에 연결합니다. 이 메서드에는 다음이 필요합니다.
collection의 전체 네임스페이스입니다.
범위의 포괄적인 하한입니다.
범위의 배타적 상한선입니다.
구역.
sh.addTagRange( "photoshare.data", { "creation_date" : MinKey }, { "creation_date" : ISODate("2016-06-01") }, "archive" )
밸런서 활성화
밸런서를 다시 활성화하여 cluster의 균형을 재조정합니다.
컬렉션의 네임스페이스를 지정하는 sh.enableBalancing()
을(를) 사용하여 밸런서를 시작합니다.
sh.enableBalancing("photoshare.data")
sh.isBalancerRunning()
을(를) 사용하여 밸런서 프로세스가 현재 실행 중인지 확인하세요.
변경 사항 검토
다음에 밸런서 가 실행되면 구성된 구역과 관련하여 샤드 전체에 데이터를 마이그레이션 합니다.
밸런싱 이전에는 recent
구역의 샤드에 가 이상인 문서만 포함된 반면,creation_date
ISODate("2016-01-01")
구역의 archive
샤드에는 가 미만인 문서만 포함되어 creation_date
ISODate("2016-01-01")
있었습니다.
밸런싱이 완료되면 구역의 recent
샤드에는 가 이상인 문서만 포함되어야 하고,creation_date
ISODate("2016-06-01")
구역의 archive
샤드에는 이 creation_date
보다 작은 문서만 포함되어야 합니다.ISODate("2016-06-01")
.