
MongoDB的本集副本集(Replica Set)是一个高可用性、可扩展性和冗余性的调整数据库解决方案。它能够确保数据库的节点高可用性,同时保障了数据的本集安全性。在本文中,调整我们将探讨如何在一个已经包含三个数据节点的节点副本集集群中,添加一个仲裁节点,本集并同时删除原先的调整一个数据节点。
1、节点副本集的本集基本概念MongoDB副本集由多个数据节点+若干个仲裁节点(可以没有)组成,其中一个数据节点被选举为主节点(Primary),调整其余节点为次要节点(Secondary)。节点在故障时,本集副本集会自动进行主节点的源码下载调整切换,确保服务的节点高可用性。副本集中的仲裁节点(Arbiter)不存储数据,仅用于选举过程,帮助副本集进行决策。
例如,当前配置一个3节点的数据节点集群,组件集群命令如下:
复制> use admin > rs.initiate( {_id: "test1",members: [{ _id: 0, host: "192.168.122.36:27017" },{ _id: 1, host: "192.168.122.36:27018" },{ _id: 2, host: "192.168.122.36:27019" } ] })1.2.
查看状态:
复制test1:PRIMARY> use admin switched to db admin test1:PRIMARY> rs.status() { "set" : "test1", "date" : ISODate("2023-10-23T02:31:02.345Z"), "myState" : 1, "term" : NumberLong(1), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "heartbeatIntervalMillis" : NumberLong(2000), "majorityVoteCount" : 2, "writeMajorityCount" : 2, "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "lastCommittedWallTime" : ISODate("2023-10-23T02:30:54.919Z"), "readConcernMajorityOpTime" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "readConcernMajorityWallTime" : ISODate("2023-10-23T02:30:54.919Z"), "appliedOpTime" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "lastAppliedWallTime" : ISODate("2023-10-23T02:30:54.919Z"), "lastDurableWallTime" : ISODate("2023-10-23T02:30:54.919Z") }, "lastStableRecoveryTimestamp" : Timestamp(1698028224, 3), "lastStableCheckpointTimestamp" : Timestamp(1698028224, 3), "electionCandidateMetrics" : { "lastElectionReason" : "electionTimeout", "lastElectionDate" : ISODate("2023-10-23T02:30:24.838Z"), "electionTerm" : NumberLong(1), "lastCommittedOpTimeAtElection" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "lastSeenOpTimeAtElection" : { "ts" : Timestamp(1698028214, 1), "t" : NumberLong(-1) }, "numVotesNeeded" : 2, "priorityAtElection" : 1, "electionTimeoutMillis" : NumberLong(10000), "numCatchUpOps" : NumberLong(0), "newTermStartDate" : ISODate("2023-10-23T02:30:24.912Z"), "wMajorityWriteAvailabilityDate" : ISODate("2023-10-23T02:30:25.497Z") }, "members" : [ { "_id" : 0, "name" : "192.168.122.36:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 183, "optime" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2023-10-23T02:30:54Z"), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1698028224, 1), "electionDate" : ISODate("2023-10-23T02:30:24Z"), "configVersion" : 1, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "192.168.122.36:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 47, "optime" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2023-10-23T02:30:54Z"), "optimeDurableDate" : ISODate("2023-10-23T02:30:54Z"), "lastHeartbeat" : ISODate("2023-10-23T02:31:00.889Z"), "lastHeartbeatRecv" : ISODate("2023-10-23T02:31:01.443Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "192.168.122.36:27017", "syncSourceHost" : "192.168.122.36:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1 }, { "_id" : 2, "name" : "192.168.122.36:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 47, "optime" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1698028254, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2023-10-23T02:30:54Z"), "optimeDurableDate" : ISODate("2023-10-23T02:30:54Z"), "lastHeartbeat" : ISODate("2023-10-23T02:31:00.890Z"), "lastHeartbeatRecv" : ISODate("2023-10-23T02:31:01.446Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "192.168.122.36:27017", "syncSourceHost" : "192.168.122.36:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1 } ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1698028254, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1698028254, 1) }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.此时可以用一个程序验证集群的可用情况:
复制from pymongo import MongoClient from pymongo.errors import ConnectionFailure # MongoDB副本集的连接信息 replica_set = "test1" mongo_host = ["192.168.122.36:27017", "192.168.122.36:27018", "192.168.122.36:27019"] # 主机和端口号列表 # 尝试连接MongoDB副本集 try: client = MongoClient(mongo_host, replicaSet=replica_set, serverSelectinotallow=5000) db = client["testdb"] print("Successfully connected to MongoDB replica set.") collection = db[test1] data = {"b":2} result = collection.insert_one(data) except ConnectionFailure: print("Failed to connect to MongoDB replica set. Please check your connection settings.")1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.运行结果如下:

查看数据库中运行结果:

要添加一个仲裁节点,我们需要在现有副本集中的任一节点上执行如下操作:
复制rs.add( { host: "IP:PORT", arbiterOnly:true } )1.执行这个命令后,MongoDB将会在副本集中添加一个仲裁节点,增加了选主的稳定性,同时不会增加数据存储的压力。站群服务器具体实际案例如下
复制test1:PRIMARY> use admin switched to db admin test1:PRIMARY> rs.add( { host: "192.168.122.36:27020", arbiterOnly:true } ) { "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1698030806, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1698030806, 1) } test1:PRIMARY> rs.status(); { "set" : "test1", "date" : ISODate("2023-10-23T03:13:32.511Z"), "myState" : 1, "term" : NumberLong(1), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "heartbeatIntervalMillis" : NumberLong(2000), "majorityVoteCount" : 3, "writeMajorityCount" : 3, "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "lastCommittedWallTime" : ISODate("2023-10-23T03:13:26.379Z"), "readConcernMajorityOpTime" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "readConcernMajorityWallTime" : ISODate("2023-10-23T03:13:26.379Z"), "appliedOpTime" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "lastAppliedWallTime" : ISODate("2023-10-23T03:13:26.379Z"), "lastDurableWallTime" : ISODate("2023-10-23T03:13:26.379Z") }, "lastStableRecoveryTimestamp" : Timestamp(1698030805, 1), "lastStableCheckpointTimestamp" : Timestamp(1698030805, 1), "electionCandidateMetrics" : { "lastElectionReason" : "electionTimeout", "lastElectionDate" : ISODate("2023-10-23T02:30:24.838Z"), "electionTerm" : NumberLong(1), "lastCommittedOpTimeAtElection" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "lastSeenOpTimeAtElection" : { "ts" : Timestamp(1698028214, 1), "t" : NumberLong(-1) }, "numVotesNeeded" : 2, "priorityAtElection" : 1, "electionTimeoutMillis" : NumberLong(10000), "numCatchUpOps" : NumberLong(0), "newTermStartDate" : ISODate("2023-10-23T02:30:24.912Z"), "wMajorityWriteAvailabilityDate" : ISODate("2023-10-23T02:30:25.497Z") }, "members" : [ { "_id" : 0, "name" : "192.168.122.36:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 2733, "optime" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2023-10-23T03:13:26Z"), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1698028224, 1), "electionDate" : ISODate("2023-10-23T02:30:24Z"), "configVersion" : 2, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "192.168.122.36:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 2597, "optime" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2023-10-23T03:13:26Z"), "optimeDurableDate" : ISODate("2023-10-23T03:13:26Z"), "lastHeartbeat" : ISODate("2023-10-23T03:13:32.393Z"), "lastHeartbeatRecv" : ISODate("2023-10-23T03:13:32.420Z"), "pingMs" : NumberLong(1), "lastHeartbeatMessage" : "", "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "configVersion" : 2 }, { "_id" : 2, "name" : "192.168.122.36:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 2597, "optime" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1698030806, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2023-10-23T03:13:26Z"), "optimeDurableDate" : ISODate("2023-10-23T03:13:26Z"), "lastHeartbeat" : ISODate("2023-10-23T03:13:32.393Z"), "lastHeartbeatRecv" : ISODate("2023-10-23T03:13:32.445Z"), "pingMs" : NumberLong(1), "lastHeartbeatMessage" : "", "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "configVersion" : 2 }, { "_id" : 3, "name" : "192.168.122.36:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 6, "lastHeartbeat" : ISODate("2023-10-23T03:13:32.405Z"), "lastHeartbeatRecv" : ISODate("2023-10-23T03:13:32.455Z"), "pingMs" : NumberLong(4), "lastHeartbeatMessage" : "", "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "configVersion" : 2 } ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1698030806, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1698030806, 1) }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.此时修改python中程序(插入的数据),运行结果如下:

