Docs Menu
Docs Home
/
데이터베이스 매뉴얼
/

샤드 클러스터에서 장기 실행 보조 읽기

MongoDB 8.2 부터 청크 마이그레이션으로 인해 문서가 누락될 위험이 있는 경우 샤딩된 클러스터의 세컨더리 읽기가 자동으로 종료될 수 있습니다.

이 새로운 동작을 지원 위해 MongoDB 8.2 은 다음과 같은 변경 사항을 도입합니다.

  • terminateSecondaryReadsOnOrphanCleanup 매개변수를 추가합니다(기본값:). true

    참고

    를 로 설정하다 terminateSecondaryReadsOnOrphanCleanup false하면 서버 읽기를 종료하지 않고 청크 마이그레이션으로 인해 샤딩된 컬렉션의 문서를 놓칠 수 있습니다. 이는 MongoDB 이전 버전의 기본값 동작입니다. 자세한 8.1 학습 은 보조 읽기 종료 비활성화를 참조하세요.

  • orphanCleanupDelaySecs 기본값 을 900 초에서 3600 초(1 시간)로 증가시킵니다.

기본값 으로 샤딩된 클러스터 청크 마이그레이션 커밋될 때 다음 작업을 수행합니다.

  1. 소스 샤드 다른 샤드 로 마이그레이션된 문서를 삭제 위해 고아 정리 프로세스 시작합니다.

    1. 샤드 프라이머리 에 대한 기존 읽기가 완료될 때까지 기다립니다.

    2. 샤드 추가로 orphanCleanupDelaySecs 초(기본값: 1 시간) 동안 대기합니다.

    3. 샤드 고아 문서를 삭제합니다.

  2. 세컨더리는 마이그레이션 완료되기 전에 시작된 읽기를 종료합니다.

  3. 세컨더리는 고아 문서 삭제를 복제합니다.

청크 마이그레이션 으로 인해 종료된 장기 실행 세컨더리 읽기의 수명 주기를 보여주는 다이어그램입니다.

고아 문서를 삭제하기 전에 세컨더리 읽기를 종료하면 장기 실행 세컨더리 읽기가 정리 프로세스 에서 삭제된 문서를 놓치는 일이 없습니다.

다음과 같은 방법으로 고아 정리로 인해 종료된 세컨더리 읽기를 모니터 할 수 있습니다.

  • 다음 명령을 mongosh 사용하여 세컨더리 노드 의 서버 상태를 확인합니다.

    db.serverStatus().metrics.operation.killedDueToRangeDeletion

  • mongod 로그를 검토합니다. 종료될 때마다 다음 예시 와 같은 로그 항목이 생성됩니다.

{
"t": {
"$date": "2025-06-11T12:11:43.361+02:00"
},
"s": "I",
"c": "SHARDING",
"id": 10016300,
"svc": "S",
"ctx": "conn93",
"msg": "Read has been terminated due to orphan range cleanup",
"attr": {
"type": "command",
...
"workingMillis": 0,
"durationMillis": 0,
"orphanCleanupDelaySecs": 3600
}
}

애플리케이션 청크 1 마이그레이션을 수행하는 샤딩된 클러스터에서 시간을 초과하는 QueryPlanKilled 175 세컨더리 읽기를 수행하는 경우 종료된 읽기로 인해 오류(오류 코드 )가 발생할 수 있습니다.

장기 실행 세컨더리 읽기를 관리 데 권장되는 방법은 애플리케이션 에 재개 메커니즘을 구현 입니다.

다음과 같은 대체 전략을 사용하여 장기 실행 세컨더리 읽기를 관리 할 수도 있습니다.

재개 메커니즘을 사용하면 애플리케이션 이전 읽기 작업이 종료되는 지점에서 시작되는 새 읽기 작업을 생성할 수 있습니다.

효과적인 재개 메커니즘을 구현 하려면 애플리케이션 쿼리 결과에 대해 일관적인 정렬 순서를 사용해야 합니다. 이력서 메커니즘의 정렬 순서를 선택할 때 다음 요소를 고려하세요.

  • 효율적인 쿼리 실행을 위해 정렬 작업은 인덱싱된 필드 활용해야 합니다.

  • 정렬 필드 에는 고유한 값이 포함되어야 합니다.

    • 정렬 필드 값이 고유하지 않은 경우 애플리케이션 동일한 정렬 값을 주식 문서를 처리하다 위해 추가 로직을 구현 해야 합니다.

다음 구조의 zipcodes 컬렉션 포함된 cities 데이터베이스 가정해 보겠습니다.

{
"state": "NY",
"city": "NEW YORK",
"zipcode": "00501"
}

이 예시 에서는 zipcode 필드 값이 고유하다고 가정합니다.

다음 JavaScript 코드는 세컨더리 읽기 작업을 수행하여 stateNY 인 모든 문서를 조회 하고 QueryPlanKilled 오류를 처리하다 하는 재개 메커니즘을 구현합니다.

let readDoc;
let latestZip;
let cursor = db.getSiblingDB("cities").zipcodes.find({
state: "NY"
})
.sort({zipcode: 1})
.readPref("secondary");
while(cursor.hasNext()) {
try {
readDoc = cursor.next();
// process `readDoc` here
latestZip = readDoc.zipcode;
} catch (err) {
if (err.code === 175 &&
err.errmsg.includes("Read has been terminated due to orphan range cleanup")) {
console.log("Query terminated, resuming from zipcode:", latestZip);
cursor = db.getSiblingDB("cities").zipcodes.find({
state: "NY",
zipcode: {$gt: latestZip}
})
.sort({zipcode: 1})
.readPref("secondary");
} else {
throw err; // Rethrow non-termination errors
}
}
}

