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 и реплицирует, но я думал, что если я что-то делаю в одном, он переходит к другому. Итак, если я добавлю запись в одну, что мне нужно сделать для репликации на разных машинах?

4b9b3361

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

rs.slaveOk()

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

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

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

198
ответ дан 24 янв. '12 в 19:30
источник

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

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

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

29
ответ дан 25 марта '13 в 22:54
источник

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

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

8
ответ дан 29 мая '14 в 0:04
источник

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

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

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

0
ответ дан 23 нояб. '16 в 13:38
источник