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

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

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



답변

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

rs.slaveOk()

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

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

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


답변

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

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

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


답변

mongodb2.0에서

당신은 입력해야합니다

rs.slaveOk()

보조 mongod 노드에서


답변

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

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’는 세 번째 선택적 인수입니다.


답변

slaveOk는 더 이상 작동하지 않습니다. readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred 를 사용해야합니다.

예 :

const client = new MongoClient(mongoURL + "?readPreference=primaryPreferred", { useUnifiedTopology: true, useNewUrlParser: true });


답변

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

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

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


답변

동일한 오류를 검색했지만 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 });