千家信息网

MongoDB Replica Set 部署

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,在生产中使用MongoDB, 为了数据安全性和访问稳定性. 副本集是经常被使用到的.书接上回, 话说MongoDB副本集已经安装过很多次了.但是每次都要去 百度 具体命令细节.只好自己整理笔记,记录下
千家信息网最后更新 2025年11月09日MongoDB Replica Set 部署

在生产中使用MongoDB, 为了数据安全性和访问稳定性. 副本集是经常被使用到的.


书接上回, 话说MongoDB副本集已经安装过很多次了.但是每次都要去 百度 具体命令细节.

只好自己整理笔记,记录下来,以备查询.

MongoDB的下载与安装,请参考:

https://blog.51cto.com/hsbxxl/2149500


1. 什么是Replica Set-副本集

副本集就是mongoDB副本所组成的一个集群。

其原理是,写操作发生在主库,从库同步主库的OpLog日志。

集群中没有特定的主库,主库是选举产生,如果主库down了,会再选举出一台主库。

2.早期的MongoDB版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主。目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据。此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server。

简而言之MongoDB 副本集是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。类似于MySQL的MMM架构。更多关于副本集的介绍请见官方文档:

官方文档地址:

https://docs.mongodb.com/manual/replication/

3. 副本集有以下特点:

<1>. 最小构成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。

<2>. 成员数应该为奇数,如果为偶数的情况下添加arbiter,arbiter不保存数据,只投票。

<3>. 最大50 members,但是只能有 7 voting members,其他是non-voting members。


配置副本集

4. 本次实验,配置的是 1主1从1仲裁 的副本集。两个物理机

host1  192.168.67.101:27017host2  192.168.67.102:27017host2  192.168.67.102:27018

5. 分别启动mongo进程

host1上启动primary

mongod --port 27017 --dbpath /mongodbs/mgdata/ --logpath /mongodbs/mgdata/db.log --replSet rs0 --fork

host2上启动secondary

mongod --port 27017 --dbpath /mongodbs/mgdata/ --logpath /mongodbs/mgdata/db.log --replSet rs0 --fork

host2上启动arb

mongod --port 28018 --dbpath /mongodbs/arb/ --logpath /mongodbs/arb/db.log --replSet rs0 --fork


6. 配置副本集,由于只有两台物理机,希望host1机器正常情况下,能更多的做为mongo的primary.所以priority设置为2

#mongo> cfg={ _id:"rs0", members:[ {_id:0,host:'192.168.67.101:27017',priority:2},{_id:2,host:'192.168.67.102',priority:1}, {_id:1,host:'192.168.67.102:28018',arbiterOnly:true}]}

7. 执行初始化节点配置

>rs.initiate(cfg)

8. 查看节点配置&信息

>rs.conf()> rs.status()

9. 具体命令输出如下

