MongoDB学习笔记系列:(八) 复制

1、主从集群简介算法

高可用性一般描述一个系统通过专门的设计,从而减小停工时间。shell

保存其服务的高度连续可用性,MongoDB提供的主从复制机制保证了多个数据库的数据同步,这对实现数据库的容灾、备份、恢复、负载均衡都是有极大的帮助.数据库

主从复制的优势:服务器

从服务器能够执行查询工做,下降主服务器访问压力;负载均衡

在从服务器执行备份,避免备份期间锁定主服务器的数据;异步

当主服务器出现故障时,能够快速切换到从服务器,减小当机时间;ide

MongoDB支持在多个机器中经过异步复制到底故障转移和实现冗余,多台机器中同一时刻只有一台是用于写操做,spa

这为mongoDB提供了数据一致性的保障.担当Primary角色的机器能把读操做分发给slave机器。设计


MongoDB的主从集群分为两种:日志

Master-Slave 复制(主从复制)  

Replica Sets 复制(副本集)

主服务器支持增删该,从服务器主要支持读.


Master-Slave(主从复制):

只须要在某一个服务启动时加上-master参数,以指明此服务器的角色是primary,

而另外一个服务加上-slave与-source参数,以指明此服务器的角色是slave. 便可实现同步。

MongoDB的最新版本已经不推荐使用这种方法了。


Replica Sets 复制(副本集):

MongoDB在1.6版本开发了replica set,主要增长了故障自动切换和自动修复成员节点。

各个DB之间数据彻底一致,最为显著的区别在于:

副本集没有固定的主节点,它是整个集群选举得出的一个主节点,当其不工做时变动其它节点。


2、主从复制(Master-Slave)

一、概念:主从复制是一个简单的数据库同步备份的集群技术。简单结构,以下图所示:

(1)、在数据库集群中要明确的知道谁是主服务器,主服务器只有一台。

(2)、从服务器要知道本身的数据源,也就是对于本身的主服务器是谁。

(3)、--master用来肯定主服务器,--slave来控制从服务器, --source肯定从服务的数据源。

二、主从复制集群案例

主服务器:1111

参数配置:

dbpath=D:\Work\MongoDB\Data\1111 #主数据库地址

bind_ip=127.0.0.1 #主数据库所在服务器IP

port=1111 #主数据库端口号

master=true #肯定主服务器


从服务器:2222

参数配置:

dbpath=D:\Work\MongoDB\Data\2222 #从数据库地址

bind_ip=127.0.0.1 #从数据库所在服务器IP

port=2222 #从数据库端口号

source=127.0.0.1:1111 #主数据的服务器IP和端口

#这个配置项(source),能够用shell动态添加

slave=true #肯定从服务器

三、主从复制选项

--only 从节点->指定复制某个数据库,默认是复制所有数据库;

--slavedelay 从节点->设置主数据库同步数据的延迟时间,单位为秒;

--fastsync 从节点->以主数据库的节点快照为节点,启动从数据库;

--oplogSize 主节点->设置oplog的大小(主节点操做记录,存储在local数据库的oplog中);

四、利用shell动态添加和删除从节点

示例:

> use local

switched to db local

> db.sources.find()

{ "host" : "127.0.0.1:1111", "source" : "main", "syncedTo" : { "t" : 1376132657, "i" : 1 } }

从上面的示例中,不难看出从节点中关于主节点的信息,所有存储到local数据库的sources集合中。

咱们只要对sources集合进行操做,就能够动态操做主从关系。

(1)添加数据源

db.sources.insert({"host":"127.0.0.1:1111"})

(2)删除数据源

db.sources.remove({"host":"127.0.0.1:1111"})

3、副本集(Replica Sets)

一、概念:副本集就是具备自动故障恢复功能的主从集群(俗称"故障转移集群")。简单结构,

以下图所示:

1.一、第一张图代表A是活跃的,B和C是用于备份的;

1.二、第二张图代表当A出现了故障,这时候集群根据权重算法,推选出B为活跃的数据库;

1.三、第三张图代表当A恢复后,它自动又会变为备份数据库。

二、特色:

(1)、与普通主从复制集群相比,具备自动检测机制;

(2)、须要使用--replset选项指定副本同伴;

(3)、任什么时候候,副本集当中只容许有一个活跃节点。

三、副本集案例:

A服务器:1111

参数配置:

dbpath=D:\Work\MongoDB\Data\replset\1111 #数据库地址

bind_ip=127.0.0.1 #数据库所在服务器IP

port=1111 #数据库端口号

replSet=child/127.0.0.1:2222 #设定同伴


B服务器:2222

参数配置:

dbpath=D:\Work\MongoDB\Data\replset\2222 #数据库地址

