Я попробовал наборы реплик монго в первый раз.
Я использую 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 и копирую, но я подумал, что если я что-то делаю в одном, то и в другом. Итак, если я добавлю запись в одну, что мне нужно сделать, чтобы реплицировать на разных машинах?
mongodb
amazon-ec2
eLRuLL
источник
источник
Ответы:
Вы должны установить режим «slave okay», чтобы оболочка mongo знала, что вы разрешаете чтение с вторичного устройства. Это сделано для того, чтобы защитить вас и ваши приложения от случайного последовательного чтения. Вы можете сделать это в оболочке с помощью:
После этого вы можете сделать запрос в обычном режиме.
Примечание о «возможной согласованности»: при нормальных обстоятельствах вторичные серверы набора реплик имеют все те же данные, что и первичные файлы, в течение секунды или меньше. При очень высокой нагрузке данные, которые вы записали на первичный сервер, могут реплицироваться на вторичный сервер. Это известно как «задержка реплики», а чтение с запаздывающего вторичного устройства известно как «в конечном итоге непротиворечивое» чтение, поскольку, хотя недавно записанные данные будут отображаться в какой-то момент (исключая сбои в сети и т. Д.), Это может быть Сразу Доступно.
Изменить: вам нужно установить slaveok только при запросе от вторичных, и только один раз за сеанс.
источник
Чтобы не печатать
rs.slaveOk()
каждый раз, сделайте это:Создайте файл с именем
replStart.js
, содержащий одну строку:rs.slaveOk()
Затем включите
--shell replStart.js
при запуске оболочки Mongo. Конечно, если вы подключаетесь локально к одному экземпляру, это не спасет вас от набора текста.источник
rs.slaveOk()
в~/.mongorc.js
файл файл, который будет автоматически выполняться при запуске оболочки mongo.~/.mongorc.js
и пользовательских конфигураций вreplStart.js
илиadminStart.js
или любой другой .в mongodb2.0
вы должны напечатать
во вторичном монгодном узле
источник
ЭТО ТОЛЬКО ЗАМЕТКА ДЛЯ ЛЮБОГО УЧАСТИЯ В ЭТОЙ ПРОБЛЕМЕ С ИСПОЛЬЗОВАНИЕМ РУБИНОВОГО ДРАЙВЕРА
У меня была такая же проблема при использовании Ruby Gem.
Чтобы установить slaveOk в Ruby, вы просто передаете его в качестве аргумента при создании клиента следующим образом:
https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection
Обратите внимание, что «args» является третьим необязательным аргументом.
источник
slaveOk больше не работает. Нужно использовать readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred
например
источник
Я просто добавляю этот ответ для неловкой ситуации от поставщика БД.
то, что произошло в нашем случае, это то, что первичный и вторичный db сместились обратно (первичный на вторичный и наоборот), и мы получаем ту же ошибку.
поэтому, пожалуйста, проверьте в настройках конфигурации состояние базы данных, которое может вам помочь.
источник
Я попал сюда в поисках той же ошибки, но из Node.js родной драйвер . Ответом для меня была комбинация ответов Кампетерсона и Прабхата .
Проблема заключается в том, что
readPreference
значение по умолчанию равноprimary
, что затем приводит к сбивающей с толкуslaveOk
ошибке. Моя проблема в том, что я просто хочу читать с моего набора реплик с любого узла. Я даже не подключаюсь к нему как к репликасу. Я просто подключаюсь к любому узлу, чтобы читать с него.Установка
readPreference
наprimaryPreferred
(или лучше наReadPreference.PRIMARY_PREFERRED
постоянную) решила для меня. Просто передайте его в качестве опцииMongoClient.connect()
или кclient.db()
или к любомуfind()
,aggregate()
или другой функции.источник