.复制
两种模式: 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。
注意:如果一个优先级比当前Primary node还高的node跟上了当前Primary node,那么也会触发选举,会转化为primary node .
在replica sets中,primary 必须能够和集群中的大多数节点进行通信,以免发生网络断开形成两个或多个节点群各自为政的情况,这样会影响到数据的一致性),否则会自动降级为secondary.
详细的replication set的设计理念请参考官方文档 Replica Set Design Concepts
> // 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
3. 也许其他节点有更久远的oplog .略.
显示oplog的状态大小.保存了多久的日志.
db.printReplicationInfo()
查看oplog大小 # ”storageSize”
> use local
> db.oplog.rs.stats()
oplog更改大小很难,需要停服务,请参考官方文档
One Response