MongoDB副本集搭建

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


单台服务器模拟

我们在实际的生产环境中肯定是多台服务器部署,但是在自己学习过程中,我们可以在一台服务器上来模拟这个环境,这样可以简化我们的操作,让小伙伴们快速上手。下一小节我会和大家分享如何在真实的生产环境中创建副本集。

好了,开始吧。

首先我们在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版》

原文发布于微信公众号 - 玩转JavaEE(gh_d1ca11234a30)

原文发表时间:2017-12-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux运维学习之路

ansible批量管理软件部署及剧本

服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 S...

8817
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs

前言   前面也学习了一些Node.js的基本入门知道,现在开始进入Web开发的部分;   Node.js提供了http模块,这个模块中提供了一些底层接口,可...

31810
来自专栏王磊的博客

CentOS安装运行NodeJS框架Express

 安装依赖包 yum -y install gcc make gcc-c++ openssl-devel wget 下载/解压NodeJs wget http:...

4079
来自专栏开发技术

将tomcat添加为linux系统服务

  在博客 --》virtualBox安装centos,并搭建tomcat中,讲到了centos下搭建tomcat环境,发现启动tomcat不是那么方便,要是忘...

1492
来自专栏vue学习

5.vue-router之什么是编程式路由

首先我们来讲讲简单的,上面两个方法记住,等效的。 ① 还是在test.vue组件里面写个div并给它添加一个click跳转事件:

1153
来自专栏重庆的技术分享区

Windows环境下msysgit下安装gitflow步骤

1623
来自专栏北京马哥教育

73条日常shell命令汇总,总有一条你需要!

1.检查远程端口是否对bash开放: echo >/dev/tcp/8.8.8.8/53 && echo "open" 2.让进程转入后台: Ctrl + z...

36611
来自专栏州的先生

【博客备案完成,恢复访问】如何直接在浏览器中查看和调试Django-Restful接口

博客zmister.com备案完成,恢复访问,同时问答系统筹备上线中,以后大家有问题可以直接在问答中进行提问:)

1011
来自专栏移动端周边技术扩展

Vue.js学习笔记(1)

851
来自专栏WindCoder

windows下python中pip与easy_install相关

下载地址:https://pypi.python.org/pypi/ez_setup

1051

扫码关注云+社区

领取腾讯云代金券