복제본 세트 데이터 동기화
공유 데이터 세트 의 복사본을 최신 상태로 유지하려면 복제본 세트 의 세컨더리 멤버가 소스 멤버의 데이터를동기화 하거나 복제합니다. MongoDB 는 전체 데이터 세트로 새 멤버를 채우는 초기 동기화 와 전체 데이터 세트 데이터 세트 지속적인 변경 사항을 적용 하는 복제 , 두 가지 형태의 데이터 동기화를 사용합니다.
초기 동기화
초기 동기화는 복제본 세트의 소스 멤버에 있는 모든 데이터를 대상 멤버로 복사합니다. 소스 멤버 선택 기준에 대한 자세한 내용은 초기 동기화 소스 선택 을 참조하세요.
local
데이터베이스 는 초기 동기화 프로세스 에서 사용하는 oplog 데이터를 저장합니다. 대상 멤버의 local
데이터베이스 에 초기 동기화 프로세스 를 완료하는 데 필요한 oplog 데이터를 저장 수 있는 충분한 공간이 있는지 확인합니다.
참고
초기 동기화 중에 MongoDB는 대상 멤버의 oplog를 잘라냅니다. 이러한 oplog 잘림은 oplog 데이터에 의존하는 변경 스트림과 같은 프로세스에 영향을 미칠 수 있습니다.
initialSyncSourceReadPreference
파라미터를 사용하여 선호하는 초기 동기화 소스를 지정할 수 있습니다. 이 매개변수는 mongod
을(를) 시작할 때만 지정할 수 있습니다.
MongoDB 5.2부터 초기 동기화는 논리적 동기화 또는 파일 복사 기반 동기화 중 하나를 선택할 수 있습니다.
논리적 초기 동기화 프로세스
논리적 초기 동기화를 수행하면 MongoDB는 다음을 수행합니다.
로컬 데이터베이스 를 제외한 모든 데이터베이스를 복제합니다. 복제하려면
mongod
가 각 소스 멤버 데이터베이스 의 모든 컬렉션 을 스캔하고 모든 데이터를 이러한 컬렉션의 자체 복사본에 삽입합니다.각 컬렉션에 대해 문서가 복사될 때 모든 컬렉션의 인덱스를 빌드합니다.
데이터 복사 중에 새로 추가된 oplog 레코드를 가져옵니다. 대상 멤버의
local
데이터베이스 에 이 데이터 복사 단계 동안 이러한 oplog 레코드를 임시로 저장 수 있는 충분한 디스크 공간이 있는지 확인합니다.데이터 세트에 모든 변경 사항을 적용합니다.
mongod
는 소스 멤버의 oplog를 사용하여 복제본 세트의 현재 상태를 반영하도록 데이터 세트를 업데이트합니다.
초기 동기화가 완료되면 노드가 STARTUP2
상태에서 SECONDARY
로전환됩니다.
초기 동기화를 수행하려면 자체 관리형 복제본 세트의 멤버 재동기화를 참조하세요.
파일 복사본 기반 초기 동기화
MongoDB Enterprise에서만 사용할 수 있습니다.
파일 복사 기반 초기 동기화는 파일 시스템에서 파일을 복사 및 이동하여 초기 동기화 프로세스를 실행합니다. 이 동기화 방법은 논리적 초기 동기화보다 빠를 수 있습니다.
중요
파일 복사본 기반 초기 동기화로 인해 부정확한 카운트가 발생할 수 있습니다.
파일 복사 기반 초기 동기화가 완료된 후 쿼리 조건자 없이 count()
메서드를 실행하면 반환되는 문서 수가 정확하지 않을 수 있습니다.
쿼리 조건자가 없는 count
메서드는 다음과 같이 보입니다: db.<collection>.count()
.
자세히 알아보려면 쿼리 조건자(predicate)가 없는 부정확한 카운트를참조하세요.
파일 복사본 기반 초기 동기화 활성화
파일 복사 기반 초기 동기화를 활성화하려면, 초기 동기화 대상 노드에서 initialSyncMethod
매개 변수를 fileCopyBased
로 설정합니다. 이 매개변수는 시작 단계에서만 설정할 수 있습니다:
행동
파일 복사 기반 초기 동기화 는 동기화 시 대상 멤버의 local
데이터베이스 를 소스 멤버의 local
데이터베이스 로 대체합니다.
제한 사항
파일 복사 기반 초기 동기화 중입니다:
소스 멤버나 대상 멤버 모두에서 백업을 실행할 수 없습니다.
대상 멤버의
local
데이터베이스에는 쓸 수 없습니다.
초기 동기화 는 한 번에 하나의 소스 멤버에서만 실행 수 있습니다.
암호화됨 스토리지 엔진 을 사용할 때 MongoDB 는 소스 멤버 키를 사용하여 대상을 암호화합니다.
NVMe 클러스터의 초기 동기화
Atlas 자동 확장을 사용하는 경우를 포함하여 로컬 NVMe(Non-Volatile Memory Express) SSD 저장 옵션을 사용하는 클러스터에서 초기 동기화를 수행해야 합니다. Atlas NVMe 클러스터는 저장 공간의 90%가 가득 차면 다음 상위 계층으로 자동 확장됩니다. 초기 동기화는 후속 동기화에 비해 완료하는 데 시간이 더 오래 걸리고 데이터를 읽는 프라이머리 동기화의 성능이 저하됩니다.
내결함성
초기 동기화 를 수행하는 대상 구성원이 동기화 프로세스 중에 지속적인 네트워크 오류가 발생하면 대상 구성원은 초기 동기화 프로세스 를 처음부터 다시 시작합니다.
초기 동기화를 수행하는 대상 노드는 일시적인 네트워크 오류, 컬렉션 제거 또는 컬렉션 이름 변경으로 인해 동기화 프로세스가 중단된 경우 다시 동기화를 시도할 수 있습니다.
기본값 대상 멤버는 24 시간 동안 초기 동기화 를 재개하려고 시도합니다. initialSyncTransientErrorRetryPeriodSeconds
서버 매개 변수를 사용하여 대상 멤버가 초기 동기화 를 재개하려고 시도하는 시간을 제어할 수 있습니다. 대상 구성원이 구성된 기간 동안 초기 동기화 프로세스 를 성공적으로 재개할 수 없는 경우 복제본 세트 에서 새로운 정상 소스 구성원을 선택하고 초기 동기화 프로세스 를 처음부터 다시 시작합니다.
세컨더리는 치명적인 오류를 반환하기 전에 최대 10
번까지 초기 동기화를 다시 시작하려고 시도합니다.
초기 동기화 소스 선택
초기 동기화 소스 선택은 mongod
스타트업 매개 변수 initialSyncSourceReadPreference
의 값에 따라 달라집니다.
로 설정하다
initialSyncSourceReadPreference
primary
chainingAllowed
의 경우( 가 비활성화된 경우 기본값 ), 프라이머리 를 소스 멤버로 선택합니다. 프라이머리 를 사용할 수 없거나 연결할 수 없는 경우 오류를 로그 하고 주기적으로 프라이머리 가용성을 확인합니다.로 설정하다 의 경우(투표하는
initialSyncSourceReadPreference
복제본 세트 멤버의primaryPreferred
기본값 ), 프라이머리 를 소스 멤버로 선택하려고 시도합니다. 프라이머리 를 사용할 수 없거나 연결할 수 없는 경우 나머지 복제본 세트 멤버 중에서 동기화 소스 멤버를 선택합니다.지원되는 다른 모든 읽기 모드의 경우 대상 멤버에서 동기화 소스 멤버 선택을 수행합니다.
초기 소스 멤버 선택을 수행하는 멤버는 모든 복제본 세트 멤버 목록을 두 번 통과합니다.
멤버는 초기 소스 멤버를 선택하기 위한 첫 번째 패스를 만들 때 각 복제본 세트 멤버에 다음 기준을 적용합니다.
소스 멤버는 온라인 이고 연결할 수 있어야 합니다 .
initialSyncSourceReadPreference
가secondary
또는 인 경우 소스secondaryPreferred
멤버는 세컨더리 여야 합니다 .소스 멤버가
visible
되어야 합니다.소스 멤버는 프라이머리의 최신 oplog 항목으로부터
30
초 이내에 있어야 합니다.builds indexes
멤버인 경우 소스 멤버는 인덱스를 빌드 해야 합니다.votes
멤버가 복제본 세트 투표에 참여하는 경우 소스 멤버도 투표 해야 합니다 .멤버가 이
delayed member
아닌 경우 소스 멤버가 지연 되지 않아야 합니다.멤버 가
delayed member
인 경우 소스 멤버의 구성된 지연이 더 짧아야 합니다.소스 멤버는 현재 최상의 동기화 소스보다 빨라야 합니다 .
첫 번째 전달 후에도 후보 소스 멤버가 남아 있지 않으면 해당 멤버는 완화된 기준으로 두 번째 전달을 수행합니다. Sync Source Selection (Second Pass) 을(를) 참조하세요.
멤버는 초기 소스 멤버를 선택하기 위해 두 번째 단계를 수행할 때 각 복제본 세트 멤버에 다음 기준을 적용합니다.
소스 멤버는 온라인 이고 연결할 수 있어야 합니다 .
initialSyncSourceReadPreference
secondary
가 인 경우 소스 멤버는 세컨더리 여야 합니다 .builds indexes
멤버인 경우 소스 멤버는 인덱스를 빌드 해야 합니다.소스 멤버는 현재 최상의 동기화 소스보다 빨라야 합니다 .
대상 멤버가 두 번의 패스 후에도 소스 멤버를 선택할 수 없는 경우 오류를 기록하고 1
초간 기다린 후 선택 프로세스를 다시 시작합니다. 세컨더리 mongod
는 오류로 종료되기 전에 초기 동기화 소스 선택 프로세스를 최대 10
번 다시 시작할 수 있습니다.
Oplog 윈도우 (oplog window)
oplog window 는 대상 멤버가 논리적 초기 동기화 프로세스 의 시작과 끝 사이에 발생하는 새 oplog 항목을 가져올 수 있을 만큼 충분히 길어야 합니다. 창 이 충분히 길지 않은 경우 대상 멤버가 항목을 적용 하기 전에 일부 항목이 oplog
에서 떨어질 위험이 있습니다.
새 oplog
항목을 가져올 수 있도록 oplog
의 크기를 넉넉하게 설정하는 것이 좋습니다. 이는 초기 동기화 동안 발생할 수 있는 변경사항에 대비하는 것입니다.
자세한 내용은 Oplog 크기를 참조하세요.
복제
대상 멤버는 초기 동기화 후 지속적으로 데이터를 복제합니다. 대상 멤버는 소스 멤버로부터 oplog 를 복사하고 비동기 프로세스 에서 이러한 작업을 적용 합니다.
대상 멤버는 다른 멤버의 핑 시간 및 복제 상태 의 변화에 따라 필요에 따라 소스 멤버를 자동으로 변경합니다. 소스 멤버 선택 기준에 대한 자세한 내용은 복제 동기화 소스 선택 을 참조하세요.
스트리밍 복제
소스 멤버는 대상 멤버에게 지속적인 oplog 항목 스트림 을 보냅니다. 스트리밍 복제 는 부하가 높고 지연 시간이 긴 네트워크에서 복제 지연 을 완화합니다. 또한 다음을 수행합니다.
보조 데이터에서 읽은 데이터의 부실함을 감소.
프라이머리 페일오버로 인해 w: 1 설정으로 쓰기 작업이 손실될 위험이 줄어듭니다.
w: "majority"
및 w: >1(즉, 복제를 기다려야 하는 모든 쓰기 고려)을 사용한 쓰기 작업의 지연 시간을 줄입니다.
스트리밍 복제 를 비활성화하고 이전 복제 동작을 사용하려면 oplogFetcherUsesExhaust
스타트업 매개변수를 사용합니다. 소스 멤버에 대한 리소스 제약이 있거나 복제 를 위한 MongoDB의 네트워크 대역폭 사용을 제한하려는 경우에만 oplogFetcherUsesExhaust
매개변수를 false
로 설정합니다.
멀티스레드 복제
MongoDB는 동시성을 향상시키기 위해 여러 스레드를 사용하여 쓰기 작업을 배치로 적용합니다. MongoDB는 문서 ID(WiredTiger)를 기준으로 배치를 그룹화하고, 다른 스레드를 사용하여 각 작업 그룹을 동시에 적용합니다. MongoDB는 항상 특정 문서에 대한 쓰기 작업을 원래 쓰기 순서대로 적용합니다.
읽기 작업이 세컨더리를 대상으로 하고 "local"
또는 "majority"
의 읽기 고려 수준으로 구성된 경우, 복제 배치가 적용되는 세컨더리에 읽기가 수행될 때 데이터의 WiredTiger 스냅샷에서 읽습니다.
스냅샷에서 읽기는 데이터의 일관된 뷰를 보장하고, 잠금 없이 진행 중인 복제와 동시에 읽기를 수행할 수 있도록 합니다. 결과적으로, 이러한 읽기 고려 수준이 필요한 보조 읽기는 더 이상 복제 배치가 적용될 때까지 기다릴 필요 없이 수신되는 대로 처리될 수 있습니다.
흐름 제어
관리자는 majority
committed
지연을 구성 가능한 최댓값 flowControlTargetLagSeconds
이하로 유지하는 것을 목표로 프라이머리가 쓰기를 적용하는 속도를 제한할 수 있습니다.
기본적으로 흐름 제어는 enabled
입니다.
참고
흐름 제어가 작동하려면 복제본 세트/샤딩된 클러스터에 4.2
의 featureCompatibilityVersion(fCV) 과 majority enabled
의 읽기 우려 사항이 있어야 합니다. 즉, fCV가 4.2
가 아니거나 읽기 문제 과반수가 비활성화된 경우 활성화된 흐름 제어는 효과가 없습니다.
자세한 내용은 흐름 제어를 참조하세요.
복제 동기화 소스 선택
복제 소스 멤버 선택은 복제본 세트 chaining
설정에 따라 달라집니다.
체인이 활성화된 상태(기본값)에서 대상 멤버에서 소스 멤버 선택을 수행합니다.
체인을 사용하지 않도록 설정한 상태에서 프라이머리를 소스 노드로 선택합니다. 프라이머리를 사용할 수 없거나 연결할 수 없는 경우 오류를 로깅하고 정기적으로 프라이머리 가용성을 확인합니다.
복제 소스 멤버 선택을 수행하는 멤버는 모든 복제본 세트 멤버 목록을 두 번 통과합니다.
멤버는 소스 멤버를 선택하기 위한 첫 번째 전달을 만들 때 각 복제본 세트 멤버에 다음 기준을 적용합니다.
소스 멤버는 온라인 이고 연결할 수 있어야 합니다 .
소스 멤버는 해당 멤버보다 최신 oplog 항목을 가지고 있어야 합니다 . 즉, 소스 멤버가 멤버 보다 앞에 있어야 합니다.
소스 멤버가
visible
되어야 합니다.소스 멤버는 프라이머리의 최신 oplog 항목으로부터
30
초 이내에 있어야 합니다.builds indexes
멤버인 경우 소스 멤버는 인덱스를 빌드 해야 합니다.votes
멤버가 복제본 세트 투표에 참여하는 경우 소스 멤버도 투표 해야 합니다 .멤버가 이
delayed member
아닌 경우 소스 멤버가 지연 되지 않아야 합니다.멤버 가
delayed member
인 경우 소스 멤버의 구성된 지연이 더 짧아야 합니다.소스 멤버는 현재 최상의 동기화 소스보다 빨라야 합니다 .
첫 번째 전달 이후에 후보 소스 멤버가 남아 있지 않으면 멤버는 완화된 기준으로 두 번째 전달을 수행합니다. Sync Source Selection (Second Pass) 을(를) 참조하세요.
멤버는 소스 멤버를 선택하기 위해 두 번째 단계를 수행할 때 각 복제본 세트 멤버에 다음 기준을 적용합니다.
소스 멤버는 온라인 이고 연결할 수 있어야 합니다 .
builds indexes
멤버인 경우 소스 멤버는 인덱스를 빌드 해야 합니다.소스 멤버는 현재 최상의 동기화 소스보다 빨라야 합니다 .
두 번 통과한 후에도 멤버가 동기화 소스를 선택할 수 없는 경우 오류를 로깅하고 1
초를 기다린 후 선택 프로세스를 다시 시작합니다.
시간당 소스 멤버를 변경할 수 있는 횟수는 maxNumSyncSourceChangesPerHour
매개 변수를 설정하여 구성할 수 있습니다.
참고
초기 동기화 소스 멤버를 선택할 때 스타트업 매개변수 initialSyncSourceReadPreference
가 복제본 세트의 settings.chainingAllowed
설정보다 우선합니다. 복제본 세트 멤버가 초기 동기화 를 성공적으로 수행한 후에는 소스 멤버를 선택할 때 chainingAllowed
값을 사용합니다.
초기 동기화 소스 선택에 대한 자세한 내용은 초기 동기화 소스 선택을 참조하세요.