몽고 DB 복제본 세트가 RECOVERING 상태에서 멈춤


14

우리는 복제 세트를 만들었고 이제 문제는 복제 세트의 두 멤버 [3 멤버 세트]가 48 시간에서 복구 모드에 있다는 것입니다. 처음에는 복구 노드의 크기가 증가했으며 이제는 중지되었습니다. 따라서 노드를 복구 할 때 60GB 이상의 로컬 데이터가있는 90GB의 데이터 뒤에 붙어 있습니다.

이 모드에서 나오는 방법?

답변:


13

조금 안전하지 않은 쉬운 방법이지만

  1. 첫 번째 보조 중지
  2. 그것의 내용을 삭제 dbpath
  3. 보조를 다시 시작하십시오
  4. 그것이 기본을 따라 잡기를 기다립니다
  5. 두 번째 보조와 프로세스를 반복

보조가 복구 중 상태가 된 이유를 알 수 없으므로 약간 안전하지 않습니다.

더 안전하지만 더 관입적인 방법

위와 같지만 프로세스 중에 응용 프로그램을 중지하십시오. 이렇게하면 응용 프로그램이 보조에서 복제 할 수있는 것보다 많은 데이터를 삽입 할 가능성이 없습니다. 그러나 생산 중에 문제가 발생할 수 있습니다.

가장 안전하지만 가장 방해가되는 방법

  1. 전체 복제 세트를 종료하십시오
  2. 의 내용 dbpath모두 제거 보조
  3. 의 콘텐츠 dbpath를 두 보조 모두에 복사하십시오.dbpath
  4. 이전 기본을 시작하십시오.
  5. 이전 보조 도구 중 하나를 시작하십시오.
  6. 새로운 예비 선거가 선출 될 때까지 기다리십시오.
  7. 나머지 보조를 시작하십시오.

몇 가지 참고 사항 :

MMS를 사용하십시오 . 무료이며 쉽게 설정할 수 있으며 복제 세트에 대한 유용한 정보를 제공합니다. "복제 지연"값을 0으로 유지하고 복제 지연이 "복제 oplog 창"보다 크지 않도록 필요한 모든 수단을 취하십시오.

항상 1Gb 네트워크와 (미안한) RAM이 있는지 확인하십시오. 많을수록 좋습니다. 추가적인 경험 법칙 : RAM을 두 배로 늘리고 SSD를 사용하지 않는 것 (RAM이 합당한 한도 내에서 남아 있음)보다 RAM과 SSD의 절반을 차지합니다.

면책 조항 : 프로덕션 데이터를 다루기 전에 항상 백업하십시오.


1
현재로서는 복제본 세트에 보조 노드가 없습니다. 하나는 PRIMARY 모드이고 다른 하나는 RECOVERING 모드입니다.
Avinash Sahu

1
그러면 논리적 보조입니다. 과정은 동일합니다.
Markus W Mahlberg

Mongo 인스턴스를 여러 번 시작하고 다시 동기화하여 고정 크기 (~ 96gb)까지 데이터를 다른 노드에 복사 할 때마다 멈췄습니다. oplog 크기와 관련이 있습니까?
Avinash Sahu

1
oplog가 초기 재 동기화 동안 보유 할 수있는 것보다 많은 데이터를 삽입 할 때 재 동기화가 중지 될 수 있다는 사실을 제외하고는 실제로는 아닙니다. 이 경우 옵션 2 또는 3을 사용하십시오.
Markus W Mahlberg

1
이 비트를 더 설명해 주시겠습니까? "RAM과 SSD의 절반이 아닌 RAM과 SSD의 절반이 아닌 RAM이 합당한 한도 내에서 남아 있습니다."
Stephen Nguyen

1

보조의 새 dbpath에서 스크래치를 시작하더라도 복제 프로세스가 실패하므로 oplog에서 일부를 변경해야 합니다. oplog의 크기는 모든 응용 프로그램 쓰기를 처리 할 수 ​​있도록 최적의 값으로 설정해야합니다.

oplog 크기 늘리기 :

기본 서버 종료

use admin

db.shutdownServer()

기본으로 독립형으로 시작하고 다른 포트에서 실행 37017

포트 37017에서 몽고에 로그인

mongo --port 37017

로컬 데이터베이스에서 이전 내용 제거

안전을 위해 떨어 뜨리기 전에 오래된 oplog를 백업하십시오.

mongodump --db local --collection 'oplog.rs' --port 37017

로컬 데이터베이스에서 이전 내용을 삭제

use local

db.oplog.rs.drop()

db.me.drop()

db.replset.election.drop()

db.replset.minvalid.drop()

db.startup_log.drop()

Replset 모음은 삭제할 수 없으므로 필요한 ID로 제거하십시오.

db.system.replset.remove({ "_id" : "your_replsetname"})

필요한 크기가 50GB 인 새 oplog를 만듭니다.

db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )

또한 mongod.conf 파일에서 oplog 크기를 MB 단위로 지정할 수 있습니다 (예 : 50GB의 경우 429496MB).

replication:
   oplogSizeMB: 429496

도움이 되었기를 바랍니다 !!!

편집하다:

코멘트에서 Nicholas Tolley Cottrell이 언급했듯이. MongoDB 버전 3.6 에서는 재시작하지 않고 런타임에 oplog 크기를 변경할 수 있습니다.

현재 oplog 크기 확인

use local
db.oplog.rs.stats().maxSize

oplog 크기를 10GB로 변경하려면

db.adminCommand({replSetResizeOplog: 1, size: 10000})

1
위의 3.6은 구식입니다. 이제 컨텐츠를 삭제하거나 노드를 다시 시작하지 않고도 oplog의 크기를 조정할 수 있습니다. docs.mongodb.com/manual/tutorial/change-oplog-size
Nicholas Tolley Cottrell

1
@NicholasTolleyCottrell 그래, 나는 대답을 편집했다.
JERRY
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.