Назад | Перейти на главную страницу

изменить пароль администратора mongo на арбитре

У меня есть реплика 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 был настроен как член набора реплик. Это не ожидаемое (или не поддерживаемое) развертывание, поэтому для удаления или обновления данных аутентификации вам необходимо запустить арбитр как автономный сервер.

Чтобы удалить любую информацию о пользователе:

  1. Остановите арбитра.

  2. Запустить арбитр на другом порту без --replSet, --keyfile, или --auth параметры, чтобы гарантировать, что другие члены набора реплик не могут подключиться к арбитру, пока вы вносите изменения в автономном режиме.

    Например: mongod --dbpath /path/to/data --port 28000 --fork

  3. Теперь аутентификация должна быть отключена. Использовать mongo оболочка, чтобы уронить admin база данных:

    mongo localhost:28000/admin --eval 'db.dropDatabase()'
    
  4. Отключите арбитр, например:

    mongo localhost:28000/admin --eval 'db.shutdownServer()'
    
  5. Запустите арбитр с вашей нормальной конфигурацией.

Вы также можете изменить пароль (вместо того, чтобы убирать admin database), но это может сбивать с толку, поскольку от арбитров не ожидается наличие пользовательских данных. Результат аутентификации против арбитра не определен, и будущая реализация SERVER-5479 вряд ли будет поддерживать уже существующие данные об арбитрах. Как только информация о пользователе / ​​роли реплицируется арбитрам, ожидается, что данные будут согласованными.

Я опаздываю на вечеринку, но с СЕРВЕР-32205, удаление базы админки запрещено. Итак, обходной путь, предложенный @Stennie к сожалению, больше не работает (начиная с v3.6.3). Однако существует даже более простой обходной путь, если большая часть набора реплик все еще запущена и работает:

  • выключить арбитра
  • удалите содержимое папки db: rm -rf [your-data-folder]/db/*
  • запустить арбитра

Арбитр автоматически присоединится к набору реплик. Пока исключение localhost включен (с помощью enableLocalhostAuthBypass option), вы можете подключиться к арбитру (только) с localhost и выполнять команды mongodb на арбитре.