복제본 세트에 롤링 인덱스 빌드 만들기
이 작업에 대하여
롤링 인덱스 빌드는 기본값 인덱스 빌드의 대안입니다.
배포서버 다음 사례 중 하나와 일치하는 경우에만 롤링 인덱스 빌드 사용하세요.
평균 CPU 사용률이 (N-1)/N-10%를 초과하는 경우, 여기서 N은 mongod 에서 사용할 수 있는 CPU 스레드 수입니다.
WiredTiger 캐시 채우기 비율이 정기적으로 90%를 초과하는 경우
참고
배포서버 이 기준을 충족하지 않는 경우 기본값 인덱스 빌드 사용합니다.
팁
Atlas 사용하면 기존 인덱스 빌드 에 대한 요구 사항을 충족하도록 클러스터 일시적으로 확장하다 할 수 있습니다. 그러나 Atlas 클러스터 확장하다 에 대해 요금을 부과합니다. 자세한 내용은 클러스터 구성 비용 을 참조하세요.
고려 사항
Unique Indexes
다음 절차를 사용하여 고유 인덱스를 만들려면 이 절차 중에 컬렉션에 대한 모든 쓰기를 중지해야 합니다.
이 절차가 진행되는 동안 컬렉션의 모든 쓰기 작업을 중단할 수 없는 경우, 해당 페이지에 이 절차를 수행하지 않습니다. 대신 복제본 세트의 프라이머리에 db.collection.createIndex()
를 발행하여 컬렉션에 고유한 인덱스를 빌드합니다.
Oplog 크기
너무 뒤쳐져 뒤쳐지지 않으면서 인덱싱 또는 재인덱싱 작업을 완료할 수 있을 만큼 Oplog가 충분히 커야 합니다. 자세한 내용은 Oplog 크기 조정 문서를 참조하세요.
전제 조건
- 고유 인덱스 구축용
다음 절차를 사용하여 고유 인덱스를 만들려면 인덱스 빌드 중에 컬렉션에 대한 모든 쓰기를 중지해야 합니다. 그렇지 않으면 복제본 세트 구성원 간에 데이터가 일관되지 않을 수 있습니다.
경고
컬렉션에 대한 모든 쓰기를 중지할 수 없는 경우 다음 절차를 사용하여 고유 인덱스를 생성하지 마십시오.
절차
중요
롤링 방식으로 인덱스를 빌드 다음 절차는 샤딩된 클러스터가 아닌 복제본 세트 배포에 적용됩니다. 샤딩된 클러스터에 대한 절차는 샤드 클러스터에서 롤링 인덱스 빌드 생성하기를 참조하세요.
1. 하나의 세컨더리를 숨기고 다시 시작합니다.
프라이머리 노드 에서 다음 명령을 실행하여 새 인덱스 빌드 할 세컨더리 를 숨깁니다.
이 예시 에서 새 인덱스 빌드 할 세컨더리 cfg.members
의 세 번째 노드 입니다.
var cfg = rs.conf(); // Record originalPriority so that you can reset it later. var originalPriority = cfg.members[2].priority; cfg.members[2].priority = 0; cfg.members[2].hidden = 1; rs.reconfig(cfg);
2. 하나의 세컨더리를 중지하고 독립형으로 다시 시작합니다.
세컨더리와 관련된 mongod
프로세스를 중지합니다. 다음 구성을 업데이트한 후 다시 시작합니다.
구성 파일을 사용하는 경우 다음 구성 업데이트를 수행합니다.
replication.replSetName
옵션을 코멘트합니다.setParameter
섹션에서 파라미터
disableLogicalSessionCacheRefresh
를true
로 설정합니다.
예를 들어 복제본 세트 멤버의 업데이트된 설정 파일에는 다음 예와 같은 콘텐츠가 포함됩니다.
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27217 # port: 27017 #replication: # replSetName: myRepl setParameter: disableLogicalSessionCacheRefresh: true
기타 설정 (예: storage.dbPath
등)은 동일하게 유지합니다.
그리고 다시 시작합니다:
mongod --config <path/To/ConfigFile>
명령줄 옵션을 사용하는 경우 다음과 같이 구성을 업데이트합니다.
--setParameter
옵션에서 매개 변수
disableLogicalSessionCacheRefresh
를true
로 설정합니다.
예를 들어 복제본 세트 멤버가 일반적으로 기본 포트인 27017
및 --replSet
옵션에서 실행되는 경우 다른 포트를 지정하고 --replSet
옵션을 생략하고 disableLogicalSessionCacheRefresh
매개변수를 true로 설정합니다.
mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true
기타 설정 (예: --dbpath
등)은 동일하게 유지합니다.
[1] | (1, 2) 다른 포트에서 mongod 를 실행하면 인덱스를 구축하는 동안 복제본 세트의 다른 구성원과 모든 클라이언트가 해당 구성원과 접촉하지 않도록 합니다. |
3. 인덱스를 빌드합니다.
새 포트에서 독립 실행형으로 실행 중인 mongod
인스턴스에 직접 연결하고 이 인스턴스에 대한 새 인덱스를 만듭니다.
예를 들어 mongosh
(을)를 인스턴스에 연결하고, createIndex()
(을)를 사용하여 records
컬렉션의 username
필드에 오름차순 인덱스를 생성합니다.
db.records.createIndex( { username: 1 } )
4. mongod
프로그램을 복제본 세트 멤버로 다시 시작합니다.
인덱스 빌드 완료되면 인스턴스 mongod
종료합니다. 노드 원래 구성으로 되돌리려면 노드 독립형 으로 시작할 때 구성 변경 사항을 실행 취소합니다. 그런 다음 복제본 세트 의 멤버로 노드 다시 시작합니다.
중요
반드시 disableLogicalSessionCacheRefresh
매개 변수를 제거합니다.
예를 들어 복제본 세트 구성원을 다시 시작하려면 다음을 수행합니다.
구성 파일을 사용하는 경우:
원래 포트 번호로 되돌립니다.
replication.replSetName
코멘트를 삭제합니다.
setParameter
섹션에서 매개변수
disableLogicalSessionCacheRefresh
를 제거합니다.
예를 들면 다음과 같습니다.
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27017 replication: replSetName: myRepl
기타 설정 (예: storage.dbPath
등)은 동일하게 유지합니다.
그리고 다시 시작합니다:
mongod --config <path/To/ConfigFile>
중요
다음 단계를 시작하기 전에 복제 이 멤버를 따라잡을 수 있도록 허용합니다.
5. 세컨더리 숨기기를 해제합니다.
프라이머리 에서 다음 명령을 실행하여 인덱스 를 구축한 세컨더리 노드 숨기기를 해제합니다. 이 예시 에서 인덱스 를 구축한 세컨더리 노드 cfg.members
의 세 번째 노드 입니다.
var cfg = rs.conf(); cfg.members[2].priority = originalPriority; cfg.members[2].hidden = false; rs.reconfig(cfg);
6. 나머지 세컨더리에 대해 이 절차를 반복합니다.
구성원이 세트의 다른 구성원을 따라잡으면 나머지 세컨더리 구성원에 대해 한 번에 한 구성원씩 절차를 반복합니다.
7. 프라이머리에서 인덱스를 빌드합니다.
모든 세컨더리에 새 인덱스가 있으면 프라이머리를 강등하고 위에서 설명한 절차에 따라 독립형으로 다시 시작한 다음 이전 프라이머리에 인덱스를 빌드합니다.
rs.stepDown()
에서mongosh
메서드를 사용하여 기본값을 내릴 수 있습니다. 단계적 하향에 성공하면 현재 프라이머리이 세컨더리가 되고 복제 세트 구성원은 새 프라이머리를 선택합니다.