转载: 8天学通MongoDB——第五天 主从复制

  从这一篇开始我们主要讨论MongoDB的部署技术。

    我们知道sql server能够做到读写分离,双机热备份和集群部署,当然mongodb也能做到,实际应用中我们不希望数据库采用单点部署,

如果碰到数据库宕机或者被毁灭性破坏那是多么的糟糕。

 

一:主从复制

1: 首先看看模型图

  

2: 从上面的图形中我们可以分析出这种架构有如下的好处:

     <1>  数据备份。

     <2>  数据恢复。

     <3>  读写分离。

 

3:下面我们就一一实践

     实际应用中我们肯定是多服务器部署,限于自己懒的装虚拟机,就在一台机器上实践了。

第一步:我们把mongodb文件夹放在D盘和E盘,模拟放在多服务器上。

第二步:启动D盘上的mongodb,把该数据库指定为主数据库,其实命令很简单:>mongodb --dbpath='XXX' --master,

           端口还是默认的27017.

第三步:同样的方式启动E盘上的mongodb,指定该数据库为从属数据库,命令也很简单,当然我们要换一个端口,比如:8888。

           source 表示主数据库的地址。

           >mongod --dbpath=xxxx --port=8888 --slave --source=127.0.0.1:27017

第四步:从图中的红色区域我们发现了一条:“applied 1 operations"这样的语句,并且发生的时间相隔10s,也就说明从属数据库每10s

           就向主数据库同步数据,同步依据也就是寻找主数据库的”OpLog“日志,可以在图中红色区域内发现”sync_pullOpLog“字样。

           接下来我们要做的就是测试,惊讶的发现数据已经同步更新,爽啊。

 

4:  如果我还想增加一台从属数据库,但是我不想在启动时就指定,而是后期指定,那么mongodb可否做的到呢?答案肯定是可以的。

      我们的主或者从属数据库中都有一个叫做local的集合,主要是用于存放内部复制信息。

      好,那么我们就试一下,我在F盘再拷贝一份mongodb的运行程序,cmd窗口好多啊,大家不要搞乱了。

    

    看上面的log,提示没有主数据库,没关系,某一天我们良心发现,给他后期补贴一下,哈哈,再开一个cmd窗口,语句也就是

    在sources中add一个host地址,最后发现数据也同步到127.0.0.1:5555这台从属数据库中....

    

 

5: 读写分离

     这种手段在大一点的架构中都有实现,在mongodb中其实很简单,在默认的情况下,从属数据库不支持数据的读取,但是没关系,

在驱动中给我们提供了一个叫做“slaveOkay"来让我们可以显示的读取从属数据库来减轻主数据库的性能压力,这里就不演示了。

 

二:副本集

    这个也是很牛X的主从集群,不过跟上面的集群还是有两点区别的。

      <1>:  该集群没有特定的主数据库。

      <2>:  如果哪个主数据库宕机了,集群中就会推选出一个从属数据库作为主数据库顶上,这就具备了自动故障恢复功能,很牛X的啊。

                 好,我们现在就来试一下,首先把所有的cmd窗口关掉重新来,清掉db下的所有文件。

 

第一步:  既然我们要建立集群,就得取个集群名字,这里就取我们的公司名shopex, --replSet表示让服务器知道shopex下还有其他数据库,

            这里就把D盘里面的mongodb程序打开,端口为2222。指定端口为3333是shopex集群下的另一个数据库服务器。

 

第二步:  既然上面说3333是另一个数据库服务器,不要急,现在就来开,这里把E盘的mongodb程序打开。

 

第三步:  ok,看看上面的日志红色区域,似乎我们还没有做完,是的,log信息告诉我们要初始化一下“副本集“,既然日志这么说,那我也就

             这么做,随便连接一下哪个服务器都行,不过一定要进入admin集合。

 

第四步: 开启成功后,我们要看看谁才能成为主数据库服务器,可以看到端口为2222的已经成为主数据库服务器。

 

第五步:我们知道sql server里面有一个叫做仲裁服务器,那么mongodb中也是有的,跟sql server一样,仲裁只参与投票选举,这里我们

           把F盘的mongodb作为仲裁服务器,然后指定shopex集群中的任一个服务器端口,这里就指定2222。

 

然后我们在admin集合中使用rs.addArb()追加即可。

追加好了之后,我们使用rs.status()来查看下集群中的服务器状态,图中我们可以清楚的看到谁是主,还是从,还是仲裁。

 

不是说该集群有自动故障恢复吗?那么我们就可以来试一下,在2222端口的cmd服务器按Ctrl+C来KO掉该服务器,立马我们发现

在3333端口的从属服务器即可顶上,最后大家也可以再次使用rs.status()来看下集群中服务器的状态。

 
分类: MongoDB
 
好文要顶 关注我 收藏该文  
26
0
 
关注我
 
