Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

샤딩된 클러스터 밸런서 관리

이 페이지의 내용

  • 밸런서 상태 확인
  • 밸런서가 실행 중인지 확인
  • 기본 범위 크기 구성
  • 밸런싱 기간 예약
  • 밸런싱 확인 창
  • 밸런싱 기간 예약 삭제
  • 밸런서 비활성화
  • 밸런서 활성화
  • 백업 중 밸런싱 비활성화
  • 컬렉션에서 밸런싱 비활성화
  • 컬렉션에서 밸런싱 활성화
  • 밸런싱이 활성화 또는 비활성화되었는지 확인
  • 청크 마이그레이션을 위한 복제 방식 변경
  • 주어진 샤드의 최대 저장 크기 변경하기

버전 6.1에서 변경되었습니다.

이 페이지에서는 밸런싱과 관련된 일반적인 관리 절차에 대해 설명합니다. 밸런싱에 대한 소개는 샤딩된 클러스터 밸런서를 참조하세요. 밸런싱에 대한 더 기술적인 정보는 밸런서 내부를 참조하세요.

밸런서 프로세스가 mongos 인스턴스에서 config 서버 복제본 세트의 프라이머리 구성원으로 이동했습니다.

sh.getBalancerState() 는 밸런서가 활성화되었는지 (즉, 밸런서 실행이 허용되는지) 확인합니다. sh.getBalancerState() 는 밸런서가 데이터를 실제로 마이그레이션하고 있는지 확인하지 않습니다.

샤드 클러스터의 밸런서가 활성화되어 있는지 확인하려면 다음 명령을 실행하세요. 이 명령은 부울 값을 반환합니다.

sh.getBalancerState()

sh.status()를 사용하여 밸런서가 활성화되었는지 확인할 수도 있습니다. currently-enabled 필드는 밸런서가 활성화되어 있는지 여부를 나타내며, currently-running 필드는 밸런서가 현재 실행 중인지 여부를 나타냅니다.

해당 클러스터에서 밸런서 프로세스가 활성화되어 있는지 확인하려면:

  1. mongosh shell을 사용하여 클러스터에서 모든 mongos에 연결합니다.

  2. 밸런서가 실행 중인지 확인하려면 다음 작업을 수행하세요.

    sh.isBalancerRunning()

샤드 클러스터의 기본 범위 크기는 128 메가바이트입니다. 대부분의 상황에서 기본 크기는 청크 분할 및 마이그레이션에 적합합니다. 범위 크기가 배포에 미치는 영향에 대한 자세한 내용은 범위 크기를 참조하세요.

기본 범위 크기를 변경하면 마이그레이션 및 자동 분할 중에 처리되는 범위에 영향을 주지만, 이전에 생성된 모든 범위에 대해서는 소급적으로 영향을 미치지 않습니다.

MongoDB 6.0.3부터 자동 청크 분할이 수행되지 않습니다. 이는 밸런싱 정책 개선 때문입니다. 자동 분할 명령이 여전히 존재하지만 작업을 수행하지 않습니다.

기본 범위 크기를 구성하려면 분할된 클러스터에서 범위 크기 수정을 참조하십시오.

특정 상황에서, 특히 데이터 세트가 천천히 성장하고 마이그레이션이 성능에 영향을 줄 수 있을 때, 밸런서가 오직 특정 시간에만 활성화되도록 하는 것이 유용합니다. 기본적으로 밸런서 프로세스는 항상 활성화되어 청크를 마이그레이션합니다. 다음 절차는 밸런서가 청크를 마이그레이션할 수 있는 기간인 activeWindow를 지정합니다.

1

클러스터의 모든 mongos 에 연결할 수 있습니다.

2

다음 명령을 실행하여 데이터베이스 구성으로 전환합니다.

use config
3

밸런서가 stopped 상태에서는 활성화되지 않습니다. 밸런서가 stopped 이 아닌지 확인하려면 다음과 같이 sh.startBalancer() 사용하십시오.

