【问题标题】:How to setup a valid mongo replicaset如何设置有效的 mongo 副本集
【发布时间】:2017-01-27 03:01:46
【问题描述】:

我想研究一个场景,有多个 MongoDB 处于副本模式,但在特殊情况下,只有一个工作。我的配置如下。

我在 EC2 实例上有一个 MongoDB 容器,我的命令是

sudo docker run \
--name mongo \
-v /home/core/mongo-files/data:/data/db \
-p 27018:27017 -d mongo:3.2.1 \
--smallfiles \
--replSet "rs0"

然后我有 2 个由 Nodejs 开发的应用程序使用这个数据库。他们用这个连接字符串连接:

uri:'mongodb://192.168.0.100:27018/testmongo?replicaSet=rs0'

不幸的是,我的一个应用程序运行良好,而另一个则不行。尝试连接数据库时的错误消息是

MongoDB 连接错误:MongoError: no valid replicaset members 找到了

我通过运行此命令检查状态rs.slaveOk()rs.status() 然后我有这个

rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2016-09-19T11:50:59.947Z"),
    "myState" : 1,
    "term" : NumberLong(2),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "02aaebd39d4b:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1194663,
            "optime" : {
                "ts" : Timestamp(1474285564, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2016-09-19T11:46:04Z"),
            "electionTime" : Timestamp(1473091196, 1),
            "electionDate" : ISODate("2016-09-05T15:59:56Z"),
            "configVersion" : 1,
            "self" : true
        }
    ],
    "ok" : 1
}

我的场景的这个设置是否正确?如果不正确,如何解决?

【问题讨论】:

  • 我要检查的第一件事是运行的成员是否在应用程序种子列表中。如果当前关闭/从集合中删除的其他成员是种子列表中唯一的成员,那么您的应用程序将无法找到该集合。
  • 所以我的设置不正确?我是否需要创建更多的 mongo 容器(比如 3 个实例)然后关闭并保留一个?
  • 您能发布您的应用程序连接字符串吗?我们需要查看那些以了解是否存在种子列表问题。
  • 这是我的:uri: 'mongodb://192.168.0.100:27018/testmongo?replicaSet=rs0',
  • 如果在端口 27017 上运行的 mongod 是唯一一个活动的,您需要将其作为连接字符串的一部分。否则,您的应用程序无法发现副本集成员资格。我建议将所有成员添加到您的连接 uri。

标签: node.js mongodb docker docker-machine mongodb-replica-set


【解决方案1】:

也许重新开始,有3个阶段来启动副本

  1. 将 mongod 实例作为副本启动

    mongod --port 27018 --replSet rs0 --dbpath /home/core/mongo-files/data:/data/db1 --logpath your/log/path --smallfiles --fork --logappend
    mongod --port 27017 --replSet rs0 --dbpath /home/core/mongo-files/data:/data/db2 --logpath your/log/path --smallfiles --fork --logappend
    
  2. 连接到 mongodb 并启动副本并将包含的 mongod 定义为副本

     rs.initiate(
        {
           _id: "rs0",
           members: [
              { _id: 0, host : "Your.Machine's.LocalHost:27017" },
              { _id: 1, host : "Your.Machine's.LocalHost:27018" }
           ]
        }
     )
    
  3. 实际使用以下命令启动副本。

    rs.initiate(rs0)
    

【讨论】:

  • 是的,我做到了,rs0:PRIMARY> rs.status()的结果,有一个成员
  • 我编辑了上面的评论,我不确定这是否会有所帮助,但我希望它会有所帮助。
  • 请在此处查看我对 ubuntu 的回答:stackoverflow.com/a/61929189/3904109
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
相关资源
最近更新 更多