【问题标题】:MongoDB replica set write when secondary down辅助关闭时的 MongoDB 副本集写入
【发布时间】:2021-09-21 20:27:50
【问题描述】:

我正在尝试创建一个主从 mongo 实例。我创建了实例:

mongod.exe --config "C:\mongodb\config\repl1.cfg"
mongod.exe --config "C:\mongodb\config\repl2.cfg"

然后我登录到我的第一个节点并创建了副本,第二个节点也启动了:

mongo.exe --port 27031
mongo.exe --port 27032


rs.initiate( {
   _id : "replKK",
   members: [
      { _id: 0, host: "localhost:27031", priority:5 },
      { _id: 1, host: "localhost:27032", hidden: true, priority:0 }
   ]
})

两个节点都启动时我可以读写。但是当我关闭辅助节点时,我可以插入到集合中,因为我收到以下错误:

WriteCommandError({
        "topologyVersion" : {
                "processId" : ObjectId("6149c7170fc6426b073f16c3"),
                "counter" : NumberLong(11)
        },
        "ok" : 0,
        "errmsg" : "not master",
        "code" : 10107,
        "codeName" : "NotWritablePrimary",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1632225689, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1632225689, 1)
})

我做错了什么?我怎样才能使第一个节点是可以插入行的实例,而第二个节点只是一种备份(主从)?我正在使用 MongoDB 5.0.3

【问题讨论】:

    标签: mongodb database-replication


    【解决方案1】:

    为了选举一个可写的PRIMARY节点,所有节点的多数必须是up。

    2 个中的 1 个不是大多数。典型的解决方案是创建一个Arbiter。 Arbiter 是一个非常轻量级的 mongod 进程,它不存储任何数据。

    【讨论】:

    • 谢谢,这解决了我的问题。你能告诉我是否可以在没有辅助的情况下运行主要+任意?当我尝试读取数据时,我收到 "errmsg" : "not master and slaveOk=false", "codeName" : "NotPrimaryNoSecondaryOk",
    • 你可以运行主要的 + 任意的,但它没有任何收获。当仲裁器关闭时,您仍然拥有主要的,即没有变化。当它主要宕机时,应用程序不再可用,因为仲裁器不存储任何数据。
    • hmm 我尝试了这种方法,但由于 NotPrimaryNoSecondaryOk 导致我无法找到任何数据
    • 好吧,我从来没有测试过这个设置——因为它没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多