sh.startBalancer()

activeWindow 시간대를 벗어난 경우에는 밸런서가 시작되지 않습니다.

MongoDB 6.0.3부터 자동 청크 분할이 수행되지 않습니다. 이는 밸런싱 정책 개선 때문입니다. 자동 분할 명령이 여전히 존재하지만 작업을 수행하지 않습니다.

MongoDB 6.0.3 이전 버전에서 sh.startBalancer()는 샤딩된 클러스터에 대한 자동 분할도 활성화합니다.

4

다음과 같이 updateOne()를 사용하여 activeWindow를 설정합니다.

db.settings.updateOne(
{ _id: "balancer" },
{ $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } },
{ upsert: true }
)

<start-time><end-time> 두 자리 숫자(예시: HH:MM)를 사용하여 밸런싱 창의 시작 및 종료 경계를 지정할 수 있습니다.

  • HH 값의 경우 00부터 23까지의 시간 값을 사용하세요.

  • MM 값의 경우 00에서 59까지의 분 단위 값을 사용하세요.

온프레미스 또는 자체 관리형 샤딩 클러스터의 경우, MongoDB는 구성 서버 복제 세트에 있는 주요 멤버의 시간대를 기준으로 시작 및 중지 시간을 평가합니다.

Atlas 클러스터의 경우, MongoDB는 UTC 표준 시간대를 기준으로 시작 및 중지 시간을 평가합니다.

참고

밸런서 창은 하루 동안 삽입된 모든 데이터의 마이그레이션을 완료하기에 충분해야 합니다.

데이터 삽입 비율은 활동 및 사용 패턴에 따라 변경될 수 있으므로, 선택한 밸런싱 기간이 배포의 요구 사항을 지원하기에 충분한지 확인하는 것이 중요합니다.

현재 밸런싱 창 을 확인하려면 다음 명령을 실행 합니다.

use config
db.settings.find( { _id: "balancer" } )

밸런싱 기간을 설정한 상태에서 밸런서가 항상 실행되도록 예정을 제거하려면 다음과 같이 $unset을 사용하여 activeWindow을 지웁니다.

use config
db.settings.updateOne( { _id : "balancer" }, { $unset : { activeWindow : true } } )

중요

밸런서 를 장기간 비활성화된 상태로 두면 샤드의 균형이 맞지 않아 클러스터 성능이 저하될 수 있습니다. 필요한 경우에만 밸런서 를 비활성화하고, 유지 관리가 완료되면 밸런서 를 다시 활성화해야 합니다.

기본적으로 밸런서는 언제든지 실행할 수 있으며 필요에 따라 청크만 이동합니다. 짧은 기간 동안 밸런서를 비활성화하고 모든 마이그레이션을 방지하려면 다음 절차를 따르십시오.

  1. mongosh 셸을 사용하여 클러스터의 모든 mongos에 연결합니다.

  2. 밸런서를 비활성화하려면 다음 작업을 실행합니다:

    sh.stopBalancer()

    진행 중인 마이그레이션이 있다면, 시스템은 정지하기 전에 진행 중인 마이그레이션을 완료할 것입니다.

    MongoDB 6.0.3부터 자동 청크 분할이 수행되지 않습니다. 이는 밸런싱 정책 개선 때문입니다. 자동 분할 명령이 여전히 존재하지만 작업을 수행하지 않습니다.

    MongoDB 6.0.3 이전 버전에서 sh.stopBalancer()는 샤딩된 클러스터에 대한 자동 분할도 비활성화합니다.

  3. 밸런서가 시작되지 않는지 확인하려면 다음 명령을 실행합니다. 밸런서가 비활성화된 경우 false를 반환합니다.

    sh.getBalancerState()

    선택적으로, 비활성화 후 진행 중인 마이그레이션이 없는지 확인하려면 mongosh 셸에서 다음 작업을 실행합니다:

    use config
    while( sh.isBalancerRunning() ) {
    print("waiting...");
    sleep(1000);
    }

