Mongodb 从副本集中移除成员

本文介绍两种从MongoDB副本集中移除成员的方法:使用rs.remove()直接删除及利用rs.reconfig()重新配置副本集来实现成员移除。文中详细展示了每一步骤的操作命令与效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从副本集中移除成员可以使用以下2种方法

要删除副本集的成员,请使用以下任一过程

方法一: rs.remove()

  • 关闭mongod要删除的成员的实例。要关闭实例,请使用 mongoshell 和db.shutdownServer() 方法进行连接。
# 当前实例进程三个节点
root@ubuntu-x64_01:/opt# ps -ef | grep mongodb 
mongodb   1431     1  1 13:12 ?        00:00:30 /usr/local/mongodb/bin/mongod --config /etc/mongod.conf
mongodb   1509     1  1 13:12 ?        00:00:28 /usr/local/mongodb/bin/mongod --config /etc/mongod27018.conf
mongodb   1583     1  1 13:12 ?        00:00:28 /usr/local/mongodb/bin/mongod --config /etc/mongod27019.conf
root      1940  1409  0 13:52 pts/0    00:00:00 grep mongodb

# 通过 shutdown 命令关闭实例进程
root@ubuntu-x64_01:/opt# su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb27019/data  --port 27019  --shutdown"
{"t":{"$date":"2023-01-30T13:53:20.405+08:00"},"s":"I",  "c":"CONTROL",  "id":23285,   "ctx":"main","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
{"t":{"$date":"2023-01-30T13:53:20.411+08:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
{"t":{"$date":"2023-01-30T13:53:20.411+08:00"},"s":"I",  "c":"NETWORK",  "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."}
killing process with pid: 1583

# 关闭后进程已剩下2个节点
root@ubuntu-x64_01:/opt# ps -ef |grep mongodb 
mongodb   1431     1  1 13:12 ?        00:00:30 /usr/local/mongodb/bin/mongod --config /etc/mongod.conf
mongodb   1509     1  1 13:12 ?        00:00:29 /usr/local/mongodb/bin/mongod --config /etc/mongod27018.conf
root      1971  1409  0 13:53 pts/0    00:00:00 grep mongodb
  • 连接到副本集的当前primary。要确定当前主节点,db.hello() 或者 rs.hell() 请在连接到副本集的任何成员时使用。请看下 primary 和 me 的值是否一样!!!
# 操作前检查下节点状态 
sit_rs1:PRIMARY> rs.hello()
{
        "topologyVersion" : {
                "processId" : ObjectId("63d751d543212b41ac592d31"),
                "counter" : NumberLong(6)
        },
        "hosts" : [
                "192.168.88.11:27018",
                "192.168.88.11:27019",
                "192.168.88.11:27017"
        ],
        "setName" : "sit_rs1",
        "setVersion" : 14,
        "isWritablePrimary" : true,
        "secondary" : false,
        "primary" : "192.168.88.11:27017",
        "me" : "192.168.88.11:27017",
        "electionId" : ObjectId("7fffffff0000000000000060"),
        "lastWrite" : {
                "opTime" : {
                        "ts" : Timestamp(1675058065, 1),
                        "t" : NumberLong(96)
                },
                "lastWriteDate" : ISODate("2023-01-30T05:54:25Z"),
                "majorityOpTime" : {
                        "ts" : Timestamp(1675058065, 1),
                        "t" : NumberLong(96)
                },
                "majorityWriteDate" : ISODate("2023-01-30T05:54:25Z")
        },
        "maxBsonObjectSize" : 16777216,
        "maxMessageSizeBytes" : 48000000,
        "maxWriteBatchSize" : 100000,
        "localTime" : ISODate("2023-01-30T05:54:32.534Z"),
        "logicalSessionTimeoutMinutes" : 30,
        "connectionId" : 47,
        "minWireVersion" : 0,
        "maxWireVersion" : 9,
        "readOnly" : false,
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1675058065, 1),
                "signature" : {
                        "hash" : BinData(0,"IaigLTs5WhdGW6FOJ+aI76BLtD4="),
                        "keyId" : NumberLong("7135350621929996293")
                }
        },
        "operationTime" : Timestamp(1675058065, 1)
}
  • 使用rs.remove()以下任一形式删除成员:
    rs.remove(“IP:27017”) – 带端口
    rs.remove(“IP”) – 不带端口(默认27017)
    案例我们停止的 27019 这个实例,所以在操作时,要带上端口,如下
sit_rs1:PRIMARY> rs.remove("192.168.88.11:27019")
{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1675058185, 1),
                "signature" : {
                        "hash" : BinData(0,"jvyLPYHG4aMMqck56Z0VmZR4Cro="),
                        "keyId" : NumberLong("7135350621929996293")
                }
        },
        "operationTime" : Timestamp(1675058185, 1)
}


# 在检查下节点数量 
sit_rs1:PRIMARY> rs.hello()
{
        "topologyVersion" : {
                "processId" : ObjectId("63d751d543212b41ac592d31"),
                "counter" : NumberLong(7)
        },
        "hosts" : [
                "192.168.88.11:27018",
                "192.168.88.11:27017"
        ],
        "setName" : "sit_rs1",
        "setVersion" : 15,
        "isWritablePrimary" : true,
        "secondary" : false,
        "primary" : "192.168.88.11:27017",
        "me" : "192.168.88.11:27017",
        "electionId" : ObjectId("7fffffff0000000000000060"),
        "lastWrite" : {
                "opTime" : {
                        "ts" : Timestamp(1675058185, 1),
                        "t" : NumberLong(96)
                },
                "lastWriteDate" : ISODate("2023-01-30T05:56:25Z"),
                "majorityOpTime" : {
                        "ts" : Timestamp(1675058185, 1),
                        "t" : NumberLong(96)
                },
                "majorityWriteDate" : ISODate("2023-01-30T05:56:25Z")
        },
        "maxBsonObjectSize" : 16777216,
        "maxMessageSizeBytes" : 48000000,
        "maxWriteBatchSize" : 100000,
        "localTime" : ISODate("2023-01-30T05:56:33.585Z"),
        "logicalSessionTimeoutMinutes" : 30,
        "connectionId" : 47,
        "minWireVersion" : 0,
        "maxWireVersion" : 9,
        "readOnly" : false,
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1675058185, 1),
                "signature" : {
                        "hash" : BinData(0,"jvyLPYHG4aMMqck56Z0VmZR4Cro="),
                        "keyId" : NumberLong("7135350621929996293")
                }
        },
        "operationTime" : Timestamp(1675058185, 1)
}

