千家信息网

MongoDB复制集部署和基本管理

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,MongoDB复制集部署和基本管理MongoDB复制集概述复制集(Replica Sets)是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据的可用性,通过复制集可以对硬件故
千家信息网最后更新 2026年11月02日MongoDB复制集部署和基本管理

MongoDB复制集部署和基本管理

MongoDB复制集概述

复制集(Replica Sets)是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据的可用性,通过复制集可以对硬件故障和中断服务进行恢复。

复制集由下列优点:

  • 让数据更安全
  • 高数据可用性(7*24)
  • 灾难恢复
  • 无停机维护(如备份、索引重建、故障转移)
  • 读缩放(额外的副本读取)
  • 副本集对应用程序是透明的

    复制集工作原理

    MongoDB的复制集至少需要两个节点。其中一个节点是主节点(Primary),负责处理客户端的请求,其余的都是从节点(Serondary),负责复制主节点上的数据。

MongoDB各个节点常见的搭配方式为:一主一从或者一主多从。主节点记录所有打操作到oplog中,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作。从而保证从节点的数据与主节点一致。如下图所示:

客户端在主节点写入数据,在主节点写入数据,主节点与从节点进行数据交互保证数据的一致性。如果其中一个节点出现故障,其他节点马上会将业务接过来,无需停机操作。

MongoDB复制集部署

配置多个实例

在上一篇的博客中已经讲解了MongoDB开启多实例的方法,这里就不多赘述,我们用相同的方法创建了四个MongoDB实例。在启动四个实例前,先要修改每个实例的配置文件,配置replSet参数值都为同一个值,这个值作为复制集的名称,具体操作如下:

[root@localhost ~]# vim /usr/local/mongodb/bin/mongodb1.conf port=27017dbpath=/data/mongodb1logpath=/data/logs/mongodb/mongodb1.loglogappend=truefork=truemaxConns=5000replSet=kgcrs                     #配置复制集的名称

在其他的三个实例的配置文件中最后一行,加上相同的一句代码就行。开启四个实例进程。

[root@localhost ~]# export PATH=$PATH:/usr/local/mongodb/bin/#由于之前重启过,重新设置环境变量[root@localhost ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf#开启端口号为27017的实例进程2018-07-17T10:33:29.835+0800 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'about to fork child process, waiting until server is ready for connections.forked process: 3751child process started successfully, parent exiting
初始化配置并启动复制集

启动完4个MongoDB实例后,下面介绍如何配置并启动MongoDB复制集。这里先配置包含3个节点的复制集(后面会再进行添加最后一个实例),Primary代表主节点。Secondary代表从节点

[root@localhost bin]# mongod -f /usr/local/mongodb/bin/mongodb2.conf --smallfilesabout to fork child process, waiting until server is ready for connections.forked process: 20207child process started successfully, parent exiting[root@localhost bin]# mongod -f /usr/local/mongodb/bin/mongodb3.conf --smallfilesabout to fork child process, waiting until server is ready for connections.forked process: 20230child process started successfully, parent exiting[root@localhost bin]# mongod -f /usr/local/mongodb/bin/mongodb4.conf --smallfilesabout to fork child process, waiting until server is ready for connections.forked process: 20253child process started successfully, parent exiting

可以看到四个实例都已经启动成功,对应的端口号都已经打开。然后进入到端口号为27017端口号的实例中。

[root@localhost bin]# mongo   #默认就是端口号为27017的实例> cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.100.201:27017"},{"_id":1,"host":"192.168.100.201:27018"},{"_id":2,"host":"192.168.100.201:27019"}]}#这句代码的意思就是向kgcrs的复制集中添加三个成员> rs.initiate(cfg){ "ok" : 1 }#对复制集进行初始化启动复制集,启动复制集后,可以通过rs.status()查看复制集的完整信息。




增加和删除节点

配置启动复制集后,还可以通过rs.add()和rs.remove()命令方便地添加和删除节点。

kgcrs:PRIMARY> rs.add("192.168.100.201:27020"){ "ok" : 1 }#可以看到27020端口的实例添加成功kgcrs:PRIMARY> rs.remove("192.168.100.201:27019"){ "ok" : 1 }#可以看到27019端口的实例被删除了
MongoDB复制集切换

1、模拟故障自动切换

通过kill命令可以停止复制集的当前节点,然后查看主节点会自动切换到其他节点上,可以看到当前端口为27017的实例为主节点。

