摘要:下一小节我会和大家分享如何在真实的生产环境中创建副本集。好了,中副本集的搭建我们就先说到这里,小伙伴们有问题欢迎留言讨论。
我们之前的案例都是在单个节点上实现的,在生产环境中这种做法是有风险的,如果服务宕机、崩溃或者硬盘坏了都会对公司业务造成损失,因此我们需要数据备份。在MongoDB中我们可以通过副本集来实现这一需求,MongoDB副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成,如果Primary崩溃了,会自动从Secondary中选择一个将其升级为新的主服务器,本文我们先来看看副本集环境的搭建。
本文是MongoDB系列的第十五篇文章,了解前面的文章有助于更好的理解本文:
1.Linux上安装MongoDB
2.MongoDB基本操作
3.MongoDB数据类型
4.MongoDB文档更新操作
5.MongoDB文档查询操作(一)
6.MongoDB文档查询操作(二)
7.MongoDB文档查询操作(三)
8.MongoDB查看执行计划
9.初识MongoDB中的索引
10.MongoDB中各种类型的索引
11.MongoDB固定集合
12.MongoDB管道操作符(一)
13.MongoDB管道操作符(二)
14.MongoDB中MapReduce使用
我们在实际的生产环境中肯定是多台服务器部署,但是在自己学习过程中,我们可以在一台服务器上来模拟这个环境,这样可以简化我们的操作,让小伙伴们快速上手。下一小节我会和大家分享如何在真实的生产环境中创建副本集。
好了,开始吧。
首先我们在Linux根目录下创建/data/db目录作为我们的数据保存目录,然后执行如下命令启动一个mongo shell:
mongo --nodb
--nodb表示启动时不连接任何数据库,然后通过如下命令创建一个副本集:
replicaSet=new ReplSetTest({nodes:3})
在创建的日志中,我们可以看到三个实例的端口号,我这里分别是20000、20001、20002,此时我们的副本集创建好了,但是并未启动,接下来执行如下命令启动三个mongodb实例:
replicaSet.startSet()
再执行如下命令配置复制功能:
replicaSet.initiate()
这样环境基本就配好了,此时当前的shell不要关闭,我们重新打开一个Linux命令窗口,执行如下命令:
mongo 192.168.248.128:20000/sang_1
表示连接端口为20000的那个实例中的sang_1数据库,连接成功后,我们可以执行如下命令查看当前实例的身份,如下:
db.isMaster()
返回的数据很多,其中有一条是"ismaster" : true,表示这是一个主节点,此时我们再分别打开两个Linux窗口,分别执行如下两条命令,进入另外两个节点:
mongo 192.168.248.128:20001/sang_1 mongo 192.168.248.128:20002/sang_1
连接成功之后,依然可以通过db.isMaster()命令来查看备份节点的身份,我们发现此时"ismaster" : false,表示这是一个备份节点,此时我们可以先做个简单的测试了,此时我在主节点(端口为20000)那个节点上写一个文档,写完之后,我们看看其他副本集成员上是否有我刚才的写的文档的副本,执行命令顺序如下:
主节点写入数据:
db.collect1.insert({x:"hahaha"})
任意一个副本节点,先执行如下命令表示可以从备份节点读取数据:
db.setSlaveOk()
然后再在备份节点中执行如下命令读取数据:
db.collect1.find()
此时,我们发现数据已经备份成功了。
如果此时我们尝试向备份节点中直接写入文档,会发现写入失败,这里需要注意备份节点中的数据都是备份来的,不可以直接写入,想写入,除非等它的身份转为主节点才可以。
此时,我们尝试通过如下命令关闭主节点:
use admin db.shutdownServer()
然后查看两个备份节点的db.isMaster(),发现有一个备份节点自动上位成为了主节点。
最后如果想关闭副本集,可以回到第一个shell命令行中,输入如下命令:
replicaSet.stopSet()多台服务器模拟
OK,以上操作是我们单台服务器模拟搭建副本集,方便我们做实验,在生产环境中,我们可能有多个服务器,多台服务器又要如何搭建副本集呢?各位看官继续向下看。
首先准备好三台装好了MongoDB的服务器,地址分别如下:
192.168.248.128 192.168.248.135 192.168.248.136
修改每台服务器的配置文件mongodb.conf,添加replSet=rs,表示副本集的名称,修改后的配置文件内容如下:
dbpath=/opt/mongodb/db logpath=/opt/mongodb/logs/mongodb.log port=27017 fork=true replSet=rs
修改完成之后,分别启动三台服务器上的MongoDB,启动成功之后,连接上任意一台的shell,连接成功之后,先定义配置文件,如下:
config={_id:"rs",members:[{_id:0,host:"192.168.248.128:27017"},{_id:1,host:"192.168.248.135:27017"},{_id:2,host:"192.168.248.136:27017"}]}
id后面跟着的是副本集的名称,也就是我们在mongodb.conf中定义的名称,后面三个是副本集的成员,定义好之后,再执行如下命令初始化副本集:
rs.initiate(config)
初始化成功之后,我们就可以通过rs.status()来查看副本集的状态,也可以看到每个服务器的角色,部分日志内容如下:
{ "members" : [ { "_id" : 0, "name" : "192.168.248.128:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", }, { "_id" : 1, "name" : "192.168.248.135:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "syncingTo" : "192.168.248.128:27017" }, { "_id" : 2, "name" : "192.168.248.136:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "syncingTo" : "192.168.248.128:27017", } ] }
我们可以看到每台服务器的角色,有primary,也有secondary,secondary上还注明了从哪个服务器上同步数据。所有这些工作做好之后,我们就可以按照上文介绍的方式来测一下这里的副本集了,测试工作我就不再重复介绍了。
好了,MongoDB中副本集的搭建我们就先说到这里,小伙伴们有问题欢迎留言讨论。
参考资料:
1.《MongoDB权威指南第2版》
更多资料请关注公众号:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/19147.html
摘要:搭建分片分区集群环境安装三台机器关闭防火墙主节点副节点仲裁仲裁主节点副节点副节点仲裁主节点端口分配下载并且安装所有版本二进制文件自行下载改名分别在每台机器建立六个目录,因为不存储数据,只需要建立日志文件目录即可。 搭建 MongoDB分片(sharding) / 分区 / 集群环境 1. 安装 MongoDB 三台机器 关闭防火墙 systemctl stop firewalld.se...
摘要:我们可以在添加节点时指定优先级,如下也可以为已有的节点设置优先级好了,中副本集的配置我们就先说到这里,小伙伴们有问题欢迎留言讨论。 上篇文章我们搭建了MongoDB副本集的环境,验证了数据已经可以成功的复制,本文我们就来看看MongoDB副本集的其他操作。 本文是MongoDB系列的第十六篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装MongoDB 2.Mo...
摘要:复制一份,命名为,修改文件内容如下注意改为我们第一步创建的目录,端口号改为这个随意,只要该端口没被占用即可,表示这是一个配置服务器,另外由于我们的配置服务器要做成备份集,所以要设置。 分片是指将数据拆分,拆分后存放在不同的机器上的过程,以此来降低单个服务器的压力,同时也解决单个服务器硬盘空间不足的问题,让我们可以用廉价的机器实现高性能的数据架构。有的小伙伴不理解分片和副本集的差异,一言...
摘要:集群搭建方式主从复制目前官方已不推荐使用副本集的副本集不同于以往的主从模式。分片是一种可以水平扩展的模式在数据量很大时特给力实际大规模应用一般会采用这种架构去构建。 mongodb集群搭建方式 1.master-slave 主从复制 目前官方已不推荐使用 2.Replica Sets 副本集 showImg(https://segmentfault.com/img/bVbsIpa?w=...
摘要:当一个原本运行正常的成员无法访问到时,该成员就处于的状态。成员被从副本集中移除时就变成这个状态。表示当前服务器最后一次收到其他成员心跳的时间。表示同步的数据源。 副本集环境的搭建以及一些基本的操作我们都了解了,本文我们来看看这个数据复制到底是怎么实现的。 本文是MongoDB系列的第十七篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装MongoDB 2.Mon...
阅读 3040·2021-09-22 15:54
阅读 3951·2021-09-09 11:34
阅读 1748·2019-08-30 12:48
阅读 1144·2019-08-30 11:18
阅读 3408·2019-08-26 11:48
阅读 847·2019-08-23 17:50
阅读 2095·2019-08-23 17:17
阅读 1222·2019-08-23 17:12