MongoDB副本集搭建

咱们以前的案例都是在单个节点上实现的,在生产环境中这种作法是有风险的,若是服务宕机、崩溃或者硬盘坏了都会对公司业务形成损失,所以咱们须要数据备份。在MongoDB中咱们能够经过副本集来实现这一需求,MongoDB副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成,若是Primary崩溃了,会自动从Secondary中选择一个将其升级为新的主服务器,本文咱们先来看看副本集环境的搭建。 node

本文是MongoDB系列的第十五篇文章,了解前面的文章有助于更好的理解本文: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使用shell


单台服务器模拟

咱们在实际的生产环境中确定是多台服务器部署,可是在本身学习过程当中,咱们能够在一台服务器上来模拟这个环境,这样能够简化咱们的操做,让小伙伴们快速上手。下一小节我会和你们分享如何在真实的生产环境中建立副本集。 数据库

好了,开始吧。 服务器

首先咱们在Linux根目录下建立/data/db目录做为咱们的数据保存目录,而后执行以下命令启动一个mongo shell:学习

mongo --nodb

--nodb表示启动时不链接任何数据库,而后经过以下命令建立一个副本集:测试

replicaSet=new ReplSetTest({nodes:3})

在建立的日志中,咱们能够看到三个实例的端口号,我这里分别是20000、2000一、20002,此时咱们的副本集建立好了,可是并未启动,接下来执行以下命令启动三个mongodb实例:spa

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版》

更多资料请关注公众号:

图片描述

相关文章
相关标签/搜索