[root@localhost bin]# netstat -ntap| grep mongotcp        0      0 0.0.0.0:27019           0.0.0.0:*               LISTEN      20230/mongod        tcp        0      0 0.0.0.0:27020           0.0.0.0:*               LISTEN      20253/mongod        tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      20055/mongod        tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      20207/mongod [root@localhost bin]# kill -9 20055 #kill掉27017端口的进程kgcrs:SECONDARY> rs.status()#可以看到现在的主节点是端口为27019的实例


2、手动进行主从切换

首先要先进入到主节点的实例中,只有主节点才有权限进行主从节点切换。

[root@localhost bin]# mongo --port 27019kgcrs:PRIMARY> rs.freeze(30)   #暂停30s不参加选举{ "ok" : 1 }kgcrs:PRIMARY> rs.stepDown(60,30)  #告诉主节点交出主节点位置,然后维持从节点状态不少于60s,同时等待30s以使主节点和从节点日志同步,再次查看状态,发现主节点已经切换到另外一个实例中。2018-07-18T15:52:53.254+0800 I NETWORK  [thread1] trying reconnect to 127.0.0.1:27019 (127.0.0.1) failed2018-07-18T15:52:53.256+0800 I NETWORK  [thread1] reconnect 127.0.0.1:27019 (127.0.0.1) okkgcrs:SECONDARY> rs.status()

复制集的选举原理

复制的原理

复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录。复制是将主机点的oplog日志同步并应用到其他从节点的过程

选举的原理

节点类型分为标准(host)节点,被动(passive)节点和仲裁(abriter)节点。

(1)只有标准节点可能被选举为活跃(primary)节点,由选举权。被动节点有完整副本,不可能成为活跃节点,有选举权。仲裁节点不复制数据,不可能成为活跃节点,只有选举权。

(2)标准节点与被动节点的区别:priority值高者是标准节点,低者则成为被动节点。

(3)选举规则是票数高者获胜,priority是优先权为0到1000的值,相当于额外增加0到1000的票数。选举结果:票数高者获胜;若票数相同,数据新者获胜。

配置复制集的优先级

重新配置4个节点的MongoDB复制集,设置两个标准节点,哟个被动节点和一个仲裁节点。这个设置要在主节点上配置。

kgcrs:PRIMARY> > cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.58.131:27017","priority":100},{"_id":1,"host":"192.168.58.131:27018","priority":100},{"_id":2,"host":"192.168.58.131:27019","priority":0},{"_id":3,"host":"192.168.58.131:27020","arbiterOnly":true}]}#这句代码分别设置了四个实例的属性,优先级kgcrs:PRIMARY> rs.reconfig(cfg){ "ok":1 }

可以看到现在端口27018的实例,现在是主节点。

模拟主节点故障

如果主节点出现故障,另外一个标准节点将会被选举为新的主节点。

[root@promote ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf --shutdown2018-07-22T09:20:02.706+0800 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'killing process with pid: 9639kgcrs:PRIMARY> rs.isMaster()


可以看到27017端口的实例已经成为主节点。

模拟所有标准节点都出现故障

如果所有标准节点出现故障,被动节点和仲裁节点都不能成为主节点。

[root@promote ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf --shutdown2018-07-22T09:24:08.290+0800 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'killing process with pid: 9740kgcrs:SECONDARY> rs.isMaster()

节点 实例 数据 配置 选举 故障 标准 端口 切换 副本 口号 原理 日志 票数 仲裁 相同 代码 只有 进程 选举权 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 保险科技 互联网保险 互联网科技工作委员会毛军 互联网 科技 贷财互联网科技 有木互联网科技 上海万想互联网科技 金融科技和互联网金融 深圳卡尔迅互联网科技有限公司怎么样 海南科技产业互联网平台 互联网企业和科技型企业 允成互联网科技有限公司融资 浙南科技城互联网大厦建设工程 高科技互联网发展前景如何 工业互联网展湾科技股份有限公司 互联网第三次科技革命特征 版纳互联网科技选哪家 长沙渺峰互联网科技有限公司 瑞安市蟠桃会互联网科技有限公司 知域互联网科技有限公司官网 互联网科技快速发展优美句子 上海睿民互联网科技有限公司 互联网科技未来 上海挚品互联网科技 互联网科技视频 互联网科技的未来发展 富国互联网科技创新基金 厦门比较好的科技互联网公司 洛阳共同富裕互联网科技有限公司 雨阳互联网卡科技有限公司 互联网的黑科技实验室
0