Как вы подключаетесь к набору реплик из оболочки MongoDB?

Если я пишу приложение, которое подключается к mongodb, я могу предоставить начальный список для набора реплик, и драйвер направит меня к главному узлу, где я могу запускать команды записи.

Как указать начальный список для оболочки командной строки mongo, чтобы подключиться к набору реплик.


person Richard Warburton    schedule 17.12.2012    source источник
comment
Пожалуйста, отметьте один из ответов как принятый.   -  person Dmytro Shevchenko    schedule 12.10.2016
comment
Я проголосовал за этот вопрос, но поскольку автор не дал ответа, я снял свой голос.   -  person barrypicker    schedule 24.06.2019
comment
@barrypicker Хорошо, что ты удалил свой голос. Сейчас ровно 69   -  person Macindows    schedule 06.01.2020
comment
Для новичков вы можете добавить, что означает подключение к набору репликации. Это не описано в документации, которую я нашел до сих пор.   -  person Ben Slade    schedule 17.01.2020


Ответы (9)


Чтобы подключиться к основному набору реплик, используйте параметр оболочки mongo --host:

mongo --host replicaSetName/host1[:porthost1],host2[:porthost1],host3[:porthost3],etc

Например:

$ mongo --host rs1/john.local:27019,john.local:27018
MongoDB shell version: v3.4.9
connecting to: mongodb://john.local:27019,john.local:27018/?replicaSet=rs1
2017-10-12T14:13:03.094+0000 I NETWORK  [thread1] Starting new replica set monitor for rs1/john.local:27019,john.local:27018
2017-10-12T14:13:03.096+0000 I NETWORK  [thread1] Successfully connected to john.local:27019 (1 connections now open to john.local:27019 with a 5 second timeout)
2017-10-12T14:13:03.096+0000 I NETWORK  [thread1] Successfully connected to john.local:27018 (1 connections now open to john.local:27018 with a 5 second timeout)
rs1:PRIMARY> db
test
rs1:PRIMARY>

Примечание. В версиях с 3.4.2 по 3.4.10 была ошибка (SERVER-28072), который не позволял указывать базу данных после при использовании --host или --port.

person Gianfranco P.    schedule 23.02.2015
comment
Не могли бы вы уточнить: включают ли хост1, хост2 ведущие, подчиненные устройства и арбитры? Или только хосты, на которые мы пишем (мастера)? - person Daniel W.; 11.04.2016
comment
Я получаю сообщение об ошибке, в котором говорится, что все узлы для набора отключены, но rs.status() показывает, что первичный и вторичный узлы работают и исправны. - person SSH This; 12.07.2016
comment
@SSHВы уверены, что у вас нет опечатки, вы используете неправильное имя хоста или процессы mongod привязаны к неправильному IP / интерфейсу? Дважды проверьте первые 3/4 строки вывода оболочки mongo. - person Gianfranco P.; 13.07.2016
comment
@GianPaJ Спасибо, извините, вы были правы, я использовал неправильное имя для своего набора реплик, - person SSH This; 13.07.2016
comment
Это отлично работает для меня: mongo --host repl-set-name/localhost — это не сработает, если член набора repl на локальном хосте находится в автономном режиме, и в моем случае это нормально. В моем случае Localhost является вторичным. - person KajMagnus; 29.09.2016
comment
Примечание. Из-за ошибки это не работает в MongoDB 3.4.0 и 3.4.1 (jira .mongodb.org/browse/SERVER-27289) - person qff; 28.02.2017

Ответы выше относятся к Mongo 3.2.

Согласно Mongo 3.4 документации, оболочка была немного изменился:

В версии 3.2:
mongo --host host1,host2,host3/myRS myDB
или,
mongo --host host1:27017,host2:27017,host3:27017/myRS myDB

В версии 3.4:
mongo "mongodb://host1,host2,host3/myDB?replicaSet=myRS"
или,
mongo "mongodb://host1:27017,host2:27017,host3:27017/myDB?replicaSet=myRS"

person Shemeshey    schedule 08.03.2017

Все, что вам нужно сделать, это использовать --host и указать один из ваших хостов в наборе реплик, но с именем набора реплик в качестве префикса.

Например:

mongo --host my_mongo_server1

будет подключаться к my_mongo_server1, это может быть просто еще один ВТОРИЧНЫЙ узел.

Но:

mongo --host my_repl_set_name/my_mongo_server1

всегда будет подключаться к ПЕРВИЧНОМУ узлу в наборе реплик, даже если это не my_mongo_server1.

Почему? Ответ: «монитор набора реплик». В приведенном выше примере оболочка mongo подключится к указанному узлу, запустит новый монитор набора реплик для набора реплик и будет использовать указанный узел только для его заполнения. Оттуда монитор вычислит все узлы в наборе реплик и переключит соединение на ОСНОВНОЙ узел.