참고

드라이버에서 밸런서를 사용하지 않도록 설정하려면 다음과 같이 admin 데이터베이스에서 balancerStop 명령을 실행하세요:

db.adminCommand( { balancerStop: 1 } )

밸런서를 비활성화했다가 다시 활성화할 준비가 된 경우 이 절차를 따르세요:

  1. mongosh 셸을 사용하여 클러스터의 모든 mongos에 연결합니다.

  2. 밸런서를 활성화하려면 다음 작업 중 하나를 실행하세요:

    mongosh 셸에서 다음을 실행합니다.

    sh.startBalancer()

    참고

    드라이버에서 밸런서를 활성화하려면 다음과 같이 admin 데이터베이스에서 balancerStart 명령을 사용합니다:

    db.adminCommand( { balancerStart: 1 } )

    MongoDB 6.0.3부터 자동 청크 분할이 수행되지 않습니다. 이는 밸런싱 정책 개선 때문입니다. 자동 분할 명령이 여전히 존재하지만 작업을 수행하지 않습니다.

    MongoDB 6.0.3 이전 버전에서 sh.startBalancer()는 샤딩된 클러스터에 대한 자동 분할도 활성화합니다.

참고

밸런서를 비활성화하는 것은 mongodump를 호출하거나 특정 시간에 mongodump를 호출하는 작업을 예약하여 수동으로 백업을 수행할 때만 필요합니다.

조정된 백업 및 복원 프로세스를 사용할 때 밸런서를 사용하지 않도록 설정할 필요가 없습니다.

MongoDB가 백업 중에 청크를 마이그레이션하는 경우, 샤딩된 클러스터 의 일관성 없는 스냅샷을 얻을 수 있습니다.밸런서가 활성화되어 있는 동안에는 절대로 백업을 실행하지 마세요. 백업 작업 중에 밸런서가 비활성 상태인지 확인하려면:

밸런서가 밸런싱 작업 중간에 있을 때 밸런서를 끄면, 즉시 종료되지 않습니다.밸런서는 진행 중인 청크 이동을 완료한 후 모든 추가적인 밸런싱 작업을 중단합니다.

백업 작업을 시작하기 전에 밸런서가 활성화되어 있지 않은지 확인하세요. 다음 명령을 사용하여 밸런서가 활성 상태인지 확인할 수 있습니다.

!sh.getBalancerState() && !sh.isBalancerRunning()

백업 절차가 완료되면 밸런서 프로세스를 다시 활성화할 수 있습니다.

sh.disableBalancing() 메서드를 사용하여 특정 컬렉션에 대한 밸런싱을 비활성화할 수 있습니다.유지 관리 작업이나 비정형 워크로드(예: 데이터 수집 또는 데이터 내보내기 중)를 지원하기 위해 특정 컬렉션에 대해 밸런서를 비활성화할 수 있습니다.

컬렉션에서 밸런싱을 사용하지 않도록 설정하면 MongoDB는 진행 중인 마이그레이션을 중단하지 않습니다.

컬렉션에서 밸런싱을 비활성화하려면 mongosh 셸을 사용하여 mongos에 연결하고 sh.disableBalancing() 메서드를 호출합니다.

예를 들면 다음과 같습니다.

sh.disableBalancing("students.grades")

sh.disableBalancing() 메서드는 컬렉션의 전체 네임스페이스를 매개변수로 받습니다.

sh.enableBalancing() 메서드를 사용하여 특정 컬렉션에 대한 밸런싱을 활성화할 수 있습니다.

컬렉션에 대한 균형 조정을 활성화하면 MongoDB는 즉시 데이터 균형 조정을 시작하지 않습니다. 그러나 샤딩된 컬렉션의 데이터 균형이 맞지 않으면 MongoDB는 데이터를 보다 균등하게 배포하기 시작할 수 있습니다.

컬렉션에서 균형을 활성화하려면 mongosh shell을 사용하여 mongos에 연결하고 sh.enableBalancing() 메서드를 호출합니다.

