.复制

两种模式: replication set 和 master/slave
当前的存储引擎,不能确保single-server durability, 生产环境需要自动冗余切换,故需要用到replication set模式.
5.1 Replica Sets模式
Replica set 包括Primary node和secondary node
Replica set 其实就是一个有自动故障切换功能的主从集群.如果当前primary node失效了,会选举出一个新的primary node.如果宕机的node重启后,它将成为secondary node . mongodb保证当前只有一个实例是active的(primary node),可写入数据,保证强一致性.  客户端可以自动检测到primary node的变更,发送读写请求给新的primary node.
客户端参数是逗号分隔的主机名(ip):port 字符串.   192.168.1.1:27017,192,168.1.2:27017,192.168.1.3:27017

如何选举呢?

A replica set doesnothold an election as long as the primary has the highest priority value and is within 10 seconds

of the latestoplogentry. If the member drops to beyond 10 seconds of the latest oplog entry, the set holds an election.(官方原文)


参考核心工程师Kristina Chodorow(@kchodorow)的一篇文章 Replica Sets系列文章之:选举
摘录自Krisina的文章: 投票的规则是这样的:如果没有人投反对票,并且赞成票的比例过半,那么本轮选举对象就能够成为 primary。
我们可以设置一个node的优先级(priority)为0 ,即 hidden:true ,这个node可以专门用来备份,或者延迟一段时间,方便查询历史数据.
当一个选举被触发后, 最近更新(10秒内)的节点中优先级最高的将被选举为primary node .
注意:如果一个优先级比当前Primary node还高的node跟上了当前Primary node,那么也会触发选举,会转化为primary node .
在replica sets中,primary 必须能够和集群中的大多数节点进行通信,以免发生网络断开形成两个或多个节点群各自为政的情况,这样会影响到数据的一致性),否则会自动降级为secondary.
详细的replication set的设计理念请参考官方文档 Replica Set Design Concepts
如何添加一个仲裁者,添加一个隐藏属性的成员,如何添加或者变更一个延迟复制(对客户端是隐藏的,但也参与投票)的节点,
参考 Adding a New Set Member ,  Replica Sets slaveDelay
> // add an arbiter


> rs.add({_id: 3, host: “broadway:27017″, arbiterOnly: true})
>
> // add a hidden member
> rs.add({_id: 3, host: “broadway:27017″, priority: 0, hidden: true})
>
> // add a member with tags

> rs.add({_id: 3, host: “broadway:27017″, tags: {dc : “nyc”, rack: “rack1″}})

关于 Replica Sets – Rollbacks (回滚) :  为了数据的一致性, 崩溃(宕机)后重新加入repliation set的节点需要保持和当前主节点的数据一致,可能需要回退部分操作(因为这部分操作并没有同步到当前主节点) .
假如A节点比B节点快30秒, A结点崩溃,B节点切换为主节点, 当A节点重启成功后,此时A节点和B节点的数据并不一致,因为B节点在成为主节点的时候,还有30秒的数据没有同步过来, 这个时候mongodb会在A节点上执行一个回滚操作. 回滚这30秒所做的更新(insert,update,delete等操作).  如果需回滚的数据太多(> 300MB),那么mongodb会提示需手动进行干预. 一般情况下可以允许丢失这部分数据的.
如果需要查看这部分数据,参考官网.
mongodb把操作写入oplog(包括secondary node). 对于replication set, oplog存储在collection local.oplog.rs . 这是一个capped collection ,有固定大小,可以循环写. secondary node可能滞后primary node ,如果secondary node宕机一段时间后再重启,那么它会比较它的oplog和primary node的oplog,然后应用日志跟上primary node.
但如果oplog过小,那么对于频繁写入的应用,次要节点崩溃后再恢复可用,可能需要的oplog已经被覆盖了.
1. 全部重新同步(Perform a full resync)
删除dbpath下的所有文件(或备份) ,重启mongodb,他会自动同步所有数据,可能很耗时,影响生产;
2. 从另一个节点copy数据文件过来 .  #参考Starting with an existing copy of the dataset
关闭另一个节点,把dbpath下的文件copy过来,然后重新启动这两个节点;   #也可以使用 fsync and lock的方法.
3. 也许其他节点有更久远的oplog .略.
显示oplog的状态大小.保存了多久的日志.
db.printReplicationInfo()
查看oplog大小     # ”storageSize”
> use local
> db.oplog.rs.stats()
oplog更改大小很难,需要停服务,请参考官方文档
客户端使用 getlasterror 来确保数据已经复制成功.可用这个命令确定数据已经复制到多少个节点了,是否复制到大部分节点,实现所谓的“群集范围内提交


One Response


    还没有评论!
1  

Leave your comment

请留下您的姓名(*)

请输入正确的邮箱地址(*)

请输入你的评论(*)


感谢开源 © 2016. All rights reserved.&3Q Open Source&^_^赣ICP备15012863号-1^_^
乐于分享共同进步 KreativeThemes