Как вы подключаетесь к репликации из оболочки MongoDB?
Если я пишу приложение, которое подключается к mongodb, то я могу предоставить список семян для репликации, и драйвер направит меня к мастеру node, где я могу запускать команды записи.
Как указать список семян для командной строки mongo
, чтобы перейти к репликации.
Ответы
Ответ 1
Чтобы подключиться к первичному набору реплик, используйте параметр оболочки --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), из-за которой не удавалось указывать db после использования --host или --port.
Ответ 2
Ответы выше для Монго 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"
Ответ 3
Вы можете использовать формат "name/seed1, seed2,...":
> conn = new Mongo("myReplicaSet/A:27017,B:27017,C:27017")
> db = conn.getDB("test")
Это должно дать вам подключение к тому, что node в настоящее время является основным, и справиться с откатом. Вы можете указать один или несколько семян, и он найдет остальное.
Обратите внимание, что (AFAIK) оболочка не позволяет вам маршрутизировать чтение на вторичные с установлением с репликой.
Ответ 4
Все, что вам нужно сделать, это использовать -host и предоставить ему один из ваших хостов в репликации, но с именем репликации в качестве префикса.
Например:
mongo --host my_mongo_server1
будет подключаться к my_mongo_server1, он может быть просто еще одним SECONDARY node.
Но:
mongo --host my_repl_set_name/my_mongo_server1
всегда будет подключаться к PRIMARY node в наборе реплик, даже если это не my_mongo_server1.
Почему? Ответ "Монитор набора реплик".
В приведенном выше примере оболочка mongo подключится к указанному node, запустит новый монитор набора реплик для набора реплик и будет использовать указанный node только для его семени. Оттуда монитор определит все узлы в наборе реплик и переключит соединение с PRIMARY node.
Надеюсь, что это помогло.
Ответ 5
Насколько я знаю, клиент командной строки mongo не будет принимать семена, чтобы перенаправить вас на мастер node, потому что вы часто можете фактически использовать вторичный node, а не перенаправлять.
Однако, после подключения к любому node в RS, вы можете обнаружить топологию RS через rs.config()
или db.isMaster()
. Затем вы можете использовать эту информацию для повторного подключения к первичному node. В зависимости от вашей оболочки вы можете использовать mongo --eval "db.isMaster()['primary']"
для автоматического подключения к ведущему устройству.
Ответ 6
В оболочке вы можете сначала использовать:
mongo --nodb
чтобы открыть сеанс mongo без подключения к mongo replicaset
Затем, как сказала Кристина, вы должны иметь возможность использовать
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
Ответ 7
Вы можете использовать параметр --host
, чтобы указать имя и список семплирования, а затем mongo
будет автоматически подключаться к текущему основному хосту.
Пример:
mongo --host rs0/1.example.com:27017,2.example.com:27017,3.example.com:27017 [dbname]
Ответ 8
Основываясь на ответе Криса Хейлда, эти две псевдонимы 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 сложна, я использовал Как избежать одиночных кавычек в одиночных кавычках? для справки: -)
Ответ 9
Я использую v3.4. Также новичок в материалах mongodb...
Хотя справочная информация из "man mongo" предлагает использовать "-host replicaSet/host: port, host: port" url, это не работает для меня.
Тем не менее, я могу подключиться к моей реплике в соответствии с официальным документом как показано ниже:
$ 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>
Итак, я думаю, что страница man моего монго устарела (я использую CentOS 7.3).
Ответ 10
mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname