MongoDB 副本集

来源:互联网 发布:网络歌手比赛 编辑:程序博客网 时间:2024/04/28 15:24

MongoDB复制是将数据同步在多个服务器的过程。

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 且保证数据的安全性。

复制还允许您从硬件故障和服务中断中恢复数据。

MongoDB复制原理

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从、一主多从。

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

MongoDB复制结构图如下所示:


客户端从主节点读写数据, 主节点与从节点进行数据交互保障数据的一致性。

MongoDB 副本集可分为两种:

Master-Slave 主从复制

实现数据同步只需要在某一台服务器启动时加上"--master"参数,以指明此服务器的角色是primary;另一台服务器加上"-slave"和"-source"参数,以指明此服务器的角色是slave。

主从复制的优点如下:

  • 从服务器可以执行查询工作,降低主服务器访问压力。
  • 在从服务器执行备份,避免备份期间锁定主服务器的数据。
  • 当主服务器出现故障时,可以快速切换到从服务器,减少当机时间。

注意:MongoDB 的最新版本已不再推荐此方案。主从复制虽然可以承受一定的负载压力,但这种方式仍然是一个单点,如果主库挂了,数据写入就成了风险。

Replica Sets复制集

MongoDB 在 1.6 版本对开发了新功能replica set,这比之前的replication 功能要强大一 些,增加了故障自动切换和自动修复成员节点,各个DB 之间数据完全一致,大大降低了维 护成功。auto shard 已经明确说明不支持replication paris,建议使用replica set,replica set 故障切换完全自动。

Replica Sets的结构类似一个集群,完全可以把它当成一个集群,因为它确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他节点马上会将业务接管过来而无须停机操作。

MongoDB 主从架构的副本集的搭建

环境说明:

操作系统:Windows 10操作系统

集群规模:采用三节点集群,一个主节点两个从节点。

节点属性约定

节点角色IPportdbpath主节点(primary)127.0.0.1(本机)27017C:\datta\db从节点1127.0.0.127018D:\data\db从节点2127.0.0.127019E:\data\db在启动Mongod之前创建相应的dbpath目录,打开cmd,输入如下命令:

C:\Users\耿远博>cd /C:\>mkdir data\dbC:\>D:D:\>mkdir data\dbD:\>E:E:\>mkdir data\db
开启主节点Mongod服务:

C:\Users\耿远博>mongod --dbpath c:\data\db --bind_ip 127.0.0.1 --port 27017 --master

        --master参数指定为主节点。

开启两个从节点:

C:\Users\耿远博>mongod --dbpath D:\data\db --bind_ip 127.0.0.1 --port 27018 --slave --source 127.0.0.1:27017C:\Users\耿远博>mongod --dbpath E:\data\db --bind_ip 127.0.0.1 --port 27019 --slave --source 127.0.0.1:27017
           --slave指定此节点为从节点

          --source指定主节点的IP和端口号

通过mongo连接到主节点mongo 127.0.0.1:27017

创建test数据库user集合,并插入两条文档:

> show dbsadmin  0.000GBlocal  0.000GB> use testswitched to db test> dbtest> db.user.insert({_id:1,name:'gyb'})WriteResult({ "nInserted" : 1 })> db.user.insert({_id:2,name:'bobo'})WriteResult({ "nInserted" : 1 })>
主节点的数据会立刻同步到从节点,登陆到从节点查看是否存在同步的数据:

mongo 127.0.0.1:27018

查看数据库出现以下错误:"errmsg" : "not master and slaveOk=false",

需要执行下面命令:

> rs.slaveOk()
然后查看数据库:

> show dbsadmin  0.000GBlocal  0.000GBtest   0.000GB>
看到有test数据库,进入test数据库验证:

> use testswitched to db test> show tablesuser> db.user.find(){ "_id" : 1, "name" : "gyb" }{ "_id" : 2, "name" : "bobo" }>
可以看到数据已经同步过来了。

登陆另一台从节点,也是同样的结果。

需要说明的是,在主节点既可以读又可以写,在从节点只能进行读操作。