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
вариант. Это не правильная последовательность действий. Для правильного списка шагов проверьте документы.