首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接到远程MongoDB副本集

连接到远程MongoDB副本集
EN

Stack Overflow用户
提问于 2019-03-04 15:38:51
回答 3查看 3.8K关注 0票数 5

在我的远程机器中,我已经设置了一个码头集装箱机器,我管理使用码头-合成。我在我的复制集中为每个MongoDB实例创建了3个对接容器

代码语言:javascript
复制
mongodb_01:
    image: mvertes/alpine-mongo
    entrypoint: ['/usr/bin/mongod', '--bind_ip_all', '--replSet', 'rs0']
    restart: always
    ports:
      - 10001:27017
    volumes:
      - ./mongodb/01:/data/db

mongodb_02:
    image: mvertes/alpine-mongo
    entrypoint: ['/usr/bin/mongod', '--bind_ip_all', '--replSet', 'rs0']
    restart: always
    depends_on:
       - mongodb_01
    ports:
      - 10002:27017
    volumes:
      - ./mongodb/02:/data/db

mongodb_03:
    image: mvertes/alpine-mongo
    entrypoint: ['/usr/bin/mongod', '--bind_ip_all', '--replSet', 'rs0']
    restart: always
    depends_on:
      - mongodb_02
    ports:
      - 10003:27017
    volumes:
      - ./mongodb/03:/data/db

我还配置了副本集。这是一段节选:

代码语言:javascript
复制
"_id" : "rs0",
...
"members" : [
    {
        "_id" : 0,
        "host" : "mongodb_01:27017",
        ...
    },
    {
        "_id" : 1,
        "host" : "mongodb_02:27017",
        ...
    },
    {
        "_id" : 2,
        "host" : "mongodb_03:27017",
        ...
    }
],
...
}

所有操作都很好,其他对接者映像和这个复制集之间的内部通信可以使用连接字符串很好地工作。

代码语言:javascript
复制
mongodb://mongodb_01:27017,mongodb_02:27017,mongodb_03:27017/<database>?replicaSet=rs0

问题是当我需要将远程客户端连接到这个复制集时。例如,通过我的开发机器上的节点使用mongoose,我得到:

代码语言:javascript
复制
MongoNetworkError: failed to connect to server [mongodb_02:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND mongodb_02 mongodb_02:27017]

有时它在mongodb_03上失败。

编辑:正如所指出的,下面是来自远程计算机的连接字符串:

代码语言:javascript
复制
mongodb://<remote-host>:10001,<remote-host>:10002,<remote-host>:10003/<database>?replicaSet=rs0

编辑2:使用Mongodb这样的客户机,我可以成功地连接到单个实例。当我添加复制集时,我得到了错误。因此,我尝试用mongodb创建一个虚拟容器(使用mongo: container )。

代码语言:javascript
复制
$ docker run -it mongo:latest bash

和奔跑

代码语言:javascript
复制
mongo mongodb://<remote-host>:10001,<remote-host>:10002,<remote-host>:10003/<database>?replicaSet=rs0

我得到了

代码语言:javascript
复制
MongoDB shell version v4.0.6
connecting to: mongodb://<remote-host>:10001,<remote-host>:10002,<remote-host>:10003/<database>?gssapiServiceName=mongodb&replicaSet=rs0
2019-03-04T16:12:54.375+0000 I NETWORK  [js] Starting new replica set monitor for rs0/<remote-host>:10001,<remote-host>:10002,<remote-host>:10003
2019-03-04T16:12:54.377+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to <remote-host>:10003 (1 connections now open to <remote-host>:10003 with a 5 second timeout)
2019-03-04T16:12:54.377+0000 I NETWORK  [js] Successfully connected to <remote-host>:10001 (1 connections now open to <remote-host>:10001 with a 5 second timeout)
2019-03-04T16:12:54.378+0000 I NETWORK  [js] changing hosts to rs0/mongodb_01:27017,mongodb_02:27017,mongodb_03:27017 from rs0/<remote-host>:10001,<remote-host>:10002,<remote-host>:10003
2019-03-04T16:12:54.882+0000 W NETWORK  [js] Unable to reach primary for set rs0
2019-03-04T16:12:54.882+0000 I NETWORK  [js] Cannot reach any nodes for set rs0. Please check network connectivity and the status of the set. This has happened for 1 checks in a row.

诸若此类。

谢谢您的帮助和建议!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-07 08:41:23

