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)、主从节点的用户配置必须保持一致。