Надеюсь, это помогло.

person Doron Levari    schedule 15.09.2015
comment
@Doron, у вас есть ссылка RTFM на mongodb.com, где это обсуждается? - person Matthew Adams; 02.03.2017

Вы можете использовать формат "name/seed1,seed2,...":

> conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
> db = conn.getDB("test")

Это должно дать вам подключение к любому узлу, который в настоящее время является основным, и нормально обрабатывать отказоустойчивость. Вы можете указать одно или несколько семян, и он найдет остальные.

Обратите внимание, что (AFAIK) оболочка не позволяет вам направлять чтение на вторичные серверы с помощью соединения с набором реплик.

person kristina    schedule 17.12.2012
comment
Эти команды подключения не похожи на сценарий оболочки — что это за язык? - person Richard Warburton; 18.12.2012
comment
Это оболочка JS, но я только что понял, что вы не можете использовать для нее функцию подключения, вам нужно использовать новый Mongo(), редактирование... - person kristina; 19.12.2012

Насколько мне известно, клиент командной строки mongo не будет принимать начальные значения для перенаправления вас на главный узел, потому что вы часто можете захотеть фактически работать на вторичном узле, а не перенаправляться.

Однако, подключившись к любому узлу в RS, вы можете обнаружить топологию RS через rs.config() или db.isMaster(). Затем вы можете использовать эту информацию для повторного подключения к основному узлу. В зависимости от вашей оболочки вы можете использовать mongo --eval "db.isMaster()['primary']" для автоматического подключения к мастеру.

person Chris Heald    schedule 17.12.2012
comment
Хороший совет, mongo --host `mongo --quiet --eval "db.isMaster()['primary']"` - person KCD; 16.07.2014
comment
На самом деле так и будет. mongo --host 1.1.1.1:27017 подключит вас напрямую к узлу, не перенаправляя вас на основной. mongo --host rsName/1.1.1.1:20717 обнаружит все узлы и перенаправит вас на основной. - person Joshua Lawrence Austill; 09.03.2016

В оболочке вы можете сначала использовать:

mongo --nodb

чтобы открыть сеанс монго без подключения к репликации монго

Тогда, как сказала Кристина, вы сможете использовать

conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")

для подключения к набору реплик.

Или в конце концов поставить

conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")

в вашем файле js и

mongo --nodb yourcode.js
person geekysteven    schedule 23.05.2014

Вы можете использовать параметр --host, чтобы указать имя replSet и список семян, тогда mongo автоматически подключится к текущему основному хосту.

пример:
mongo --host rs0/1.example.com:27017,2.example.com:27017,3.example.com:27017 [dbname]

person Sam Hiatt    schedule 17.03.2015

Основываясь на ответе Криса Хилда, эти два псевдонима bash позволяют мне подключиться к мастеру с помощью одной команды (где db1.test.test — один из членов набора реплик, acme — имя базы данных, mreppy — моя учетная запись и т. д.) Это не удастся конечно, если db1 не работает, но это все еще удобно.

alias whichprimary='mongo db1.test.test/acme --username mreppy --password testtest --quiet --eval "db.isMaster()['"'primary'"']"' 
alias connectprimary='mongo -u mreppy -p testtest `whichprimary`/acme'

Цитирование в псевдониме eval сложно, я использовал Как избежать одинарные кавычки внутри строк в одинарных кавычках? для справки :-)

person mreppy    schedule 30.10.2013
comment
В моем случае мне это нужно было в скрипте bash, поэтому я добавил такую ​​функцию: function replica_set_master_host { mongo --quiet -u user -p password --eval "db.isMaster()['primary']" } - person Tonatiuh; 10.06.2014

Я использую v3.4. Также новичок в материалах mongodb ... Хотя справочная информация от «man mongo» предлагает использовать URL-адрес «--host replicaSet/host:port,host:port», у меня это не работает. Однако я могу подключиться к своему replicaSet в соответствии с официальным документом, как показано ниже. :

$ mongo "mongodb://c1m,c2m,c3m/?replicaSet=rs0"
MongoDB shell version v3.4.1
connecting to: mongodb://c1m,c2m,c3m/?replicaSet=rs0
2017-02-08T14:46:43.818+0800 I NETWORK  [main] Starting new replica set monitor for rs0/c1m:27017,c2m:27017,c3m:27017
MongoDB server version: 3.4.1
Server has startup warnings:
2017-02-08T13:31:14.672+0800 I CONTROL  [initandlisten]
2017-02-08T13:31:14.672+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-08T13:31:14.672+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-02-08T13:31:14.672+0800 I CONTROL  [initandlisten]
rs0:PRIMARY>

Поэтому я предполагаю, что справочная страница моего монго устарела (я использую CentOS 7.3).

person bruin    schedule 08.02.2017