MongoDB: Невозможно инициировать набор реплик; "уже есть данные, не может инициировать набор"

У меня есть экземпляр MongoDB, настроенный с использованием файла конфигурации и файла ключей.

Я хотел бы начать набор реплик с помощью pymongo. Когда я пытаюсь инициировать набор replcia, выполняя сценарий python для сервера, который станет основным набором реплик, как таковой:

from pymongo import MongoClient

uri = "mongodb://correctWorkingUsername:password@localhost:27017"
c = MongoClient(uri)

config = {'_id': 'RelicaSetName', 'members': [
{'_id': 0, 'host': 'FirstServer:27017'},
{'_id': 1, 'host': 'SecondServer:27017'},
{'_id': 2, 'host': 'ThirdServer:27017'}]}

c.admin.command("replSetInitiate", config)

Я получаю сообщение об ошибке, следующее:

'SecondSErver:27017' has data already, cannot initiate set

Тем не менее, если я аутентифицируюсь в базе данных, используя

mongo admin -u correctWorkingUsername -p password

Я могу инициировать репликацию и успешно добавить участников:

rs.initiate()
rs.add('SecondServer:27017')

Я не был уверен, было ли это связано с аутентификацией по ключевому файлу или с тем фактом, что пользователи были УЖЕ созданы на других серверах скриптом. Каждый сервер также был запущен с файлом конфигурации mongod.conf, который содержит имя набора реплик.

Почему это не удается? Rs.initiate() и rs.add() работают отлично, но скрипт python не работает, хотя он может повлиять на соединение с базой данных.

1 ответ

Решение

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

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

Что вы должны сделать, это запустить узлы, инициализировать набор реплик и затем создать пользователей (только на первичном сервере).

пользователи были УЖЕ созданы на других серверах скриптом

Это проблема в основе - единственный способ, которым это можно было сделать на неинициализированном элементе набора реплик, заключается в том, что если он сначала был представлен как узел набора без реплики, были добавлены пользователи, а затем он был перезапущен с помощью replSet вариант. Это не правильная последовательность действий. Для правильного списка шагов проверьте документы.

Другие вопросы по тегам