Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/

복제 지연 문제 해결

복제 지연으로 인해 "지연된" 멤버가 신속하게 프라이머리 멤버가 될 수 없게 되고 분산된 읽기 작업이 일관되지 않을 가능성이 커집니다.

이 페이지에는 복제 지연 줄일 수 있는 몇 가지 팁이 포함되어 있지만 대부분의 경우 에스컬레이션이 필요할 수 있습니다. 복제 지연 의 원인을 파악할 수 없거나 추가 지원 필요한 경우 기술 지원팀 문의 .

배포서버 에서 복제 지연 의 현재 길이를 확인하려면 다음을 수행합니다.

  • mongosh 프라이머리 에 연결된 세션에서 메서드를 호출하여 프라이머리 호스팅하다 기준으로 각 세컨더리 의 현재 지연을 rs.printSecondaryReplicationInfo() 표시합니다.

    각 멤버에 대한 syncedTo 값을 반환합니다. 이 값은 다음 예제와 같이 마지막 oplog 항목이 세컨더리 멤버에 기록된 시간을 보여줍니다.

    source: m1.example.net:27017
    syncedTo: Thu Apr 10 2014 10:27:47 GMT-0400 (EDT)
    7230 secs (2 hrs) behind the primary
    source: m2.example.net:27017
    syncedTo: Thu Apr 10 2014 10:27:47 GMT-0400 (EDT)
    0 secs (0 hrs) behind the primary

    프라이머리 보다 뒤쳐진 시간(초)은 세컨더리 프라이머리 보다 얼마나 뒤처져 있는지를 알려줍니다.

    프라이머리 멤버의 비활성 기간이 members[n].secondaryDelaySecs 값보다 큰 경우 지연된 멤버는 프라이머리 멤버보다 0초 뒤처진 것으로 표시될 수 있습니다.

  • Atlas 배포서버에서는 Cloud ManagerOps Manager 에서 사용할 수 있는 Replication Lag 그래프 에서 0이 아니거나 증가하는 oplog 시간 값을 확인하여 Atlas 배포서버의 복제 속도를 모니터 .

    또한 클러스터 의 지표 탭 Replication Lag 에서,, 를 확인하여 Atlas 의 복제 지연 모니터 할 수Oplog GB/Hour Replication Oplog Window 있습니다. 자세한 내용은 사용 가능한 지표 검토를 참조하세요.

복제 지연 에 대한 오류 코드는 없으며 원인을 즉시 확인할 수 있는 방법이 없습니다. 그러나 지원 으로 에스컬레이션하기 전에 다음 문제로 인해 지연이 발생할 수 있는지 확인하세요.

클러스터 노드가 서로 안정적으로 통신할 수 없는 경우 복제 지연이 빌드 수 있습니다.

복제본 세트 멤버 간의 네트워크 경로를 확인하여 패킷 손실이나 네트워크 라우팅 문제가 없는지 확인합니다.

등의 도구를 사용하여 설정하다 멤버 간의 지연 시간 테스트하고 ping 을(를) traceroute 사용하여 네트워크 엔드포인트 간의 패킷 라우팅을 노출합니다.

또는 를 실행 replSetGetStatus 하고 pingMs 필드 검사합니다. 그러면 프라이머리 와 세컨더리 노드 간의 현재 네트워크 지연 시간 (밀리초)이 반환됩니다.

세컨더리 노드는 프라이머리 로부터 들어오는 읽기 작업을 효율적으로 처리하다 할 수 없을 때 리소스 경합을 경험할 수 있습니다. 이로 인해 캐시 경합과 같은 메모리 문제가 발생할 수 있습니다. 캐시 중요 임계값에 도달하면 서버 애플리케이션 스레드를 사용하여 페이지를 제거하므로 복제 관리 에 사용할 수 있는 스레드 수가 줄어듭니다.

서버 애플리케이션 스레드를 제거 작업으로 리디렉션하는지 확인하려면 mongosh 셸 에서 다음 명령을 실행 .