> cfg={ _id:"rs0", members:[ {_id:0,host:'192.168.67.101:27017',priority:2},{_id:2,host:'192.168.67.102',priority:1}, {_id:1,host:'192.168.67.102:28018',arbiterOnly:true}]}{"_id" : "rs0","members" : [{"_id" : 0,"host" : "192.168.67.101:27017","priority" : 2},{"_id" : 2,"host" : "192.168.67.102","priority" : 1},{"_id" : 1,"host" : "192.168.67.102:28018","arbiterOnly" : true}]}> rs.initiate(cfg){ "ok" : 1 }
rs0:OTHER> rs.conf(){"_id" : "rs0","version" : 1,"protocolVersion" : NumberLong(1),"members" : [{"_id" : 0,"host" : "192.168.67.101:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 2,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 2,"host" : "192.168.67.102:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 1,"host" : "192.168.67.102:28018","arbiterOnly" : true,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0}}}
rs0:SECONDARY> rs.status(){"set" : "rs0","date" : ISODate("2018-07-24T06:59:34.195Z"),"myState" : 2,"term" : NumberLong(2),"syncingTo" : "192.168.67.101:27017","heartbeatIntervalMillis" : NumberLong(2000),"members" : [{"_id" : 0,"name" : "192.168.67.101:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 60,"optime" : {"ts" : Timestamp(1532415537, 2),"t" : NumberLong(2)},"optimeDate" : ISODate("2018-07-24T06:58:57Z"),"lastHeartbeat" : ISODate("2018-07-24T06:59:32.964Z"),"lastHeartbeatRecv" : ISODate("2018-07-24T06:59:33.372Z"),"pingMs" : NumberLong(0),"electionTime" : Timestamp(0, 0),"electionDate" : ISODate("1970-01-01T00:00:00Z"),"configVersion" : 1},{"_id" : 1,"name" : "192.168.67.102:28018","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 60,"lastHeartbeat" : ISODate("2018-07-24T06:59:32.957Z"),"lastHeartbeatRecv" : ISODate("2018-07-24T06:59:30.356Z"),"pingMs" : NumberLong(0),"configVersion" : 1},{"_id" : 2,"name" : "192.168.67.102:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 615,"optime" : {"ts" : Timestamp(1532415537, 2),"t" : NumberLong(2)},"optimeDate" : ISODate("2018-07-24T06:58:57Z"),"syncingTo" : "192.168.67.101:27017","configVersion" : 1,"self" : true}],"ok" : 1}

更多命令

10.添加从库命令

rs0:PRIMARY> rs.add('host3:27017')

可以指定priority

rs0:PRIMARY> rs.add({host: "host3:27017", priority: 1})

11. 移除一个从库

先关闭从库的mongoDB,然后在主库上移除从库

rs0:PRIMARY> rs.remove('host3:27019')

12. 读写分离

主库,从库都支持读操作。但是,默认情况读也是从主库来读。

从库可以通过设置ReadPreference打开支持读操作,ReadPreference有几种模式:

Primary                       #从主库读,默认primaryPreferred                     #基本上从主库读,主不可用时,从从库读secondary                       #从从库读secondaryPreferred                      #基本上从从库读,从不可用时,从主库读nearest                       #从网络延迟最小的库读

基本上常用的是,Primary,secondary,nearest


13. 副本集的设定中可以通过Tag把成员归类,通过下面方法指定读的类型:

<1>.程序连接的时候,指定读的类型ReadPreference

<2>.用mongo命令连接,只对当前连接有效

rs0:SECONDARY> db.getMongo().setReadPref('secondaryPreferred')


14. 特殊成员类型

Secondary还有一些特殊的成员类型:

Priority 0 #不能升为主,可以用于多数据中心场景

Hidden #对客户端来说是不可见的,一般用作备份或统计报告用

Delayed #数据比副集晚,一般用作 rolling backup 或历史快照



副本集的配置也是比较简单的. 后面有时间,再分享一下MongoDB Sharded Cluster.


参考链接:

https://www.cnblogs.com/ee900222/p/mongodb_2.html

https://blog.51cto.com/zero01/2059033

http://chenzhou123520.iteye.com/blog/1634676


副本 数据 配置 命令 成员 架构 类型 节点 情况 更多 模式 集群 支持 最小 特殊 可以通过 多个 官方 文档 权重 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 肥东企业网络技术咨询收费 郑州高新区电力软件开发公司 维基百科的服务器 青岛市教育局网络安全 通州区品质网络技术客户至上 数据库与数据挖掘技术ppt mfc实现FTP服务器 热血江湖数据库升级经验 落实网络安全保护制度 网信办 网络安全宣传周 青少年网络安全知识题多选题 dell服务器系统引导盘 青浦区新能源软件开发工艺 印度 日益重视网络安全 千兆带宽云服务器 软件开发质量控制要求 网络技术学校杭州 我的世界服务器脚下的地皮在哪里 西安佳利软件开发有限公司 云南昆明互联网服务器 服务器安全性方 网络安全筑牢国家安全防线 算法工程师比软件开发还难吗 网络安全和新冠病毒 奇安信的网络安全部门好吗 网络服务器的工作原理 山东省网络技术大赛初赛内容 周口企业管理软件开发 虚拟主机25个数据库什么意思 软件开发风险规避图片
0