bind_ip=127.0.0.1 #数据库所在服务器IP

port=2222 #数据库端口号

replSet=child/127.0.0.1:3333 #设定同伴

C服务器:3333

参数配置:

dbpath=D:\Work\MongoDB\Data\replset\3333 #数据库地址

bind_ip=127.0.0.1 #数据库所在服务器IP

port=3333 #数据库端口号

replSet=child/127.0.0.1:1111 #设定同伴s

四、初始化副本集

use admin;

db.runCommand({"replSetInitiate":

 {

"_id":"child",#副本集名称

"members":[{

"_id":1, #服务器惟一ID(必须为数字)

"host":"127.0.0.1:1111" #服务器主机地址

},{

"_id":2,

"host":"127.0.0.1:2222"

},{

"_id":3,

"host":"127.0.0.1:3333" 

}]

 }

});

初始化副本集的结果:

{

        "info" : "Config now saved locally.  Should come online in about a minute.",

        "ok" : 1

}

五、查看副本集状态

rs.status();#查看副本集全部服务器状态。

rs.isMaster();#查看副本集中当前服务器状态。

六、查看主从配置信息

在local库中不只有主从日志oplog.rs,还有一个集合用于记录主从配置信息system.replset。

经过执行”db.system.replset.find()”命令查看复制集的配置信息,查询结果以下所示:

child:PRIMARY> use local

switched to db local

child:PRIMARY> db.system.replset.find()

"_id" : "child", "version" : 1, 

"members" : [         

{       "_id" : 1,      "host" : "127.0.0.1:11111" },        

{       "_id" : 2,      "host" : "127.0.0.1:2222" },    

{       "_id" : 3,      "host" : "127.0.0.1:3333" } 

}

七、副本集中的节点类型

standard->常规节点:参与投票有可能成为活跃节点。

passive->副本节点:参与投票,可是不能成为活跃节点。

arbiter->仲裁节点:只是参与投票,不复制节点,也不能成为活跃节点。

八、初始化高级参数

priority:0到1000之间,0表明是副本节点,1到1000是常规节点;

 经过这个咱们能够指明副本集某台服务器节点初始为活跃节点。

arbiterOnly:true,仲裁节点;特定指明某个服务器节点为仲裁节点,仲裁节点不会复制数据,不会成为活跃节点;

其存在的目的只有一个:当前活跃节点失效后,副本集内从新投票选活跃节点时,防止出现僵局!

九、故障切换和活跃点选举

当前活跃节点失效,包括两种状况:

(1)当前活跃节点宕机或自己异常。

(2)当前活跃节点会经过心跳跟踪集群中多少节点对其可见,若是数量小于集群服务器数量的一半,会自动降级为备份节点。

   此时,集群会投票选举出一个新的活跃节点(新比较优先级,优先级相同的,各个节点判断哪一个数据最新,就会投哪一个)。

   任什么时候候,活跃节点的数据会被认为是最新的,当从新肯定了活跃节点后,全部其余节点都要从新进行完整同步(数据可能发生回滚)。

4、在服务器上执行操做

一、读写分离(扩展读)

通常状况下,做为副本的节点是不能进行数据库读操做的,可是在读取密集型的系统中,读写分离是十分必要的。

二、设置读写分离

slaveOkay:true

三、读写分离的特色:

(1)、将密集的读取操做分流到从节点上,下降主节点的负载。

(2)、默认状况下,从节点是不容许处理客户端请求的,须要使用--slaveOkay打开。

    (3)、不适用于实时性要求很是高的应用。

5、工做原理

一、oplog

oplog保存在local数据库中,oplog就在其中的oplog.$main集合内保存。该集合的每一个文档都记录了主节点上执行的一个操做,其键定义以下:

ts:操做时间戳,占用4字符;

op:操做类型,占用2个字节;

ns:操做对象的命名空间(或理解为集合全名);

O:

o:进一步指定所执行的操做,例如插入。

二、同步

(1)、从节点首次启动时,作完整同步;

(2)、主节点数据发生变化时,作增量同步;

(3)、从节点与主节点数据严重不一致时,作完整同步。


6、复制管理

一、诊断

(1)、当链接上主节点后,可使用db.printReplicationInfo(),查看oplog的大小和oplog中操做的时间范围。

(2)、当链接上从节点后,可使用db.printSlaveReplicationInfo(),查看从节点的数据源列表、同步延迟时间等信息。

二、变动oplog的容量

在主节点上使用:

(1)、设定oplogSize参数;

(2)、重启MongoDB数据库;

三、复制认证

主从节点皆须配置:

(1)、存储在local.system.users;

(2)、优先尝试repl用户;

(3)、主从节点的用户配置必须保持一致。

相关文章
相关标签/搜索