db.serverStatus().wiredTiger.cache['pages evicted by application threads']
  • 결과 = 0 인 경우: 제거를 위해 일시 중지된 애플리케이션 스레드가 없습니다.

  • 결과 >(및0 증가)인 경우: 데이터베이스 가 캐시 압력을 받고 있습니다. 수신 쿼리는 실행되기 전에 캐시된 데이터를 제거해야 하므로 복제 지연 증가할 수 있습니다.

Atlas 사용자는 WiredTiger Cache ActivityPage Faults 지표 모니터 캐시 관련 문제를 조사할 수도 있습니다.

이 문제를 해결하기 위한 잠재적인 전략은 리소스 확장을 참조하세요.

세컨더리 노드 더티 데이터를 디스크에 충분히 빠르게 플러시할 수 없으면 프라이 프라이머리 보다 뒤처집니다. 이 현상은 프라이머리 에서 발생하는 쓰기 볼륨이 세컨더리 디스크의 쓰기 (write) 속도를 초과할 때 발생합니다.

디스크 관련 문제는 가상화된 인스턴스를 포함한 멀티 테넌트 시스템에 일반적으로 존재하며, 시스템이 IP 네트워크를 통해 디스크 장치에 액세스하는 경우 일시적일 수 있습니다.

디스크 상태를 평가하려면 iostat 또는 vmstat과 같은 시스템 수준 도구를 사용합니다.

Atlas 사용자는 Disk IOPS 및 와 같은 Atlas 지표 액세스 디스크 Disk Space Used 문제를 조사할 수 있습니다.

디스크 문제의 몇 가지 일반적인 원인은 다음과 같습니다.

  • 프로비저닝 부족: 세컨더리 프라이머리 보다 디스크 속도가 느리거나 IOPS가 낮습니다.

  • 가상화 오버헤드: 공유 환경에서는 다른 가상 머신이 물리적 디스크 컨트롤러를 포화시킬 수 있습니다.

디스크 문제에 대한 몇 가지 가능한 해결책은 다음과 같습니다.

경우에 따라 프라이머리에서 장기간 실행되는 작업으로 인해 세컨더리에서의 복제가 차단될 수 있습니다. 최적의 결과를 얻으려면 쓰기 고려를 구성하여 세컨더리로의 복제 확인이 필요하도록 설정할 수 있습니다. 이렇게 하면 복제가 쓰기 부하를 따라잡을 수 없는 경우 쓰기 작업이 반환되지 않습니다.

또한 데이터베이스 프로파일러 사용하여 관찰된 지연과 상관관계가 있는 느린 쿼리나 장기 실행 작업을 식별할 수 있습니다.

대량 쓰기 (write) 작업은 복제본 세트의 적시 복제 기능 초과하여 복제 지연 일으킬 수 있습니다.

다음 하위 섹션에서는 이 문제에 대한 가능한 해결책을 제공합니다.

CRUD 명령을 일괄 처리하고 필터링하여 부하를 제어합니다.

한 달, 주 또는 일과 같은 날짜 또는 시간 범위 에 대해 각 배치 실행합니다. 컬렉션 스캔을 피하기 위해 쿼리 필터가 인덱스 사용하는지 확인합니다. 컬렉션 스캔은 작업 세트 에서 데이터와 인덱스 페이지를 제거하고 복제 지연 증가시킬 수 있습니다.

먼저 작은 날짜 범위를 삭제합니다. 이러한 작업이 몇 초 안에 완료되면 배치 크기를 늘립니다. 로 복제 지연 rs.printSecondaryReplicationInfo() 모니터링합니다. 처리량 과 복제 지연 간의 균형에 도달할 때까지 배치 크기를 늘립니다. 시스템 부하, 다른 사용자 및 애플리케이션에 영향 , 세컨더리가 지연되는 정도를 계속 모니터 합니다.

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

db.collName.deleteMany({createdDate: {$gte: new Date("2018-12-01"), $lt: new Date("2019-01-01")}});
db.collName.deleteMany({createdDate: {$gte: new Date("2018-11-01"), $lt: new Date("2018-12-01")}});
db.collName.deleteMany({createdDate: {$gte: new Date("2018-10-01"), $lt: new Date("2018-11-01")}});

