web-dev-qa-db-ja.com

MongoDBシェルからレプリカセットにどのように接続しますか?

Mongodbに接続するアプリケーションを作成している場合は、レプリカセットのシードリストを提供できます。ドライバーは、書き込みコマンドを実行できるマスターノードに誘導します。

レプリカセットに接続するために、コマンドラインmongoシェルのシードリストを指定するにはどうすればよいですか。

67

レプリカセットプライマリに接続するには、mongo Shell --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には、dbの指定を妨げるバグ( SERVER-28072 )がありました--Hostまたは--portを使用する場合。

95
Gianfranco P.

上記の回答は、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"

24
Shemeshey

「name/seed1、seed2、...」形式を使用できます。

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

これにより、現在プライマリであるノードへの接続が提供され、フェイルオーバーが正常に処理されます。 1つ以上のシードを指定すると、残りが見つかります。

(知る限り)シェルでは、レプリカセット接続を使用して読み取りをセカンダリにルーティングすることはできません。

13
kristina

必要なことは、-Hostを使用して、レプリカセット内のホストの1つに、レプリカセットの名前をプレフィックスとして指定することだけです。

例えば:

mongo --Host my_mongo_server1

my_mongo_server1に接続しますが、それはさらに別のSECONDARYノードである可能性があります。

しかし:

mongo --Host my_repl_set_name/my_mongo_server1

my_mongo_server1でなくても、レプリカセットのPRIMARYノードに常に接続します。

どうして?答えは「レプリカセットモニター」です。上記の例では、mongo Shellは指定されたノードに接続し、レプリカセットの新しいレプリカセットモニターを開始し、指定されたノードをシードするためだけに使用します。そこから、モニターはレプリカセット内のすべてのノードを特定し、接続をPRIMARYノードに切り替えます。

お役に立てば幸いです。

12
Doron Levari

私の知る限り、mongoコマンドラインクライアントは、マスターノードに転送するシードを受け入れません。多くの場合、転送されるのではなく、セカンダリノードで実際に操作したい場合があるためです。

ただし、RSの任意のノードに接続すると、rs.config()またはdb.isMaster()を介してRSトポロジを検出できます。その後、この情報を使用してプライマリノードに再接続できます。シェルによっては、mongo --eval "db.isMaster()['primary']"を使用してマスターに自動的に接続できる場合があります。

8
Chris Heald

シェルでは、最初に以下を使用できます。

mongo --nodb

mongo replicasetに接続せずにmongoセッションを開くには

その後、クリスティーナが言ったように、あなたは使用できるはずです

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
geekysteven

--Hostパラメーターを使用してreplSet名とシードリストを指定すると、mongoが現在のプライマリホストに自動的に接続します。

例:
mongo --Host rs0/1.example.com:27017,2.example.com:27017,3.example.com:27017 [dbname]

3
Sam Hiatt

クリス・ヒールドによる答えに基づいて、これらの2つのbashエイリアスは1つのコマンドでマスターに接続できます(db1.test.testはレプリカセットの1つのメンバー、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エイリアスのクォートは難しいので、私は シングルクォートで囲まれた文字列内のシングルクォートをエスケープする方法? を使用しました:-)

1
mreppy
mongodb://< dbuser >:< dbpassword >@example.com:< port >,example2.com:< port >/< dbname >?replicaSet=setname
0
deep cool

V3.4を使用しています。 mongodbの新機能...「man mongo」のヘルプ情報では「--Host replicaSet/Host:port、Host:port」のURLを使用するように提案されていますが、私には機能しません。ただし、以下のように official document に従って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>

したがって、mongoのmanページは古くなっていると思います(CentOS 7.3を使用しています)。

0
bruin