如果副本集需要选择一个新的主节点,MongoDB 可能会短暂地断开 shell。在这种情况下,shell 会自动重新连接。

方法二: rs.reconfig()

您可以通过使用副本配置文档重新配置副本集来删除该成员。

从 MongoDB 4.4 开始,一次rs.reconfig()只允许添加或删除1 voting成员。

要从副本集中删除多个投票成员,请发出一系列rs.reconfig()操作以一次删除一个成员。

  • 关闭mongod要删除的成员的实例。要关闭实例,请使用 mongoshell 和db.shutdownServer() 方法进行连接。(关闭方法和上面一样!!!)
# 操作前检查下当前状态
sit_rs1:PRIMARY> db.hello()
{
        "topologyVersion" : {
                "processId" : ObjectId("63d751d8704e9e9d6f5f165e"),
                "counter" : NumberLong(11)
        },
        "hosts" : [
                "192.168.88.11:27018",
                "192.168.88.11:27017",
                "192.168.88.11:27019"
        ],
        "setName" : "sit_rs1",
        "setVersion" : 17,
        "isWritablePrimary" : true,
        "secondary" : false,
        "primary" : "192.168.88.11:27018",
        "me" : "192.168.88.11:27018",
        "electionId" : ObjectId("7fffffff0000000000000062"),
        "lastWrite" : {
                "opTime" : {
                        "ts" : Timestamp(1675073774, 1),
                        "t" : NumberLong(98)
                },
                "lastWriteDate" : ISODate("2023-01-30T10:16:14Z"),
                "majorityOpTime" : {
                        "ts" : Timestamp(1675073774, 1),
                        "t" : NumberLong(98)
                },
                "majorityWriteDate" : ISODate("2023-01-30T10:16:14Z")
        },
        "maxBsonObjectSize" : 16777216,
        "maxMessageSizeBytes" : 48000000,
        "maxWriteBatchSize" : 100000,
        "localTime" : ISODate("2023-01-30T10:16:15.898Z"),
        "logicalSessionTimeoutMinutes" : 30,
        "connectionId" : 91,
        "minWireVersion" : 0,
        "maxWireVersion" : 9,
        "readOnly" : false,
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1675073774, 1),
                "signature" : {
                        "hash" : BinData(0,"PQBR9PZWQAsACLHcYYwaZAbkiao="),
                        "keyId" : NumberLong("7135350621929996293")
                }
        },
        "operationTime" : Timestamp(1675073774, 1)
}
  • 发出rs.conf()查看当前配置文档的方法并确定 members要删除的成员在数组中的位置:
sit_rs1:PRIMARY> rs.conf()
{
        "_id" : "sit_rs1",
        "version" : 17,
        "term" : 98,
        "protocolVersion" : NumberLong(1),
        "writeConcernMajorityJournalDefault" : true,
        "members" : [
                {
                        "_id" : 1,
                        "host" : "192.168.88.11:27018",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 3,
                        "host" : "192.168.88.11:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 4,
                        "host" : "192.168.88.11:27019",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "catchUpTimeoutMillis" : -1,
                "catchUpTakeoverDelayMillis" : 30000,
                "getLastErrorModes" : {

                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("6305db8beb57aaf6f57b130e")
        }
}
  • 将当前配置文件赋值给变量cfg:
sit_rs1:PRIMARY> var cfg = rs.conf()
  • 修改cfg对象以移除成员。
    比如要删除: 192.168.88.11:27019,请使用以下 JavaScript 操作:
sit_rs1:PRIMARY> cfg.members.splice(2,1)
[
        {
                "_id" : 4,
                "host" : "192.168.88.11:27019",
                "arbiterOnly" : false,
                "buildIndexes" : true,
                "hidden" : false,
                "priority" : 1,
                "tags" : {

                },
                "slaveDelay" : NumberLong(0),
                "votes" : 1
        }
]
  • 通过发出以下命令,用新配置覆盖副本集配置文档:
sit_rs1:PRIMARY> rs.reconfig(cfg)
{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1675074964, 1),
                "signature" : {
                        "hash" : BinData(0,"L5AcPvKzh/miCSYOazvh0XeEPyc="),
                        "keyId" : NumberLong("7135350621929996293")
                }
        },
        "operationTime" : Timestamp(1675074964, 1)
}


# 重新检查配置: 现在只有两个节点!!!!
sit_rs1:PRIMARY> rs.conf()
{
        "_id" : "sit_rs1",
        "version" : 18,
        "term" : 98,
        "protocolVersion" : NumberLong(1),
        "writeConcernMajorityJournalDefault" : true,
        "members" : [
                {
                        "_id" : 1,
                        "host" : "192.168.88.11:27018",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 3,
                        "host" : "192.168.88.11:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "catchUpTimeoutMillis" : -1,
                "catchUpTakeoverDelayMillis" : 30000,
                "getLastErrorModes" : {

                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("6305db8beb57aaf6f57b130e")
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethanchen's notes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值