【MongoDB】复制集转换成单机模式
2023-02-27 20:50 abce 阅读(834) 评论(0) 编辑 收藏 举报提醒:
1.不建议生产环境使用单机模式
2.切换需要停机时间(需要移除复制参数)
3.切换前建议关闭应用,避免有写操作生产环境是一个三节点的复制集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [ { "_id" : 0, "name" : "node01:27017" , "stateStr" : "PRIMARY" }, { "_id" : 1, "name" : "node02:27017" , "stateStr" : "SECONDARY" , }, { "_id" : 2, "name" : "node03:27017" , "stateStr" : "SECONDARY" , ] |
这里将primary节点切换成单节点后的使用环境。
1.移除复制节点
移除第二节点:
1 2 3 4 5 6 7 8 9 10 11 12 | rs0: PRIMARY > rs.remove( "node02:27017" ) { "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp (1640109346, 1), "signature" : { "hash" : BinData(0, "663Y5u3GkZkQ0Ci7EU8IYUldVIM=" ), "keyId" : NumberLong( "7044208418021703684" ) } }, "operationTime" : Timestamp (1640109346, 1) } |
移除第三节点:
1 2 3 4 5 6 7 8 9 10 11 12 | rs0: PRIMARY > rs.remove( "node03:27017" ) { "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp (1640109380, 1), "signature" : { "hash" : BinData(0, "RReAzLZmHWfzVcdnLoGJ/uz04Vo=" ), "keyId" : NumberLong( "7044208418021703684" ) } }, "operationTime" : Timestamp (1640109380, 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 | rs0: PRIMARY > rs.status().members [ { "_id" : 0, "name" : "node01:27017" , "health" : 1, "state" : 1, "stateStr" : "PRIMARY" , "uptime" : 1988, "optime" : { "ts" : Timestamp (1640109560, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate( "2021-12-21T17:59:20Z" ), "syncSourceHost" : "" , "syncSourceId" : -1, "infoMessage" : "" , "electionTime" : Timestamp (1640107580, 2), "electionDate" : ISODate( "2021-12-21T17:26:20Z" ), "configVersion" : 5, "configTerm" : 1, "self" : true , "lastHeartbeatMessage" : "" } ] |
2.修改配置尽管节点1和节点2不再是复制集的成员,但是还是建议关闭这两个节点的mongodb实例。保持他们数据的安全,也许在有些恢复场景下用的上。
1 2 | node02> systemctl stop mongod node03> systemctl stop mongod |
移除复制集相关的参数:
1 2 | #replication: # replSetName: "rs0" |
重启mongodb实例:
1 | node01> systemctl restart mongod |
3.移除复制对象
这个时候连接到单节点的mongodb,日志会给出警告信息:
1 | 2021-12-21T18:23:52.056+00:00: Document(s) exist in 'system.replset' , but started without --replSet. Database contents may appear inconsistent with the writes that were visible when this node0 was running as part of a replica set. Restart with --replSet unless you are doing maintenance and no other clients are connected. The TTL collection monitor will not start because of this. For more info see http://dochub.mongodb.org/core/ttlcollections |
这是因为老的复制集结构的数据仍然存在的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | mongo> use local switched to db local mongo> show collections oplog.rs replset.election replset.initialSyncId replset.minvalid replset.oplogTruncateAfterPoint startup_log system.replset system. rollback .id system.tenantMigration.oplogView system.views |
要想去掉日志中的警告信息,需要移除这些复制集的对象local.system.replset。
不过local.system.replset是系统对象,没有任何内嵌的角色可以被用来移除该对象。除非你创建了一个角色,授予在anyResource上有anyAction权限;或者你给用户授予了内部角色__system。
这里,我们可以临时创建一个对象,授予__system特权,后面可以删掉该用户:
1 2 3 4 5 6 7 8 9 10 | mongo> db.getSiblingDB( "admin" ).createUser({ user : "dba_system" , "pwd" : "pwd123" , "roles" : [{ "db" : "admin" , "role" : "__system" }]}); Successfully added user :{ "user" : "dba_system" , "roles" :[ { "db" : "admin" , "role" : "__system" } ] } |
创建临时用户后,删除对象:
1 2 3 | mongo> use local ; mongo> db.system.replset.remove({}) WriteResult({ "nRemoved" : 1 }) |
删除临时用户
1 | mongo> db.dropUser( "dba_system" ) |
重启mongodb实例
1 | shell> systemctl restart mongod |
另一个更简单的选择是删除额外的成员,并将其保留为单成员复制集-乍一看可能很愚蠢,但它提供了一些灵活性!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2022-02-27 从mysqldump备份中恢复一个表
2020-02-27 docker安装Elasticsearch:7.6.0启动失败,ERROR: [1] bootstrap checks failed
2018-02-27 mysql 5.7中的threads