mongodb, репликации и ошибки: {«$ err»: «не мастер, а slaveOk = false», «код»: 13435}

114

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

  • 0
    понял, что я должен использовать rs.slaveOk (); Это оставляет меня к другому вопросу. Я должен сделать это, сделать это для каждого запроса? Что если я нахожусь на главном узле?
Теги:
amazon-ec2

5 ответов

189

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

rs.slaveOk()

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

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

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

  • 2
    Всегда проверяйте руководство, прежде чем приступить к выполнению команд, которые вы не понимаете в своих БД. Для команды могут быть последствия, которые ответ не объясняет. Изменяет ли эта команда способ распределения операций чтения для всех подключений к набору реплик? Лучше узнай. Эта команда появилась еще в v2.2 docs.mongodb.com/v2.2/reference/method/rs.slaveOk Вы можете (и должны) всегда заменять часть "/ manual /" URL-адреса docs.mongodb.com к вашей конкретной версии, чтобы убедиться, что вы получаете соответствующую информацию.
28

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

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

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

  • 24
    Лучший способ сэкономить на вводе текста - добавить rs.slaveOk() в файл ~/.mongorc.js , который будет автоматически выполняться при запуске оболочки mongo.
  • 2
    Я считаю полезным поместить конфигурацию по умолчанию в ~/.mongorc.js а пользовательские конфигурации - в replStart.js adminStart.js или что-то еще.
16

в mongodb2.0

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

rs.slaveOk()

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

  • 0
    ответ правильный
8

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню