Я впервые попробовал набор реплик 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 и реплицирует, но я думал, что если я что-то делаю в одном, он переходит к другому. Итак, если я добавлю запись в одну, что мне нужно сделать для репликации на разных машинах?
Вы должны установить режим "ведомый режим", чтобы оболочка mongo знала, что вы разрешаете чтение из вторичного. Это необходимо для защиты вас и ваших приложений от последовательного последовательного чтения случайно. Вы можете сделать это в оболочке с помощью:
rs.slaveOk()
После этого вы можете запросить обычную информацию из вторичных.
Заметка о "возможной согласованности": при нормальных обстоятельствах набор реплик Secondary имеет все те же данные, что и праймериз в течение секунды или меньше. При очень высокой нагрузке данные, которые вы написали на первичном, могут занять некоторое время, чтобы воспроизвести вторичные данные. Это известно как "отставание реплики", и чтение из запаздывающего вторичного сигнала называется "в конечном счете последовательным" чтением, потому что, хотя недавно записанные данные будут отображаться в какой-то момент (запрет сетевых сбоев и т.д.), Это может быть не так Сразу Доступно.
Изменить: Вам нужно установить slaveok при запросе из вторичных файлов и только один раз за сеанс.
Чтобы не набирать rs.slaveOk()
каждый раз, сделайте следующее:
Создайте файл с именем replStart.js
, содержащий одну строку: rs.slaveOk()
Затем включите --shell replStart.js
при запуске оболочки Mongo. Конечно, если вы подключаетесь локально к одному экземпляру, это не позволяет печатать.
rs.slaveOk()
в файл ~/.mongorc.js
, который будет автоматически выполняться при запуске оболочки mongo.
~/.mongorc.js
а пользовательские конфигурации - в replStart.js
adminStart.js
или что-то еще.
в mongodb2.0
вы должны ввести
rs.slaveOk()
во вторичном mongod node
ЭТО ТОЛЬКО ЗАМЕЧАНИЕ ДЛЯ ЛЮБОГО СООТВЕТСТВИЯ ЭТОЙ ПРОБЛЕМЕ С ИСПОЛЬЗОВАНИЕМ РУЧНОГО ВОДИТЕЛЯ
У меня была такая же проблема при использовании 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" является третьим необязательным аргументом.
Я просто добавляю этот ответ для неудобной ситуации у поставщика БД.
то, что произошло в нашем случае, это первичный и вторичный db, смещенные обратно (первичный на вторичный и наоборот), и мы получаем ту же ошибку.
пожалуйста, проверьте настройки конфигурации для состояния базы данных, которые могут вам помочь.