(由于内容较多,进行了文章删减,阅读全文可以通过点击底部的“理解更多”直接完全浏览)

文章摘自:阿里云开拓者社区

MongoDB副本集

一、副本集根本

phpmongodb副本集MongoDB副本集 JavaScript

1.1 副本集观点

MongoDB副本集是由一个主节点和多个副本节点组成。
主节点将数据的改变推送到副本节点上,在一定的延迟之后,每个MongoDB实例掩护相同的数据。
通过掩护冗余的数据副本,能够实现数据的备份,读写分离和自动故障转移。

1.2 副本集利用场景

数据冗余,用做故障规复利用,当发生硬件故障或者其它缘故原由造成的宕机时,可以利用副本进行规复。
读写分离,读要求会分流到所有副本上,减轻主节点的读压力。

1.3 副本集的故障转移

MongoDB副本集是主从复制的高等形式。
主从复制仅仅实现了数据备份和读写分离,但是主节点一旦宕机,须要手动启动从节点进行故障转移;MongoDB副本集在主从复制根本上实现了故障转移的功能,也便是当主节点宕机时,某一台副本节点会自动提升为新主节点。

1.4 副本集干系命令

rs.initiate() #利用默认配置初始化副本集rs.initiate(cfg) #利用配置文件cfg初始化副本集rs.reconfig(cfg) #修正副本集配置信息rs.status() #查看副本集状态rs.conf() #查看副本集配置rs.add(hostportstr) #添加新的节点 rs.addArb(hostportstr) #添加仲裁节点rs.remove(hostportstr) #删除节点rs.slaveOk() #许可副本节点只读,默认副本节点不许可读写rs.isMaster() #查看哪个节点为主节点rs.printReplicationInfo() #查看oplog大小以及oplog可用韶光,可以判断系统繁忙程度rs.printSlaveReplicationInfo() #查看复制集成员以及延迟rs.stepDown([stepdownSecs, catchUpSecs]) #手动主从切换rs.freeze(secs) #冻结当前节点在指定的韶光内(秒)不能选举为主rs.syncFrom(hostportstr) #管理员临时覆盖当前成员的默认同步目标。
以[hostname]:[port]的形式指定要复制的成员的名称。

二、副本集成员

复制集成员最多50个。
参与Primary选举投票的成员最多7个,其他成员的votes属性必须设置为0,即不参与投票。
一样平常而言,副本集节点有3中类型,主节点(Primary)、副本节点(Secondary)、仲裁节点(Arbiter)。

2.1 主节点

和其他数据库上的主节点一样,可以供应读写做事。

2.2 副本节点

副本节点也基本上和其他类型数据库的从节点一样,可以实现备份和读写分离的浸染。
MongoDB的副本节点可以设置以下几个属性:

2.2.1 优先级为0的节点

优先级为0的节点的特点:

不会升级为主节点;但是可以投票。
此节点正常参与主节点产生的oplog的读取,进行数据备份和命令实行。
此节点可正常参与客户端对付数据的读取,进行担当负载均衡的事情。

Priority=0在mongoDB中的阐明便是一个Standby,可投票不可参选,并且承担负载。
对付Priority为0节点的情形,常日作为一个standby,或由于硬件配置较差,设置为0以利用不可能成为主。

2.2.2 隐蔽节点

这个隐蔽节点是对客户真个隐蔽,客户端如果要读取副本节点的数据,永久无法读取隐蔽节点的数据,由于设置了隐蔽的这个节点对付客户端是透明的,不可见。
但是,对付副本节点和主节点来说都是可见的,以是,隐蔽节点依然可以投票,依然要按照oplog进行命令的复制,只是不参与负载了。

Hidden属性的条件是必须是一个Priority=0的节点,以是会具备一些优先级=0的特点。

隐蔽节点不能当选为主(Priority为0),并且对Driver不可见。
在隐蔽节点上,可做一些数据备份、离线打算的任务,不会影响复制集的做事。
隐蔽节点成员建议总是将其优先级设置为0。
由于对Driver不可见,因此不会作为读节点,隐蔽节点可以作为投票节点。
在分片集群当中,mongos不会同隐蔽节点交互。

2.2.3 延迟节点

延迟节点代表此节点的数据与Primary的数据有一定的延迟,通过设定一个延迟的属性来确定。

此节点必须是一个Priority=0且为Hidden的节点。
此节点虽然又迟延又Hidden,但是还是可以投票。
延迟单位设置为秒。

2.2.4 非投票节点

MongoDB一个副本集最多有7个投票节点,如果还有其它的节点,须要设置为非投票节点。
非投票节点拥有数据副本,但是不参与投票。
其余,非投票节点,其priority必须设置为0。

2.3 仲裁节点

没有数据副本,不会成为主节点,紧张用来选举投票。
当副本集的节点数据为偶数时,须要添加一个仲裁节点。
仲裁节点由于没有数据,只参与投票,以是仲裁节点须要的资源很小,但是不建议将仲裁节点支配在副本集的其他节点上。

三、副本集选举机制

复制集通过rs.initiate()命令进行初始化。
初始化后各个成员间开始发送心跳,并发起主节点选举操作,得到大多数成员投票支持的节点,会成为主节点,别的节点成为副本节点。

当复制集内投票成员数量为N,则大多数为(N/2)+1,当复制集内存活成员数量不敷大多数时,全体复制集将无法选举出主节点,复制集将无法供应写做事,处于只读状态。
Mongodb副本集的选举基于Bully算法,这是一种折衷者竞选算法;主节点的选举受节点间心跳、优先级、最新的oplog韶光等多种成分影响。

触发选举条件:

初始化一个副本集时;从库不能连接到主库(默认超过10s,可通过heartbeatTimeoutSecs参数掌握),由从库发起选举;主库放弃primary角色,比如实行rs.stepDown(30)命令;