3

docker を使用して mongo レプリカ セットをセットアップするチュートリアルを見つけました。私のコマンドは

ネットワーク クラスタを作成する

sudo docker network create curator-cluster

という名前の特定のコンテナを作成し、mongo1内部で 27018 から 27017 をマップし、名前を設定しますrs0

sudo docker run \
-p 27018:27017 \
--name mongo1 \
--net curator-cluster \
mongo mongod --replSet rs0

私の構成、

config = {
"_id" : "rs0",
"members" : [{"_id" : 0, "host" : "mongo1:27017"},
{"_id" : 1, "host" : "mongo2:27017"},
{"_id" : 2, "host" : "mongo3:27017"}]
}

最終的に、3つのコンテナを作成しました

5949826d5bb1        mongo                        "/entrypoint.sh mongo"   22 hours ago        Up 22 hours         0.0.0.0:27020->27017/tcp   mongo3
dcf37866dbb6        mongo                        "/entrypoint.sh mongo"   22 hours ago        Up 22 hours         0.0.0.0:27019->27017/tcp   mongo2
14202f76089f        mongo                        "/entrypoint.sh mongo"   22 hours ago        Up 22 hours         0.0.0.0:27018->27017/tcp   mongo1

の結果sudo docker exec -it mongo1 mongo

MongoDB shell version: 3.2.9
connecting to: test
Server has startup warnings:
2016-09-22T10:24:29.655+0000 I CONTROL  [initandlisten]
2016-09-22T10:24:29.655+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-09-22T10:24:29.655+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-09-22T10:24:29.655+0000 I CONTROL  [initandlisten]
2016-09-22T10:24:29.655+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-09-22T10:24:29.655+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-09-22T10:24:29.655+0000 I CONTROL  [initandlisten]
rs0:PRIMARY>

プライマリがあり、コンテナ (mongo1 など) に何かを挿入しようとしたように見えますが、MongoDB はうまく同期できます。

今、コマンドでデータベースのセットに接続しようとしましたbryan(メモ10.145.168.151は私のIPです)

mongo --host rs0/10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020 bryan

私の結果は

MongoDB shell version: 2.6.9
connecting to: rs0/10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020/bryan
2016-09-23T16:46:18.819+0800 starting new replica set monitor for replica set rs0 with seeds 10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020
2016-09-23T16:46:18.819+0800 [ReplicaSetMonitorWatcher] starting
2016-09-23T16:46:18.819+0800 changing hosts to rs0/mongo1:27017,mongo2:27017,mongo3:27017 from rs0/10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020
2016-09-23T16:46:18.820+0800 getaddrinfo("mongo2") failed: Name or service not known
2016-09-23T16:46:18.821+0800 getaddrinfo("mongo1") failed: Name or service not known
2016-09-23T16:46:18.822+0800 getaddrinfo("mongo3") failed: Name or service not known
2016-09-23T16:46:18.822+0800 Error: connect failed to replica set rs0/10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020 at src/mongo/shell/mongo.js:148
exception: connect failed

Nodejs (マングース) を使用すると、MongoError: no primary found in replicaset

問題は私の質問だと思うgetaddrinfo("mongo2") failed: Name or service not knownので、これを修正する方法です。ありがとうございました

4

1 に答える 1

4

返信が遅くなり申し訳ありませんが、異なる vnet と欠落しているホスト名でこの問題に遭遇しました。ips を使用して接続すると、クラスターは ips を使用して応答するという印象を受けました。私は間違っていた。ips で接続する場合でも、ホスト名が使用可能である必要があります。

ただし、必要に応じて、実装をホスト名から ips に変更できます (ただし、これはすべてのクライアントに適用されます)。

1) mongo cli に接続します

2)cfg = rs.conf()

などと表示cfg.members[0].hostされます"hostname:27017"

3) エントリごとにcfg.members[i].host = "ip(i):27017"

例: cfg.members[0].host = "10.0.0.1:27017"

4)rs.reconfig(cfg) 応答が得られるはずです。 { "ok" : 1 }

これで接続できるはずです。これには注意点があるため、結果についてよく考えてください (ips が変更された場合など)。

于 2016-12-09T19:16:53.760 に答える