mongodb, репликации и ошибки: {"$ err": "not master и slaveOk = false", "code": 13435} - PullRequest
153 голосов
/ 24 января 2012

Я впервые попробовал наборы реплик Монго.

Я использую Ubuntu на 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 , я вижу, что у меня есть основной, secondday и arbitor.

Хорошо, теперь для теста.

На первичной базе данных создать в этом коде:

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

на вторичном, я тогда делаю это и получаю ошибку ниже:

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

Я очень новичок в mongodb и копирую, но я подумал, что если я что-то делаю в одном, это переходит в другое. Итак, если я добавлю запись в одну, что мне нужно сделать, чтобы реплицировать на разных машинах?

Ответы [ 5 ]

256 голосов
/ 24 января 2012

Вы должны установить режим «slave okay», чтобы оболочка mongo знала, что вы разрешаете чтение с вторичного устройства. Это сделано для того, чтобы защитить вас и ваши приложения от случайного выполнения последовательных операций чтения. Вы можете сделать это в оболочке с помощью:

rs.slaveOk()

После этого вы можете отправлять запросы в обычном режиме.

Примечание о "возможной согласованности": при нормальных обстоятельствах вторичные наборы реплик имеют все те же данные, что и первичные, в течение секунды или меньше. При очень высокой нагрузке данные, которые вы записали на первичный сервер, могут занять некоторое время для репликации на вторичный сервер. Это известно как «задержка реплики», а чтение с запаздывающего вторичного устройства известно как «в конечном итоге непротиворечивое» чтение, поскольку, хотя недавно записанные данные будут отображаться в какой-то момент (исключая сбои в сети и т. Д.), Это может быть Сразу Доступно.

Редактировать: Вам нужно установить slaveok только при запросе от вторичных серверов и только один раз за сеанс.

40 голосов
/ 25 марта 2013

Чтобы не вводить rs.slaveOk() каждый раз, сделайте следующее:

Создайте файл с именем replStart.js, содержащий одну строку: rs.slaveOk()

Затем включите --shell replStart.js при запуске оболочки Mongo. Конечно, если вы подключаетесь локально к одному экземпляру, это не спасет вас от набора текста.

30 голосов
/ 29 февраля 2012

в mongodb2.0

вы должны набрать

rs.slaveOk()

во вторичном узле монгод

10 голосов
/ 29 мая 2014

Это просто примечание для тех, кто справляется с этой проблемой, используя драйвер Ruby

У меня была такая же проблема при использовании Ruby Gem.

Чтобы установить slaveOk в Ruby, вы просто передаете его в качестве аргумента при создании клиента следующим образом:

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'третий необязательный аргумент.

0 голосов
/ 23 ноября 2016

Я просто добавляю этот ответ для неловкой ситуации от поставщика БД.

В нашем случае произошло то, что первичный и вторичный db сместились обратно (первичный на вторичный и наоборот), и мы получаем то же самоеошибка.

, поэтому, пожалуйста, проверьте в настройках конфигурации состояние базы данных, которое может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...