MongoDB 复制集节点增加移除及节点属性配置

简介: 复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致。

复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致。再结合心跳机制,当感知到主节点不可访问或宕机的情形下,辅助节点通过选举机制来从剩余的辅助节点中推选一个新的主节点从而实现自动切换。对于一个已经存在的MongoDB Replica Set集群,可以对其进行节点的增加,删除,以及修改节点属性等等。本文即是围绕这些进行描述。

有关MongoDB复制集概念及其搭建,可以参考:MongoDB 复制集(Replica Set)

一、节点的移除

//当前的演示环境 repSetTest:PRIMARY> db.version() 3.2.11 //主从节点 PRIMARY: localhost:27001 SECONDARY: localhost:27000 SECONDARY: localhost:27002 repSetTest:PRIMARY> rs.remove("localhost:27000") { "ok" : 1 } //移除节点后的状态信息 repSetTest:PRIMARY> rs.status() { "set" : "repSetTest", "date" : ISODate("2016-08-30T05:48:13.010Z"), "myState" : 1, "members" : [ { "_id" : 1, "name" : "localhost:27001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 526, "optime" : Timestamp(1472536085, 1), "optimeDate" : ISODate("2016-08-30T05:48:05Z"), "electionTime" : Timestamp(1472535890, 1), "electionDate" : ISODate("2016-08-30T05:44:50Z"), "configVersion" : 2, "self" : true }, { "_id" : 2, "name" : "localhost:27002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 426, "optime" : Timestamp(1472536085, 1), "optimeDate" : ISODate("2016-08-30T05:48:05Z"), "lastHeartbeat" : ISODate("2016-08-30T05:48:11.805Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:48:12.877Z"), "pingMs" : 0, "syncingTo" : "localhost:27001", "configVersion" : 2 } ], "ok" : 1 } //移除后查看配置文件 //此时版本version为2,只有2个节点 repSetTest:PRIMARY> rs.config() { "_id" : "repSetTest", "version" : 2, "members" : [ { "_id" : 1, "host" : "localhost:27001", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "localhost:27002", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } }

二、节点的增加