« 上一篇:8天学通MongoDB——第四天 索引操作
» 下一篇:8天学通MongoDB——第六天 分片技术
posted @ 2012-03-04 23:07 一线码农 阅读(53968) 评论(35编辑 收藏
 

 
  
#1楼2012-03-05 03:21 微笑着醒来  
很好很强大,楼主继续努力哈
  
#2楼2012-03-05 08:22 @清道夫  
CMD背景色设置成那样,你眼睛受得了???
  
#3楼2012-03-05 09:10 灵魂出鞘  
  
#4楼[楼主2012-03-05 10:56 一线码农  
@ 微笑着醒来
好的,继续努力,谢谢支持。
  
#5楼[楼主2012-03-05 10:57 一线码农  
@ 草根码农
还好啊,比默认色舒服多了。
  
#6楼[楼主2012-03-05 10:57 一线码农  
@ 灵魂出鞘
谢谢你的支持
  
#7楼2012-03-05 13:09 杰之蓝  
谢谢博主的分享,很实用的东西。
  
#8楼[楼主2012-03-05 13:33 一线码农  
@ 杰之蓝
能在文章中获取点知识,我还是很开心的啊。
  
#9楼2012-03-05 19:37 杰之蓝  
"errmsg" : "couldn't initiate : set name does not match the set name hos
t 127.0.0.1:10002 expects"

我按照你的说法去做了,可是出现这种错误,请问这个怎么解决呢?
  
#10楼[楼主2012-03-05 21:40 一线码农  
@ 杰之蓝
关于副本集我已经重新修正了,错误的修正方法是将 shopex\127.0.0.1:1111 更正为shopex/127.0.0.1:1111就可以了,谢谢你的支持。
  
#11楼2012-03-09 10:39 永不言败  
master-slave这种模式现在已经不推荐了,现在推荐使用replset这种模式。
  
#12楼[楼主2012-03-09 10:53 一线码农  
@ 永不言败
呵呵,多学一点也不赖,谢谢你的提醒。
  
#13楼2012-03-09 11:04 zzliujianbo  
我配置的副本集中的数据库数据没同步,不知道为什么了。而且在其他数据库中不能进行查询。请教一下
  
#14楼2012-03-09 11:05 zzliujianbo  
引用 一线码农:
@永不言败
呵呵,多学一点也不赖,谢谢你的提醒。

上面的说错了。是集群的其他服务器上不能进行查询。
  
#15楼[楼主2012-03-09 11:47 一线码农  
@ zzliujianbo
默认是不能查询的,要在驱动中要设置SlaveOkay开启。
  
#16楼2012-03-09 11:49 zzliujianbo  
@ 一线码农
恩,多谢,一个副本集能配多少台服务器,我配置了4台,最后一台变成仲裁者服务器了。
  
#17楼2013-04-17 15:22 notnumb  
@ zzliujianbo
刚好看文档,
码农副本集是mongoDB推荐的replica set模式,master slave貌似可以更多。
If your deployment requires more than 11 slave members, you’ll need to use master/slave replication.
  
#18楼2013-09-03 11:23 绝杀fc小飞侠  
@ 杰之蓝
引用 "errmsg" : "couldn't initiate : set name does not match the set name hos
t 127.0.0.1:10002 expects"

我按照你的说法去做了,可是出现这种错误,请问这个怎么解决呢?


同样出现该错误,如何解决???
  
#19楼2013-09-23 16:43 王家湾  
在主从复制中,通过什么方法可以判断出,执行的操作(增删改查)具体在哪个机器(如果部署在同一起机器,则是端口)上执行的?
  
#20楼2013-10-04 13:11 浪迹天涯cc  
使用副本集的方式
如何能做到客户端调用的高可用
你上面的例子中三个端口 如果客户端连接的时候绑定了其中的一个,当这个端口挂掉了,仲裁服务器会选出一个新的来,这个时候客户端的程序需要手动的修改连接新的服务器?
  
#21楼2013-11-19 10:51 yansy115  
@ 浪迹天涯cc
我也很想知道,难道写shell脚本判断哪一台是主服务器?这样话还是要改代码的呀??
  
#22楼2014-06-24 10:45 Yellows  
@ yansy115
引用 @浪迹天涯cc
我也很想知道,难道写shell脚本判断哪一台是主服务器?这样话还是要改代码的呀??

同问!!!
  
#23楼2014-06-24 10:47 Yellows  
当使用副本集的时候,是不是数据连接选中仲裁服务器???
  
#24楼2014-11-20 18:44 sanjingren  
cool
  
#25楼2014-12-14 17:09 有个慵懒  
不好意思,我是边学边在项目中开始用MongoDb的,你例子中的Mongo类是怎么来的?
  
#26楼2015-01-15 12:06 tommy.yu  
大神赞一个
  
#27楼2015-03-06 13:31 爱我所艾  
当使用副本集的时候,我的web程序应该连接哪个服务呢?
  
#28楼2015-04-27 23:42 丹心石  
楼主太厉害了,我也做了许多年的关系型数据库,却对这个非关系型数据库知之甚少,原来做开发的时候就在想,啥时候数据库也能做成跟json一样松散,方便就好了,如今才发现,真有这种东西!茅塞顿开!
  
#29楼2015-07-04 09:38 飞鸿影~  
有些问题,关掉2222端口的服务器,3333和4444都提示:
couldn't connect to server 127.0.0.1:2222(127.0.0.1)

然后再打开2222端口的服务器,现在3333的变成主服务器了。

再关掉3333提示, couldn't connect to server 127.0.0.1:3333 (127.0.0.1),且使用rs.status()显示3333的状态是 "stateStr" : "(not reachable/healthy)"
  
#30楼2015-09-21 11:39 咸鱼翻身  
你好
除了CMD还有其他的命令输入和管理工具吗?
  
#31楼2015-10-27 15:32 dylan2019  
@ 咸鱼翻身
robomongo

mongovue 

都可以
  
#32楼2015-11-10 11:11 AaronYang  
表示成功了,谢谢楼主
  
#33楼2015-12-09 10:22 zuilaibaiyang  
@ AaronYang
我在第一步设置主数据库 就失败了 请问下文章中D:\mongodb\db 这个路径里的db是以个空的文件夹吗?
  
#34楼2015-12-09 11:49 AaronYang  
@ zuilaibaiyang
空的,看我博客吧:http://www.ayjs.net/tags-10019.html
  
#35楼2016-01-29 17:40 王朋  
replSet后面的不应该是副本集的名称吗?
posted @ 2017-06-23 12:18  o李一波o  阅读(383)  评论(0编辑  收藏  举报