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

来源:互联网 发布:淘宝怎么分期付款手机 编辑:程序博客网 时间:2024/04/29 18:07
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhanyah.blog.51cto.com/2821907/1270518

一、主从集群简介

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

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

主从复制的优点:

从服务器可以执行查询工作,降低主服务器访问压力;

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

当主服务器出现故障时,可以快速切换到从服务器,减少当机时间;

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

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


MongoDB的主从集群分为两种:

Master-Slave 复制(主从复制)  

Replica Sets 复制(副本集)

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


Master-Slave(主从复制):

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

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

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


Replica Sets 复制(副本集):

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

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

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


二、主从复制(Master-Slave)

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

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

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

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

2、主从复制集群案例

主服务器: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 #确定从服务器

3、主从复制选项

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

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

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

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

4、利用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"})

三、副本集(Replica Sets)

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

如下图所示:

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

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

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

2、特点:

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

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

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

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

4、初始化副本集

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

}

5、查看副本集状态

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

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

6、查看主从配置信息

在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" } 

}

7、副本集中的节点类型

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

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

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

8、初始化高级参数

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

 通过这个我们可以指明副本集某台服务器节点初始为活跃节点。

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

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

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

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

(1)当前活跃节点宕机或本身异常。

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

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

   任何时候,活跃节点的数据会被认为是最新的,当重新确定了活跃节点后,所有其他节点都要重新进行完整同步(数据可能发生回滚)。

四、在服务器上执行操作

1、读写分离(扩展读)

一般情况下,作为副本的节点是不能进行数据库读操作的,但是在读取密集型的系统中,读写分离是十分必要的。

2、设置读写分离

slaveOkay:true

3、读写分离的特点:

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

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

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

五、工作原理

1、oplog

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

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

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

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

O:

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

2、同步

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

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

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


六、复制管理

1、诊断

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

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

2、变更oplog的容量

在主节点上使用:

(1)、设定oplogSize参数;

(2)、重启MongoDB数据库;

3、复制认证

主从节点皆须配置:

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

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

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

本文出自 “成长的记忆录” 博客,请务必保留此出处http://zhanyah.blog.51cto.com/2821907/1270518

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 粗跟鞋走路太响怎么办 粗跟鞋鞋跟很响怎么办 皮鞋跟走路太响怎么办 穿高跟鞋脚崴了怎么办 高跟鞋小了一码怎么办 高跟皮鞋磨脚怎么办 大同同煤集团三供一业人员怎么办 小孩被猫咪抓了怎么办 长得特别丑的人怎么办 锅巴放的不脆了怎么办 淘宝买到假货了怎么办 单位不给解约函怎么办 安卓个人热点打不开怎么办 密码忘记无法进入主机怎么办 流放之路w10闪退怎么办 电脑网站被劫持了怎么办 苹果手机浏览器被劫持怎么办 苹果手机网站被劫持怎么办 a37手机网站被劫持怎么办 耳朵被震的耳鸣怎么办 液晶电视怎么办断屏坏还是逻辑板 门保险拧坏了怎么办 锁的保险坏了怎么办 鞋子里面长霉了怎么办 塑料瓶盖滑丝了怎么办? 塑料杯盖滑丝了怎么办 洗衣机上的订子很难扭出来怎么办 滚筒洗衣机坏了打不开门怎么办 海尔滚筒洗衣机打不开门怎么办 格兰仕滚筒洗衣机门打不开怎么办? lg洗衣机洗完衣服门打不开怎么办 lg洗衣机不能冼衣服怎么办 vivo账户密码忘记了怎么办 oppo账户密码忘记了怎么办 74160从1开始计数怎么办 微信录音声音小怎么办 word文档已停止工作怎么办 怀孕30天不想要怎么办 一楼墙体起碱怎么办 农村平房顶四墙面渗水怎么办 被蝎子精蛰了怎么办