예를 들면 다음과 같습니다.

sh.enableBalancing("students.grades")

sh.enableBalancing() 메서드는 컬렉션의 전체 네임스페이스를 매개변수로 받습니다.

컬렉션의 밸런싱이 활성화되었는지 또는 비활성화되었는지 확인하려면, 컬렉션의 네임스페이스에 대한 config 데이터베이스의 collections 컬렉션을 쿼리하고 noBalance 필드를 확인하세요.예를 들면 다음과 같습니다.

db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

이 작업은 null 오류, true, false, 또는 아무런 출력도 반환하지 않을 수 있습니다.

  • null 오류는 컬렉션 네임스페이스가 잘못되었음을 나타냅니다.

  • 결과가 true면 밸런싱이 비활성화되어 있습니다.

  • 결과가 false라면, 현재 밸런싱은 활성화되어 있지만 이전에는 해당 컬렉션을 위해 비활성화되었던 것입니다.이 컬렉션의 밸런싱은 다음에 밸런서가 실행될 때 시작됩니다.

  • 해당 작업에서 출력을 반환하지 않는다면, 현재 밸런싱이 활성화된 것이며 이전에 이 컬렉션에 대해 비활성화된 적이 없습니다. 이 컬렉션의 밸런싱은 다음에 밸런서가 실행될 때 시작됩니다.

sh.status()를 사용하여 밸런서가 활성화되었는지 확인할 수도 있습니다. currently-enabled 필드는 밸런서가 활성화되었는지 여부를 나타냅니다.

청크 마이그레이션 중에 _secondaryThrottle 값은 청크 내 다음 문서로 마이그레이션이 진행되는 시점을 결정합니다.

config.settings 컬렉션에서:

  • 밸런서에 대한 _secondaryThrottle 설정이 쓰기 고려로 설정되어 있으면 청크 마이그레이션 중 각 문서 이동은 다음 문서를 진행하기 전에 요청된 승인을 받아야 합니다.

  • _secondaryThrottle 설정이 설정되지 않은 경우 마이그레이션 프로세스는 보조 문서로의 복제를 기다리지 않고 대신 다음 문서를 계속 진행합니다.

    이는 WiredTiger의 기본 동작입니다.

_secondaryThrottle 설정을 변경하려면 mongos 인스턴스에 연결하여 config 데이터베이스settings 컬렉션에서 _secondaryThrottle 값을 직접 업데이트하세요. 예를 들어 mongos에 연결된 mongosh 셸에서 다음 명령을 실행합니다.

use config
db.settings.updateOne(
{ "_id" : "balancer" },
{ $set : { "_secondaryThrottle" : { "w": "majority" } } },
{ upsert : true }
)

_secondaryThrottle 설정을 변경한 효과는 즉시 나타나지 않을 수 있습니다. 즉각적인 효과를 얻으려면, 밸런서를 중지하고 다시 시작하여 선택한 _secondaryThrottle 값을 활성화하십시오.

청크 마이그레이션의 여러 단계 중 복제 동작에 대한 자세한 내용은 범위 마이그레이션 및 복제를 참조하세요.

  • moveRange 명령의 secondaryThrottlewriteConcern 옵션을 사용하여 명령 실행 중의 동작을 지정합니다.

  • moveChunk 명령의 _secondaryThrottlewriteConcern 옵션을 사용하여 명령 실행 중의 동작을 지정합니다.

자세한 내용은 moveRangemoveChunk를 참조하세요.

밸런서의 _waitForDelete 설정과 moveChunk 명령은 밸런서가 샤드에서 여러 청크를 마이그레이션하는 방식에 영향을 줍니다. 마찬가지로 밸런서의 _waitForDelete 설정과 moveRange 명령도 밸런서가 샤드에서 여러 청크를 마이그레이션하는 방식에도 영향을 줍니다. 기본적으로, 밸런서는 현재 진행 중인 마이그레이션의 삭제 단계가 완료되기를 기다리지 않고 다음 청크 마이그레이션을 시작합니다. 삭제 단계에서 다음 청크 마이그레이션의 시작을 차단 하도록 하려면 _waitForDelete 값을 true로 설정할 수 있습니다.

