mongodb, копії та помилки: {"$ err": "not master and slaveOk = false", "code": 13435}


174

Я вперше спробував набори реплік Монго.

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


з'ясував, що я повинен використовувати rs.slaveOk (); Це залишає мене до іншого питання. Я повинен це зробити для кожного запиту? Що робити, якщо я перебуваю на головному вузлі?

Відповіді:


282

Ви повинні встановити режим "раб добре", щоб оболонка монго знала, що ви можете читати з другорядних. Це захистить вас і ваші програми від випадкового виконання послідовних читань випадково. Ви можете зробити це в оболонці за допомогою:

rs.slaveOk()

Після цього ви можете запитувати звичайно у вторинних служб.

Примітка про "можливу узгодженість": за звичайних обставин вторинні репліки мають усі ті ж дані, що і праймериз протягом секунди чи менше. При дуже великому навантаженні дані, які ви записали в основний, можуть зайняти деякий час, щоб повторити їх у вторинні. Це відоме як "відставання реплік", а читання з відстаючого вторинного відоме як "зрештою послідовне" читання, оскільки, поки щойно записані дані з’являться в якийсь момент (відмова мережі відмов тощо), це може не бути негайно доступні.

Редагувати: Налаштування slaveok потрібно встановлювати лише під час запитів із вторинних служб та лише один раз за сеанс.


3
Завжди перевіряйте посібник перед тим, як переходити до виконання команд, які ви не розумієте у своїх БД. Можуть бути наслідки для команди, що відповідь не пояснює. Чи змінює ця команда спосіб розподілу операцій зчитування для всіх з'єднань із набором реплік? Краще з’ясуйте. Ця команда з'являється ще в v2.2 docs.mongodb.com/v2.2/reference/method/rs.slaveOk Ви завжди можете (і повинні) замінити частину "/ manual /" URL-адреси docs.mongodb.com URL до вашої конкретної версії, щоб переконатися, що ви отримуєте відповідну інформацію.
Бруно Броноський

45

Щоб не писати rs.slaveOk()кожен раз, робіть це:

Створіть файл з назвою replStart.js, що містить один рядок:rs.slaveOk()

Потім включайте --shell replStart.jsпри запуску оболонки Mongo. Звичайно, якщо ви підключаєте локально до одного примірника, це не врятує жодного введення тексту.


26
Кращим способом заощадити на наборі тексту буде додавання rs.slaveOk()до вашого ~/.mongorc.jsфайлу, яке автоматично виконується при запуску оболонки mongo.
Стенні

2
Я вважаю це корисним поставити конфігурацію за замовчуванням в ~/.mongorc.jsі користувальницьких конфігурацій в replStart.jsабо adminStart.jsабо будь-який інший .
Ед Норріс

41

у mongodb2.0

ви повинні набрати

rs.slaveOk()

у вторинному монгодному вузлі


11

ЦЕ ПРОСТО ПРИМІТКА ДЛЯ ВСІХ ВПРАВЛІННЯ З ЦІЙ ПРОБЛЕМИ, ВИКОРИСТОВУЮЧИЙ РУБИЙ Драйвер

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



1

Я лише додаю цю відповідь на незручну ситуацію від постачальника баз даних.

у нашому випадку первинний і вторинний db зміщені в зворотному напрямку (первинний до вторинного і навпаки), і ми отримуємо ту саму помилку.

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


0

Я потрапив сюди в пошуках тієї ж помилки, але з Node.js рідний драйвер . Відповідь для мене було поєднання відповідей по campeterson і Prabhat .

Проблема полягає в тому, що readPreferenceвстановлення за замовчуванням primary, яке потім якось призводить до заплутаної slaveOkпомилки. Моя проблема полягає в тому, що я просто хочу прочитати з мого набору реплік з будь-якого вузла. Я навіть не підключаюся до нього, як для реплікації. Я просто підключаюся до будь-якого вузла, щоб прочитати з нього.

Постановка readPreferenceна primaryPreferred(а краще на ReadPreference.PRIMARY_PREFERREDпостійну) вирішила це для мене. Просто передайте це як опцію MongoClient.connect()або до, client.db()або до будь-якої find(), aggregate()або іншої функції.

const { MongoClient, ReadPreference } = require('mongodb');
const client = await MongoClient.connect(MONGODB_CONNECTIONSTRING, { readPreference: ReadPreference.PRIMARY_PREFERRED });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.