如果你需要删除一个数据节点,首先,你要确保副本集的健康状态,然后执行如下操作来删除一个Secondary节点。
复制rs.remove("IP:PORT");1.执行这个命令后,MongoDB将从副本集中移除该数据节点,副本集会重新进行选举,确保副本集的高可用性。
复制test1:PRIMARY> rs.remove("192.168.122.36:27019") { "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1698038888, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1698038888, 1) } test1:PRIMARY> rs.status function() { return db._adminCommand("replSetGetStatus"); # 选举中 } test1:PRIMARY> rs.status() { "set" : "test1", "date" : ISODate("2023-10-23T05:28:15.398Z"), "myState" : 1, "term" : NumberLong(1), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "heartbeatIntervalMillis" : NumberLong(2000), "majorityVoteCount" : 2, "writeMajorityCount" : 2, "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1698038888, 1), "t" : NumberLong(1) }, "lastCommittedWallTime" : ISODate("2023-10-23T05:28:08.335Z"), "readConcernMajorityOpTime" : { "ts" : Timestamp(1698038888, 1), "t" : NumberLong(1) }, "readConcernMajorityWallTime" : ISODate("2023-10-23T05:28:08.335Z"), "appliedOpTime" : { "ts" : Timestamp(1698038888, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1698038888, 1), "t" : NumberLong(1) }, "lastAppliedWallTime" : ISODate("2023-10-23T05:28:08.335Z"), "lastDurableWallTime" : ISODate("2023-10-23T05:28:08.335Z") }, "lastStableRecoveryTimestamp" : Timestamp(1698038845, 1), "lastStableCheckpointTimestamp" : Timestamp(1698038845, 1), "electionCandidateMetrics" : { "lastElectionReason" : "electionTimeout", "lastElectionDate" : ISODate("2023-10-23T02:30:24.838Z"), "electionTerm" : NumberLong(1), "lastCommittedOpTimeAtElection" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "lastSeenOpTimeAtElection" : { "ts" : Timestamp(1698028214, 1), "t" : NumberLong(-1) }, "numVotesNeeded" : 2, "priorityAtElection" : 1, "electionTimeoutMillis" : NumberLong(10000), "numCatchUpOps" : NumberLong(0), "newTermStartDate" : ISODate("2023-10-23T02:30:24.912Z"), "wMajorityWriteAvailabilityDate" : ISODate("2023-10-23T02:30:25.497Z") }, "members" : [ { "_id" : 0, "name" : "192.168.122.36:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 10816, "optime" : { "ts" : Timestamp(1698038888, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2023-10-23T05:28:08Z"), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1698028224, 1), "electionDate" : ISODate("2023-10-23T02:30:24Z"), "configVersion" : 3, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "192.168.122.36:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 10680, "optime" : { "ts" : Timestamp(1698038888, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1698038888, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2023-10-23T05:28:08Z"), "optimeDurableDate" : ISODate("2023-10-23T05:28:08Z"), "lastHeartbeat" : ISODate("2023-10-23T05:28:14.347Z"), "lastHeartbeatRecv" : ISODate("2023-10-23T05:28:15.388Z"), "pingMs" : NumberLong(1), "lastHeartbeatMessage" : "", "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "configVersion" : 3 }, { "_id" : 3, "name" : "192.168.122.36:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 8088, "lastHeartbeat" : ISODate("2023-10-23T05:28:14.342Z"), "lastHeartbeatRecv" : ISODate("2023-10-23T05:28:14.369Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "configVersion" : 3 } ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1698038888, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1698038888, 1) }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.注意:复制集将会短暂的关闭连接并进入选举,选举出一个新的主节点。接口将会自动重连。接口可能将会报错 DBClientCursor::init call() failed 。


相关文章
精彩导读
热门资讯
关注我们
