Как инициализировать набор репликации mongodb без вызова rs.initiate()?
Я пытаюсь запустить mongod с replSet=1, как показано ниже: $mongod --dbpath /x/y --replSet 1
Но я продолжал получать сообщения об ошибках типа "вам нужно инициализировать набор репликации с помощью вызова rs.initiate()", затем я запускаю оболочку mongo для запуска rs.initiate (), и проблема решается.
Но мой вопрос: зачем нужна отдельная оболочка монго? Есть ли способ сделать это с помощью опции Mongod?
3 ответа
Краткий ответ / tl;dr
Нет.
Чуть более длинный ответ
Нет, потому что имеет смысл использовать оболочку.
Ответ
Когда вы настраиваете набор реплик, у вас обычно есть несколько участников. Пока набор реплик не инициализирован, ни один из членов не содержит необходимую конфигурацию. Узел, на котором вы инициализируете набор реплик, становится основным, сохраняя конфигурацию. Теперь вы добавляете участников либо используя rs.add
команда или с помощью rs.reconfig
, Затем происходит то, что основной контакт связывается с добавленным членом, конфигурация синхронизируется и некоторые другие вещи. Рекомендуется, чтобы обычные члены набора реплик были равны, чтобы один из узлов вышел из строя, нет недостатка в том, что другой узел становится первичным, и поэтому новый первичный может оставаться первичным, пока он не выйдет из строя по какой-либо причине или самому другому.
Так что, если вы хотите запустить член набора реплик, откуда он должен получить его конфигурацию? Решите для себя, что он должен делать? Это не будет хорошо работать в кластере. Как это должно обнаружить других участников и их конфигурацию? Помните, что члены набора реплик могут находиться в разных центрах обработки данных. И если бы был --IamPrimaryDoAsISay
вариант, что произойдет, если в кластере был еще один первичный элемент? И как должна решаться ситуация, в которой более чем один участник был запущен с этим вариантом? Отступить от другого сервера? Может быть, только потому, что вы заменили кулер? Или только что запущенный экземпляр ничего не должен делать, когда уже был первичный? Какой смысл тогда будет иметь этот вариант?
И все эти сложности только для того, чтобы не допустить ни одной команды из оболочки?
Примечание. Если вам нужен один сервер, просто запустите автономный экземпляр (mongod без --replSet
option). Если вы хотите изучить возможности набора реплик, вам нужно более одного члена.
Нет, вы не можете сделать это без rs.initiate()
var x = rs.initiate(
{ _id:'z',
members:[
{ _id:1, host:'52.68.124.177:27001' },
{ _id:2, host:'52.68.124.132:27001' },
{ _id:3, host:'52.68.124.181:27001' }
]
}
Следующая команда добавит три члена в набор реплик.
printjson(x);
Приведенная выше команда может использоваться для печати JSON с членами набора реплик.
Но мой вопрос: зачем нужна отдельная оболочка монго?
Нет с rs.initiate()
также имеет возможность для параметров конфигурации и что не может быть указано (а также вы, вероятно, не хотите указывать) в опциях командной строки.
Также rs.initiate()
запускается только на первичном сервере, так как он не запускается defacto при запуске каждого узла в наборе реплик.
Так как MongoDB не может быть уверен, что он является частью набора или где его место находится в наборе rs.initiate()
вид говорит mongod
обрабатывать что-то и о себе.