repSetTest:PRIMARY> rs.add("localhost:27000") { "ok" : 1 } repSetTest:PRIMARY> rs.status() { "set" : "repSetTest", "date" : ISODate("2016-08-30T05:50:56.678Z"),6 "myState" : 1, "members" : [ { "_id" : 1, "name" : "localhost:27001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 689, "optime" : Timestamp(1472536231, 1), "optimeDate" : ISODate("2016-08-30T05:50:31Z"), "electionTime" : Timestamp(1472535890, 1), "electionDate" : ISODate("2016-08-30T05:44:50Z"), "configVersion" : 3, "self" : true }, { "_id" : 2, "name" : "localhost:27002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 590, "optime" : Timestamp(1472536231, 1), "optimeDate" : ISODate("2016-08-30T05:50:31Z"), "lastHeartbeat" : ISODate("2016-08-30T05:50:55.336Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:50:55.063Z"), "pingMs" : 0, "configVersion" : 3 }, { "_id" : 3, "name" : "localhost:27000", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //增加后的节点此时作为一个从节点 "uptime" : 23, "optime" : Timestamp(1472536231, 1), "optimeDate" : ISODate("2016-08-30T05:50:31Z"), "lastHeartbeat" : ISODate("2016-08-30T05:50:55.342Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:50:55.341Z"), "pingMs" : 0, "configVersion" : 3 } ], "ok" : 1 }

三、启用Arbiter节点

repSetTest:PRIMARY> rs.remove("localhost:27000") { "ok" : 1 } repSetTest:PRIMARY> rs.add({host:"localhost:27000",arbiterOnly:true}) { "ok" : 1 } repSetTest:PRIMARY> rs.config() { "_id" : "repSetTest", "version" : 5, "members" : [ { "_id" : 1, "host" : "localhost:27001", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, // Author : Leshami "priority" : 1, // Blog : http://blog.csdn.net/leshami "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "localhost:27002", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 3, "host" : "localhost:27000", "arbiterOnly" : true, //此处表明当前结点为仲裁节点 "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } } 对于Arbiter也可以使用rs.addArb函数来添加 如:> rs.addArb("localhost:27000") 验证仲裁节点数据写入 repSetTest:PRIMARY> use tempdb switched to db tempdb repSetTest:PRIMARY> db.users.insert({id:1,ename:"robin"}) WriteResult({ "nInserted" : 1 }) # mongo localhost:27000 MongoDB shell version: 3.0.12 connecting to: localhost:27000/test repSetTest:ARBITER> show dbs; 2016-08-30T14:26:26.753+0800 E QUERY Error: listDatabases failed: { "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } at Error (<anonymous>) at Mongo.getDBs (src/mongo/shell/mongo.js:47:15) at shellHelper.show (src/mongo/shell/utils.js:630:33) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47 repSetTest:ARBITER> rs.slaveOk(true) repSetTest:ARBITER> show dbs; //执行该命令,看不到tempdb local 0.281GB test 0.031GB repSetTest:ARBITER> use tempdb switched to db tempdb repSetTest:ARBITER> db.users.count() //执行count,提示节点正在恢复 2016-08-30T14:30:04.571+0800 E QUERY Error: count failed: { "note" : "from execCommand", "ok" : 0, "errmsg" : "node is recovering" } at Error (<anonymous>) at DBQuery.count (src/mongo/shell/query.js:326:11) at DBCollection.count (src/mongo/shell/collection.js:1046:27) at (shell):1:10 at src/mongo/shell/query.js:326

四、设定节点的优先级别(Priority)

 优先级用于确定一个倾向成为主节点的程度。取值范围为0-100 Priority 0节点的选举优先级为0,不会被选举为Primary,这样的成员称为被动成员 对于跨机房复制集的情形,如A,B机房,最好将『大多数』节点部署在首选机房,以确保能选择合适的Primary 对于Priority为0节点的情况,通常作为一个standby,或由于硬件配置较差,设置为0以使用不可能成为主 //如下示例,在新增节点的时候设定该节点的优先级别 repSetTest:PRIMARY> rs.add({"_id":3,"host":"localhost:27000","priority":1.5}) 也可以通过下面的方式修改优先级别 repSetTest:PRIMARY> var config=rs.config() repSetTest:PRIMARY> config.members[2].priority=2 2 repSetTest:PRIMARY> rs.reconfig(config) { "ok" : 1 } 

五、投票节点(Vote)

 投票节点不保存数据副本,不可能成为主节点 Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个 对于超出7个的其他成员(Vote0)的vote属性必须设置为0,即不参与投票 

六、隐藏节点(Hidden)

 Hidden节点不能被选为主(Priority为0),并且对Driver不可见。 因Hidden节点不会接受Driver的请求,可使用Hidden节点做一些数据备份、离线计算的任务,不会影响复制集的服务 隐藏节点成员建议总是将其优先级设置为0(priority 0) 由于对Driver不可见,因此不会作为read preference节点,隐藏节点可以作为投票节点 在分片集群当中,mongos不会同隐藏节点交互 > cfg = rs.conf() > cfg.members[2].priority = 0 > cfg.members[2].hidden = true > rs.reconfig(cfg) 查看设置为隐藏阶段后的属性 repSetTest:SECONDARY> db.isMaster() { "hosts" : [ "localhost:27000", "localhost:27001" ], "setName" : "repSetTest", "setVersion" : 2, "ismaster" : false, "secondary" : true, "primary" : "localhost:27000", "passive" : true, "hidden" : true, //此处表明当前节点为隐藏节点 "me" : "localhost:27002", "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2017-03-06T10:15:48.257Z"), "maxWireVersion" : 4, "minWireVersion" : 0, "ok" : 1 } 

七、延迟节点(Delayed)

 延迟节点包含复制集的部分数据,是复制集数据的子集 延迟节点上的数据通常落后于Primary一段时间(可配置,比如1个小时)。 当人为错误或者无效的数据写入Primary时,可通过Delayed节点的数据进行回滚 延迟节点的要求: 优先级别为0(priority 0),避免参与primary选举 应当设置为隐藏节点(以避免应用程序查询延迟节点) 可以作为一个投票节点,设置 members[n].votes 值为1 延迟节点注意事项: 延迟时间应当等于和大于维护窗口持续期 应当小于oplog容纳数据的时间窗口 > cfg = rs.conf() > cfg.members[2].priority = 0 > cfg.members[2].hidden = true > cfg.members[2].slaveDelay = 3600 > rs.reconfig(cfg) repSetTest:SECONDARY> db.isMaster() { "hosts" : [ "localhost:27000", "localhost:27001" ], "setName" : "repSetTest", "setVersion" : 3, "ismaster" : false, "secondary" : true, "primary" : "localhost:27000", "passive" : true, "hidden" : true, "slaveDelay" : 3600, //此处表面当前节点具有延迟属性,为延迟节点 "me" : "localhost:27002", "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2017-03-06T10:19:57.148Z"), "maxWireVersion" : 4, "minWireVersion" : 0, "ok" : 1 } 

DBA牛鹏社(SQL/NOSQL/LINUX)

目录
相关文章
|
5月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
597 4
|
运维 监控 NoSQL
【MongoDB 复制集秘籍】Secondary 同步慢怎么办?深度解析与实战指南,让你的数据库飞速同步!
【8月更文挑战第24天】本文通过一个具体案例探讨了MongoDB复制集中Secondary成员同步缓慢的问题。现象表现为数据延迟增加,影响业务运行。经分析,可能的原因包括硬件资源不足、网络状况不佳、复制日志错误等。解决策略涵盖优化硬件(如增加内存、升级CPU)、调整网络配置以减少延迟以及优化MongoDB配置(例如调整`oplogSize`、启用压缩)。通过这些方法可有效提升同步效率,保证系统的稳定性和性能。
385 4
|
存储 NoSQL MongoDB
【赵渝强老师】部署MongoDB复制集
本文介绍了如何在单个节点上搭建MongoDB复制集环境,通过监听不同端口实现多节点配置。详细步骤包括创建数据目录、编辑配置文件、启动节点、初始化复制集、查看状态以及测试主从库的读写操作。文中还提供了视频讲解和代码示例,帮助读者更好地理解和操作。
281 0
|
存储 NoSQL MongoDB
【赵渝强老师】MongoDB复制集的体系架构
MongoDB的复制集是一种集群技术,由一个Primary节点和多个Secondary节点组成,实现数据的高可用性。Primary节点处理写入请求,Secondary节点同步数据。当Primary节点故障时,Secondary节点可通过选举成为新的Primary节点。视频讲解和示意图详见正文。
157 0
|
C# UED 开发者
WPF与性能优化:掌握这些核心技巧,让你的应用从卡顿到丝滑,彻底告别延迟,实现响应速度质的飞跃——从布局到动画全面剖析与实例演示
【8月更文挑战第31天】本文通过对比优化前后的方法,详细探讨了提升WPF应用响应速度的策略。文章首先分析了常见的性能瓶颈,如复杂的XAML布局、耗时的事件处理、不当的数据绑定及繁重的动画效果。接着,通过具体示例展示了如何简化XAML结构、使用后台线程处理事件、调整数据绑定设置以及利用DirectX优化动画,从而有效提升应用性能。通过这些优化措施,WPF应用将更加流畅,用户体验也将得到显著改善。
1303 1
|
监控 NoSQL 大数据
【MongoDB复制集瓶颈】高频大数据写入引发的灾难,如何破局?
【8月更文挑战第24天】在MongoDB复制集中,主节点处理所有写请求,从节点通过复制保持数据一致性。但在大量高频数据插入场景中,会出现数据延迟增加、系统资源过度消耗、复制队列积压及从节点性能不足等问题,影响集群性能与稳定性。本文分析这些问题,并提出包括优化写入操作、调整写入关注级别、采用分片技术、提升从节点性能以及持续监控调优在内的解决方案,以确保MongoDB复制集高效稳定运行。
440 2
|
C# 开发者 Windows
全面指南:WPF无障碍设计从入门到精通——让每一个用户都能无障碍地享受你的应用,从自动化属性到焦点导航的最佳实践
【8月更文挑战第31天】为了确保Windows Presentation Foundation (WPF) 应用程序对所有用户都具备无障碍性,开发者需关注无障碍设计原则。这不仅是法律要求,更是社会责任,旨在让技术更人性化,惠及包括视障、听障及行动受限等用户群体。
369 0
|
NoSQL MongoDB Windows
MongoDB 读写分离——Windows MongoDB 副本集配置
MongoDB 读写分离——Windows MongoDB 副本集配置
347 0
|
监控 NoSQL 安全
【MongoDB 专栏】MongoDB 的复制集:高可用性配置
【5月更文挑战第10天】MongoDB的复制集是实现数据高可用性的重要机制,由主节点和次节点构成,主节点处理写操作,次节点同步数据确保一致。在主节点故障时,次节点自动提升接替,保证服务不间断。通过复制集,可实现数据保护、持续服务,适用于关键业务系统和数据备份。配置时需关注网络稳定性、节点性能和数据一致性。案例显示,复制集能有效保障服务高可用,防止数据丢失和业务中断,是现代数据库管理的关键工具。在数据驱动的世界,复制集为高可用性提供了坚实保障。
263 0
【MongoDB 专栏】MongoDB 的复制集:高可用性配置
|
消息中间件 NoSQL 中间件
MongoDB主从结构、仲裁节点
【7月更文挑战第2天】
364 0

推荐镜像

查看更多
下一篇