我和你面临着同样的问题,我已经解决了。

因为您的远程客户端不知道'mongo1:27017‘主机。它只在码头网络中使用。

要解释我是如何解决这个问题的有点棘手。我先给你看一下我的船坞-复合。

代码语言:javascript
复制
version: "3.3"
services:
  mongo-primary:
    container_name: mongo-primary
    hostname: mongo-primary
    image: mongo:4.0.11
    volumes:
      - $HOME/.dockerMongoRepl/primary/data/db:/data/db
      - $HOME/.dockerMongoRepl/keyfile:/data/keyfile
    extra_hosts:
      - "address.whichCanAccess.yourServer:192.168.1.xx"
    networks:
      - mongo-cluster
    ports:
      - 27017:27017
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: changeme
    command: --bind_ip_all --auth --keyFile /data/keyfile/mongo-cluster-key --replSet rs0 --enableMajorityReadConcern false
  mongo-secondary:
    container_name: mongo-secondary
    hostname: mongo-secondary
    image: mongo:4.0.11
    volumes:
      - $HOME/.dockerMongoRepl/secondary/data/db:/data/db
      - $HOME/.dockerMongoRepl/keyfile:/data/keyfile
    depends_on:
      - mongo-primary
    extra_hosts:
      - ""address.whichCanAccess.yourServer:192.168.1.xx""
    networks:
      - mongo-cluster
    ports:
      - 27018:27017
    restart: always
    command: --bind_ip_all -auth --keyFile /data/keyfile/mongo-cluster-key --replSet rs0 --enableMajorityReadConcern false
  mongo-arbiter:
    container_name: mongo-arbiter
    hostname: mongo-arbiter
    image: mongo:4.0.11
    volumes:
      - $HOME/.dockerMongoRepl/arbiter/data/arb:/data/arb
      - $HOME/.dockerMongoRepl/keyfile:/data/keyfile
    depends_on:
      - mongo-primary
    extra_hosts:
      - ""address.whichCanAccess.yourServer:192.168.1.xx""
    networks:
      - mongo-cluster
    ports:
      - 27019:27017
    restart: always
    command: --bind_ip_all --auth --keyFile /data/keyfile/mongo-cluster-key --replSet rs0 --enableMajorityReadConcern false

networks:
  mongo-cluster:

!重要的部分是'extra_hosts'!它可以使容器访问主机。

"address.WhichCanAccess.yourServer“<- -在我的例子中,我的华硕路由器是用XXX.asuscomm.com设置的,所以它将是XXX.asuscomm.com

"192.168.1.xx“<- IP地址是华硕路由器分配给主机的地址

也许这些组合文件的某些配置是不需要的。

运行3个集装箱与码头-组成。

接下来,输入主体的mongo,设置副本如下所示

代码语言:javascript
复制
config = {
  "_id": "rs0",
  "members": [{
    "_id": 0,
    "host": "address.whichCanAccess.yourServer:27017"
  }, {
    "_id": 1,
    "host": "address.whichCanAccess.yourServer:27018"
  }, {
    "_id": 2,
    "host": "address.whichCanAccess.yourServer:27019",
    arbiterOnly: true
  }]
}

rs.initiate(config)

通过这种方式,mongo容器将通过docker的主机网络相互通信,并且可以从远程IP访问。

票数 8
EN

Stack Overflow用户

发布于 2020-11-24 10:49:38

为此,您可以使用localhost。作曲大致如下所示:

代码语言:javascript
复制
version: "3"
services:
  mongodb:
    image: mongo:4.0.11
    ports:
      - "27017:27017"
    extra_hosts:
      - "localhost:0.0.0.0"
    volumes:
      - "./lambda/docker/mongod.conf:/etc/mongod.conf"

然后,在初始化复制集时,请确保将主机设置为本地主机。示例:

代码语言:javascript
复制
{
    // ........
    "members" : [ 
        {
            "_id" : 0,
            "host" : "localhost:27017"
            // .........
        }
    ]
    // ...........
}

在OSX上测试过。在linux/windows上,它可能有不同的行为。

票数 1
EN

Stack Overflow用户

发布于 2019-03-06 08:28:40

最后,我使用了免费版本的Atlas进行测试和集成。工作完成后,我将在服务器上使用自己的副本集。

这有点麻烦,在没有dev工具和调试器支持的情况下,我需要在生产之前对所有内容进行三次检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54986570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档