MongoDB - резервное копирование и восстановление пользователей и ролей

Каковы лучшие практики синхронизации пользователей и ролей между экземплярами Mongo?

На том же компьютере с Windows я пытаюсь скопировать пользователей и роли MongoDB в базе данных администратора из одного экземпляра Mongo в другой. Аутентификация включена для каждого экземпляра. Никакая комбинация mongodump \ mongorestore или mongoexport \ mongoimport, которую я пробовал, не работает. При mongodump \ restore отображается шаг восстановления:

при условии, что пользователи в каталоге дампа находятся из ‹= 2.4 (версия аутентификации 1) Ошибка: коллекции пользователей и ролей в дампе имеют несовместимую версию аутентификации с целевым сервером: невозможно восстановить пользователей версии аутентификации 1 на сервер версии аутентификации 5

Я не нашел в командной строке параметра, который бы запретил ему делать эту глупость. У меня Mongo версии 4 и все установлено.

Вы могли бы подумать, что --dumpDbUsersAndRoles и --restoreDbUsersAndRoles будут симметричными, но это не так.

Мне удалось запустить это, mongoexport -p 27017 -u admin --password please -d admin --collection system.roles --out myRoles.json

Однако при попытке монгоимпорта

mongoimport -p 26017 -u admin --password please -d admin --collection "system.roles" --file myRoles.json

в выходных данных отображается ошибка проверки параметров: недопустимое имя коллекции: имя коллекции 'system.roles' не может начинаться с 'system'.


person Jon    schedule 29.12.2018    source источник


Ответы (1)


Грунтовка

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

Решение

При этом кажется совершенно очевидным, как с этим бороться. В худшем случае гораздо проще иметь .js готовый, который просто воссоздает 3-4 глобальные роли, вместо того, чтобы возиться с system.* коллекциями в базе данных администратора. Это имеет то преимущество, что вы также можете автоматически выполнять другие настройки, например настройку сегментирования, если TSHTF и вам нужно перестроить свой кластер с нуля.

use admin;
db.createRole([...])
db.createRole([...])
// do other stuff, like sharding setup

Запустите с первичным из вашего набора реплик или экземпляра mongos (если у вас есть сегментированный кластер), используя

mongo daHost:27017/admin myjsfile.js

после настройки машин, но до включения аутентификации.

Другой вариант - использовать Ansible для создания пользователей.

Что касается дампа и восстановления, вы можете не указывать имя коллекции.

person Markus W Mahlberg    schedule 29.12.2018
comment
Спасибо за предложения Маркус. Это, безусловно, хороший подход для большинства наших случаев использования. В одном варианте использования сценарий - это главный сервер и второй сервер на другом компьютере. Второй сервер имеет другие данные, чем первый. Однако нам нужен тот же набор пользователей и привилегий. - person Jon; 01.01.2019