mongodb, 복제 및 오류 : { "$ err": "not master and slaveOk = false", "code": 13435}


174

몽고 복제 세트를 처음 시도했습니다.

ec2에서 우분투를 사용하고 있으며 세 개의 인스턴스를 부팅했습니다. 각 인스턴스의 프라이빗 IP 주소를 사용했습니다. 나는 기본으로 선택했고 아래는 코드입니다.

mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)

이 시점에서 괜찮습니다. http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet 사이트 로 이동 하면 기본, 보조 및 중재인이 있음을 알 수 있습니다.

자 이제 테스트를 해보자.

기본 데이터베이스에 다음 코드를 작성하십시오.

use tt
db.tt.save( { a : 123 } )

보조에서 다음을 수행하고 아래 오류가 발생합니다.

db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

나는 mongodb에 익숙하지 않고 복제하기도하지만 한 가지로 무언가를하면 다른쪽으로 갈 것이라고 생각했습니다. 따라서 레코드를 하나에 추가하면 여러 머신에 복제하려면 어떻게해야합니까?


rs.slaveOk ()를 사용해야한다는 것을 알았습니다. 그것은 또 다른 질문으로 남게됩니다. 모든 쿼리에 대해이 작업을 수행해야합니까? 마스터 노드에 있으면 어떻게합니까?

답변:


282

몽고 쉘이 2 차 읽기를 허용한다는 것을 알리기 위해 "슬레이브 양호"모드를 설정해야합니다. 이는 실수로 사용자와 응용 프로그램이 일관된 읽기를 수행하지 못하게하기위한 것입니다. 쉘에서 다음을 수행 할 수 있습니다.

rs.slaveOk()

그런 다음 보조에서 정상적으로 쿼리 할 수 ​​있습니다.

"최종 일관성"에 대한 참고 사항 : 정상적인 상황에서 복제 세트 보조는 1 초 이내에 기본과 동일한 데이터를 갖습니다. 로드가 매우 높으면 기본에 쓴 데이터가 보조에 복제하는 데 시간이 걸릴 수 있습니다. 이것을 "복제본 지연"이라고하며, 지연된 2 차에서 읽은 것을 "최종적으로 일관된"판독이라고합니다. 새로 작성된 데이터는 특정 시점 (네트워크 장애 제외 등)에 표시되지만 그렇지 않을 수도 있습니다. 즉시 사용 가능.

편집 : 보조에서 쿼리 할 때 슬레이브 세션을 설정해야하며 세션 당 한 번만 필요합니다.


3
DB에서 이해하지 못하는 명령을 실행하기 전에 항상 매뉴얼을 확인하십시오. 대답이 설명하지 않는 명령에 결과가있을 수 있습니다. 이 명령은 복제 세트에 대한 모든 연결에 대해 읽기 작업이 배포되는 방식을 변경합니까? 더 잘 알아봐 이 명령은 v2.2 docs.mongodb.com/v2.2/reference/method/rs.slaveOk 까지 다시 나타납니다 . docs.mongodb.com URL의 "/ manual /"부분을 항상 대체 할 수 있으며 대체해야합니다. 관련 정보를 얻고 있는지 확인하십시오.
Bruno Bronosky

45

rs.slaveOk()매번 입력하지 않으려면 다음을 수행하십시오.

replStart.js한 줄을 포함하는 이라는 파일을 만듭니다 .rs.slaveOk()

그런 다음 --shell replStart.jsMongo 쉘을 시작할 때 포함 하십시오. 물론 단일 인스턴스에 로컬로 연결하는 경우 입력 내용이 저장되지 않습니다.


26
타이핑을 저장하는 더 좋은 방법 rs.slaveOk()~/.mongorc.js파일 에 추가 하는 것입니다. mongo 셸을 시작할 때 자동으로 실행됩니다.
Stennie

2
나는 그것이 유용의 기본 구성을 넣어 찾을 수 ~/.mongorc.js와 사용자 정의 구성 replStart.js하거나 adminStart.js또는 무엇 이건.
Ed Norris

41

mongodb2.0에서

당신은 입력해야합니다

rs.slaveOk()

보조 mongod 노드에서


11

이것은 루비 드라이버를 사용하여이 문제를 다루는 사람을위한 참고 사항입니다.

Ruby Gem을 사용할 때도 이와 동일한 문제가있었습니다.

Ruby에서 slaveOk를 설정하려면 다음과 같이 클라이언트를 만들 때이를 인수로 전달하면됩니다.

mongo_client = MongoClient.new("localhost", 27017, { slave_ok: true })

https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection

mongo_client = MongoClient.new # (optional host/port args)

'args'는 세 번째 선택적 인수입니다.



1

DB 공급자의 어색한 상황에 대해이 답변을 추가하고 있습니다.

우리의 경우에 일어난 일은 기본 및 보조 db가 반대로 바뀌었고 (기본에서 보조로 또는 그 반대로), 같은 오류가 발생합니다.

따라서 데이터베이스 상태에 대한 구성 설정을 확인하면 도움이 될 수 있습니다.


0

동일한 오류를 검색했지만 Node.js 기본 드라이버 에서 검색했습니다 . 나를위한 대답은 campetersonPrabhat 의 대답 조합이었습니다 .

문제는 readPreference기본 설정 이로 설정 primary되어 혼란스러운 slaveOk오류가 발생 한다는 것 입니다. 내 문제는 모든 노드에서 내 복제본 세트를 읽고 싶다는 것입니다. 복제 세트와 관련하여 연결조차하지 않습니다. 나는 그것을 읽기 위해 모든 노드에 연결합니다.

설정 readPreferenceprimaryPreferred(또는 더 나은에 ReadPreference.PRIMARY_PREFERRED일정한 것은) 나를 위해 그것을 해결했다. 옵션으로 MongoClient.connect()또는 client.db()임의 find()aggregate()또는 다른 기능에 옵션으로 전달하십시오 .

const { MongoClient, ReadPreference } = require('mongodb');
const client = await MongoClient.connect(MONGODB_CONNECTIONSTRING, { readPreference: ReadPreference.PRIMARY_PREFERRED });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.