Mongodb, replicates и error: { "$ err": "not master и slaveOk = false", "code": 13435}

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

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

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

В основном создать базу данных в этом коде:

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

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

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

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

Ответ 1

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

rs.slaveOk()

После этого вы можете запросить обычную информацию из вторичных.

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

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

Ответ 2

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

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

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

Ответ 3

в mongodb2.0

вы должны ввести

rs.slaveOk()

во вторичном mongod node

Ответ 4

ЭТО ТОЛЬКО ЗАМЕЧАНИЕ ДЛЯ ЛЮБОГО СООТВЕТСТВИЯ ЭТОЙ ПРОБЛЕМЕ С ИСПОЛЬЗОВАНИЕМ РУЧНОГО ВОДИТЕЛЯ

У меня была такая же проблема при использовании 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" является третьим необязательным аргументом.

Ответ 5

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

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

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