청크 마이그레이션에 대한 자세한 내용은 범위 마이그레이션을 참조하세요. 청크 마이그레이션 대기열 동작에 대한 자세한 내용은 비동기 범위 마이그레이션 정리를 참조하세요.

_waitForDelete은 일반적으로 내부 테스트 용도로 사용됩니다. 밸런서의 _waitForDelete 값을 변경하려면:

  1. mongos 인스턴스에 연결합니다.

  2. config 데이터베이스settings 컬렉션에서 _waitForDelete 값을 업데이트합니다. 예를 들면 다음과 같습니다.

    use config
    db.settings.updateOne(
    { "_id" : "balancer" },
    { $set : { "_waitForDelete" : true } },
    { upsert : true }
    )

true으로 설정한 후 기본 동작으로 되돌리려면 다음을 수행하세요.

  1. mongos 인스턴스에 연결합니다.

  2. config 데이터베이스settings 컬렉션에서 _waitForDelete 필드를 업데이트하거나 설정 해제합니다.

    use config
    db.settings.updateOne(
    { "_id" : "balancer", "_waitForDelete": true },
    { $unset : { "_waitForDelete" : "" } }
    )

기본적으로 범위 내 문서 수가 구성된 범위 크기를 평균 문서 크기로 나눈 결과의 2배를 초과하는 경우, MongoDB는 범위를 이동할 수 없습니다.

밸런서 설정 attemptToBalanceJumboChunkstrue로 지정하면 점보로 레이블이 지정되지 않은 한 밸런서가 이러한 큰 범위를 마이그레이션할 수 있습니다.

밸런서의 attemptToBalanceJumboChunks 설정을 설정하려면 mongos 인스턴스에 연결하여 config.settings 컬렉션을 직접 업데이트하세요. 예를 들어 mongos 인스턴스에 연결된 mongosh 셸에서 다음 명령을 실행합니다.

db.getSiblingDB("config").settings.updateOne(
{ _id: "balancer" },
{ $set: { attemptToBalanceJumboChunks : true } },
{ upsert: true }
)

이동하려는 범위에 jumbo 레이블이 지정된 경우 밸런서가 범위 마이그레이션을 시도하도록 수동으로 점보 플래그를 해제할 수 있습니다.

다음 중 하나를 사용하여 크기 제한(jumbo 라벨 유무에 관계없이)을 초과하는 범위를 수동으로 마이그레이션할 수도 있습니다.

그러나 moveRange 또는 moveChunk forceJumbo: true과 함께 실행하는 경우 마이그레이션 중에 컬렉션에 대한 쓰기 작업이 장시간 차단될 수 있습니다.

참고

샤드의 최대 저장소 크기 변경은 더 이상 사용되지 않습니다. MongoDB는 데이터 저장 방법을 관리하기 위해 WiredTiger 스토리지 엔진을 사용합니다. WiredTiger는 데이터를 압축하여 스토리지 사용을 최소화합니다. 자세한 내용은 압축을 참조하세요.

MongoDB 버전 6.1 이하에서는 maxSize 필드를 사용하여 샤딩된 클러스터에서 특정 샤드의 최대 스토리지 크기를 설정할 수 있습니다. config.shards 컬렉션에서 샤드와 관련된 구성 데이터를 찾을 수 있습니다.

버전 6.2부터 MongoDB는 addShard 명령에서 maxSize 필드를 제거합니다. 그 결과는 다음과 같습니다.

  • maxSize 필드와 함께 addShard를 실행하면 InvalidOptions 오류가 반환됩니다.

  • shards 컬렉션의 새 문서들은 더 이상 maxSize 필드를 포함하지 않습니다.

  • 기존의 maxSize 필드 항목은 모두 무시됩니다.

돌아가기

밸런서