예시 데이터베이스 및 애플리케이션 로직을 검토할 때 다음 사항을 고려하세요.

  • 예시 코드는 zipcode을 기준으로 정렬하는 재개 메커니즘을 사용하여 QueryPlanKilled 오류를 처리합니다. zipcode 필드 에서 정렬하면 각 문서 에 대해 일관적인 순서와 고유한 정렬 값이 보장됩니다. 이를 통해 애플리케이션 읽기 작업이 종료된 지점에서 정확하게 다시 시작할 수 있습니다.

  • cities.zipcodes {state: 1, zipcode: 1} 컬렉션 재개 메커니즘 쿼리의 효율성 보장하기 위해 복합 인덱스 구현합니다. 이 복합 인덱스 구현하면 컬렉션 스캔과 인메모리 정렬이 모두 방지되고 필터하다 및 정렬 작업이 지원됩니다. 효과적인 인덱스를 만드는 방법에 대해 자세히 학습 ESR(동등성, 정렬, 범위) 가이드라인을 참조하세요.

  • QueryPlanKilled 오류(오류 코드 175)는 종료된 세컨더리 읽기 이외의 이유로 발생할 수 있습니다. QueryPlanKilled 오류를 정확하게 처리하다 하려면 errmsg 필드 구문 분석해야 합니다. MongoDB 세컨더리 읽기를 종료할 때 다음과 같은 오류 메시지를 반환합니다.

{
code: 175,
name: QueryPlanKilled,
categories: [CursorInvalidatedError],
errmsg: "Read has been terminated due to orphan range cleanup"
}
  • 애플리케이션 에 고아 QueryPlanKilled 범위 정리로 인해 오류가 발생하면 마지막으로 성공적으로 처리된 우편번호를 재개된 쿼리 의 점 으로 사용합니다.$gt 연산자 애플리케이션 중복 문서를 프로세스 하지 않도록 합니다.

테스트 환경에서 재개 메커니즘을 테스트하고 프로덕션 클러스터 모니터 하여 세컨더리 읽기가 종료되는 빈도를 파악합니다. 종료가 자주 발생하는 경우 쿼리 패턴을 조정하거나 대체 데이터 액세스 방식을 고려해야 할 수 있습니다. 이러한 오류에 대해 클러스터 모니터 방법을 학습 모니터링을 참조하세요.

서버 매개변수는 소스 샤드 에서 마이그레이션된 청크 삭제하기 전에 MongoDB 대기하는 orphanCleanupDelaySecs 시간을 제어합니다.

orphanCleanupDelaySecs 를 늘리면 세컨더리 읽기 작업을 더 오랜 시간 동안 실행 수 있습니다. 스타트업 과 런타임 모두에 orphanCleanupDelaySecs 를 설정하다 수 있습니다.

다음 명령은 orphanCleanupDelaySecs 시간을 2 시간으로 설정합니다.

db.adminCommand({
setParameter: 1,
orphanCleanupDelaySecs: 7200
})

중요

orphanCleanupDelaySecs 을 늘리면 고아 문서가 더 오랜 기간 동안 노드에 남아 있음을 의미합니다. 이 값을 늘리면 인덱스 사용하지만 샤드 키 포함하지 않는 쿼리 실행하면 쿼리 결과를 반환하기 전에 더 많은 고아 문서를 필터하다 해야 하므로 성능이 저하될 수 있습니다.

참고

MongoDB 8.1 이하 버전에서는 샤딩된 클러스터가 장기 실행 세컨더리 읽기를 자동으로 종료하지 않습니다. MongoDB 8.2 이상에서 이 동작을 일치시키려면 세컨더리 읽기 종료를 비활성화합니다.

terminateSecondaryReadsOnOrphanCleanup 서버 매개 변수는 고아 문서 삭제되기 전에 장기 세컨더리 읽기를 자동으로 종료할지 여부를 제어합니다.

terminateSecondaryReadsOnOrphanCleanupfalse로 설정하여 세컨더리 읽기 종료를 비활성화할 수 있습니다. 이 매개변수는 스타트업 또는 런타임에 설정하다 수 있습니다.

다음 명령은 terminateSecondaryReadsOnOrphanCleanupfalse로 설정합니다.

db.adminCommand({
setParameter: 1,
terminateSecondaryReadsOnOrphanCleanup: false
})

경고

이 기능 비활성화되어 있고 청크 마이그레이션이 대상 컬렉션 에 영향을 미치는 경우 세컨더리 읽기에서 모든 문서를 반환하지 못할 수 있습니다.

밸런서 비활성화하고 수동 마이그레이션을 수행하지 않으면 장기 실행 세컨더리 읽기가 자동으로 종료되는 것을 방지할 수 있습니다.

특정 컬렉션에 대한 밸런서 비활성화하려면 configureCollectionBalancing 명령의 enableBalancing 필드 사용합니다.

밸런서 작업을 특정 시간으로 제한하려면 밸런싱 기간 예약을 참조하세요.

경고

밸런서 장기간 비활성화하면 샤드의 균형이 맞지 않아 클러스터 성능이 저하될 수 있습니다. 사용 사례 에 필요한 경우에만 밸런서 비활성화합니다.

돌아가기

자동 합병

이 페이지의 내용