MongoDB 쓰기 집약적인 작업 중에 리소스 사용량을 제어할 수 있는 다음과 같은 서버 측 설정 및 매개 변수를 제공합니다.

  • storageEngineConcurrentWriteTransactions: 이 값을 낮추면 다른 쓰기 (write) 작업이 동시에 발생할 때 대량 삭제로 인해 발생하는 경합을 줄일 수 있습니다.

    참고

    를 수정할 storageEngineConcurrentWriteTransactions 때 설정을 변경하면 성능 문제나 오류가 발생할 수 있으므로 주의해야 합니다. 매개변수를 변경하기 전에 MongoDB 지원팀에 문의하는 것이 좋습니다.

  • maxTimeMS: 대량 쓰기 (write) 작업이 복잡한 경우 실행 시간을 제한하여 서버 성능에 영향을 미치는 장기 실행 작업을 방지할 수 있습니다. 복잡한 작업의 몇 가지 예로는 많은 문서를 일치시키거나 인덱싱되지 않은 필드를 기준으로 쿼리하는 경우가 있습니다.

대량 작업을 실행 필드 인덱싱되지 않은 경우 대량 작업으로 인해 컬렉션 또는 테이블 스캔이 발생하여 리소스 사용량이 증가할 수 있습니다. 더 빠른 삭제를 위해 쿼리 필터하다 에 사용된 필드 에 인덱스 있는지 확인하여 잠금 경합을 줄이고 성능을 개선합니다.

작업을 실행 전에 인덱스 만듭니다.

db.collection.createIndex({ status: 1 });

그런 다음 인덱싱된 필드 기준으로 삭제 .

db.collection.deleteMany({ status: "inactive" });

동기화 중인 데이터의 양에 비해 oplog window 너무 작으면 복제 지연 발생할 수 있습니다.oplog 가 클수록 복제본 세트 의 지연에 대한 허용 오차가 커질 수 있습니다.

지정된 복제본 세트 멤버에 대한 oplog 의 크기와 해당 작업의 날짜 범위를 확인하려면 의 멤버에 mongosh rs.printReplicationInfo() 연결하고 메서드를 실행 . oplog 세컨더리 에서 예상하는 가장 긴 다운타임 동안 모든 트랜잭션을 보유할 수 있을 만큼 길어야 합니다. []1 최소한 oplog 최소 시간의 작업을 보유할 수 있어야 24 합니다. 그러나 많은 사용자는 72 시간 또는 일주일 분량의 작업을 선호합니다.

참고

일반적으로 oplog는 모든 멤버에서 동일한 크기여야 합니다. oplog의 크기를 조정하는 경우 모든 멤버에서 크기를 조정하세요.

Oplog 크기를 변경하려면 자체 관리형 복제본 세트 멤버의 Oplog 크기 변경 튜토리얼을 참조하세요.

[1] 2}가 삭제되는 것을 방지하기 위해 oplog가 구성된 크기 제한을 초과하여 커질 수 majority commit point 있습니다.

문제가 해결되었는지 확인하려면 메서드를 호출하고 지연 멤버가 더 이상 없는지 rs.printSecondaryReplicationInfo() 확인합니다.

위의 해결 방법으로도 지연이 줄어들지 않으면 지원 문의 . 지원팀에서 문제를 추가로 진단하기 위해 진단을 요청할 수있습니다.

Atlas 사용자가 지원 위해 수집할 수 있는 몇 가지 유용한 진단은 다음과 같습니다.

  • 출력 rs.printSecondaryReplicationInfo()

  • 지연이 시작된 타임라인

  • 스키마, 인덱스, 애플리케이션, 계층 또는 hardware 에 대한 변경 사항과 같이 배포서버 에 대한 최근 변경 사항입니다.

돌아가기

복제본 세트 프라이머리 없음

이 페이지의 내용