MongoDB分布式设计-主从复制,副本集

1.前言

         为应对互联网业务的快速增加,用户访问在某段时间的快速增加,系统的高可用,可扩展,容错性被放在了越来越重要的位置。随着技术的发展,业界给出了很多解决方案,

 下面为大家介绍下MongoDB的主从复制,副本集在windows 操作系统的部署。

2.主从复制

            顾名思义,数据库主从库,一定为主库和从库。随着持久层压力增加,读写分离的技术已经得到广泛应用。mongoDB 的master-slave设计方式即遵从了上述实现方式。主库负责写入数据,从库负责读取数据;主库在写入数据后,自动把增量数据同步到可用从库节点。以下是代码实现细节:

         1)首先下载MongoDB 企业级版本(https://www.mongodb.com/download-center),然后把MongoDB的bin路径配置到Path路径下,以便MongoDB启动。


         2)设置一个主库,两个从库,配置如下:

        主库(三个文件,1111.conf,):

       

 1111.conf(完成主服务器的配置):

        dbpath = E:\mongodb\database\MS\a #数据库数据文件地址
        port = 1111 #数据库监听端口
        bind_ip = 127.0.0.1 #服务器地址
        master = true  #设置当前数据库为主库

 mongo1111StartServer.bat(加载1111.conf,初始化数据库服务器配置):

        mongd      -config 1111.conf

 mongo1111.bat(启动1111服务器客户端):

       mongo 127.0.0.1:1111


       从库(127.0.0.1:2222)1:

     

  


   2222.conf(完成主服务器的配置):

             dbpath = E:\mongodb\database\MS\b #数据库数据文件地址
              port = 2222 #数据库监听端口
              bind_ip = 127.0.0.1 #服务器地址
              slave =   true  #设置当前数据库为从库

              source = 127.0.0.1:1111#设置从库的主库地址,用于同步数据

            

    mongo2222StartServer.bat(加载2222.conf,初始化数据库服务器配置):

                mongd      -config 2222.conf

    mongo2222.bat(启动1111服务器客户端):

                 mongo 127.0.0.1:2222

          


3)从库(127,0.0.1:3333)2:


   3333.conf(完成主服务器的配置):

             dbpath = E:\mongodb\database\MS\c #数据库数据文件地址
              port = 3333 #数据库监听端口
              bind_ip = 127.0.0.1 #服务器地址
              slave =   true  #设置当前数据库为从库

              source = 127.0.0.1:1111#设置从库的主库地址,用于同步数据

            

    mongo3333StartServer.bat(加载3333.conf,初始化数据库服务器配置):

                mongd      -config  3333.conf

    mongo3333.bat(启动3333服务器客户端):

                 mongo 127.0.0.13333


3)启动三个服务器,观察是否正确启动:

 









4.分别打开CMD,启动三个数据库客户端,操作主库,切换到stu数据库,插入数据可以正常插入,从库插入失败





5.查看从库数据,发现从库已经从主库同步到数据





6)至此,完成主从库搭建。














3.副本集

          一般情况下,MongoDB的主从复制已基本完成分布式应用的需求。然而,随着业务的增加,用户访问的瞬时增加,服务器硬件寿命,故障因素理论存在。因此,一旦主服务器出现故障,无法完成业务请求处理,从库无法同步数据,用户则无法正常访问,因此系统的扩展性,容错性,高可用显得尤为重要。故,MongoDB的副本集技术应用而生。副本集,顾名思义,就是一个个副本的集合,因此不存在特定主服务器,如果已经设置为master的写主库出现故障,系统根据特定算法从数据同步完好,性能较好的读库中推举出另外一个master主写库,继续处理用户的请求,更好保证系统的高可用,高扩展,高容错。

      以下给出部署步骤:

1)首先配置四个MongoDB数据库服务器(设定副本集名称,数据库文件所在路径,数据库监听端口,数据库数据同步之前的缓存空间大小:即数据达到多少时才须同步)打开CMD,输入以下命令后,出现wait for 127.0.0.1:... connection 后,说明创建成功

  a.创建端口为9927数据库服务器:

   mongod     --replSet mayadong  --dbpath E:\mongodb\database\a  --port 9927 --oplogSize 512


b.创建端口为9927数据库服务器:

   mongod     --replSet mayadong  --dbpath E:\mongodb\database\a  --port 9927 --oplogSize 512




c.创建端口为9927数据库服务器:

   mongod     --replSet mayadong  --dbpath E:\mongodb\database\a  --port 9927 --oplogSize 512



d.创建端口为9927数据库服务器:

   mongod     --replSet mayadong  --dbpath E:\mongodb\database\a  --port 9927 --oplogSize 512


亦可以把启动服务端和客户端命令编写成bat文件(批处理文件),每次点击执行





2)启动四台服务器之后,启动任意一台服务器的客户端,进行副本集的配置(主库确定,仲裁者服务器(非必须))

这里选择9927。


config = {

_id:"mayadong",

members:

[


{_id:0,host:"localhost:9927"},

{_id:1,host:“localhost:9928"},

{_id:2,host:"localhost:9929"},

{_id:3,host:"localhost:9930",arbiterOnly:true}


]

}


如若新增服务器,可用config.members.push({_id:3,host:"localhost:9930"}),因其数据结构为栈,支持push,pop操作,所以也用config.members.push(members元素下标)删除服务器节点。


3)进行副本集初始化,执行rs.initiate(config)进行初始化。




4)设置之后,几次命令执行后发现,命令行显示副本集名称:primary,说明设置主从库关系成功,查看副本集状态和当前数据库服务器是否为主库,

发现从库、仲裁库包含9928,9929,9930,当前数据库为主库。







5)设置完成后,进行插入数据操作。



6)待数据插入成功后,启动其他任意一个服务器的客户端(这里选择),查看是否进行数据同步。

在打开客户端是,查看当前服务器数据库时,会出现如下错误,执行rs.slaveOk()即可,设置成从库。


7)观察后,确认数据以及同步。再现数据库故障宕机问题,强行关闭9927已设定服务器,自然在9927客户端无法操作,然后再打开9928,9929,9930,发现9929是数据节点已自动切换为主服务器,完成测试猜想。




4.总结

         在正常情况下,服务器数量足够,运行良好,用户访问适当,主从服务器完全可以通过主从库的读写分离,应对系统压力,保证性能,配置相对简单。但是新业务的增加,服务器的故障,外部系统接入,必然对系统的扩展性,可用性,容错性提出了更高的要求,因此副本集出现解决了MongoDB在这方面的短板,虽然配置相对复杂,但时保证了系统扩展性,可用性,容错性。




















  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值