У меня есть реплика mongoDB с 3 БД - ПЕРВИЧНЫЙ / ВТОРИЧНЫЙ + Арбитр. Все 3 были установлены одинаково - это означает, что у них есть база данных администратора с паролем по умолчанию.
Теперь - я хочу изменить пароли по умолчанию. На начальном / среднем уровне все работало хорошо.
mongo admin -u admin -p <password> --authenticationDatabase=admin
db.changeUserPassword("admin",<new password>)
Однако - в арбитре это не работает (даже после добавления rs.slaveOK()
в ПЕРВИЧНОМ)
Я собираюсь:
2016-12-01T00:18:51.408-0800 E QUERY [thread1] Error: Updating user failed: not master :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.updateUser@src/mongo/shell/db.js:1319:15
DB.prototype.changeUserPassword@src/mongo/shell/db.js:1323:9
@(shell):1:1
Есть идеи, как изменить пароль администратора арбитра?
Как и в MongoDB 3.4, арбитры в наборе реплик не реплицируют какие-либо данные (включая сведения о пользователях / ролях). Следствием этого является то, что вы обычно можете войти в систему арбитра через исключение localhost если это не было специально отключено установкой enableLocalhostAuthBypass
к false
.
Есть соответствующий запрос функции, за который вы можете проголосовать / посмотреть: SERVER-5479: Арбитр в наборе аутентифицированных реплик должен разрешать и требовать логин / авторизацию для операций только с правами администратора .
В вашем конкретном случае кажется, что у вашего арбитра уже были некоторые данные аутентификации до mongod
был настроен как член набора реплик. Это не ожидаемое (или не поддерживаемое) развертывание, поэтому для удаления или обновления данных аутентификации вам необходимо запустить арбитр как автономный сервер.
Чтобы удалить любую информацию о пользователе:
Остановите арбитра.
Запустить арбитр на другом порту без --replSet
, --keyfile
, или --auth
параметры, чтобы гарантировать, что другие члены набора реплик не могут подключиться к арбитру, пока вы вносите изменения в автономном режиме.
Например: mongod --dbpath /path/to/data --port 28000 --fork
Теперь аутентификация должна быть отключена. Использовать mongo
оболочка, чтобы уронить admin
база данных:
mongo localhost:28000/admin --eval 'db.dropDatabase()'
Отключите арбитр, например:
mongo localhost:28000/admin --eval 'db.shutdownServer()'
Запустите арбитр с вашей нормальной конфигурацией.
Вы также можете изменить пароль (вместо того, чтобы убирать admin
database), но это может сбивать с толку, поскольку от арбитров не ожидается наличие пользовательских данных. Результат аутентификации против арбитра не определен, и будущая реализация SERVER-5479 вряд ли будет поддерживать уже существующие данные об арбитрах. Как только информация о пользователе / роли реплицируется арбитрам, ожидается, что данные будут согласованными.
Я опаздываю на вечеринку, но с СЕРВЕР-32205, удаление базы админки запрещено. Итак, обходной путь, предложенный @Stennie к сожалению, больше не работает (начиная с v3.6.3). Однако существует даже более простой обходной путь, если большая часть набора реплик все еще запущена и работает:
rm -rf [your-data-folder]/db/*
Арбитр автоматически присоединится к набору реплик. Пока исключение localhost включен (с помощью enableLocalhostAuthBypass option), вы можете подключиться к арбитру (только) с localhost и выполнять команды mongodb на арбитре.