一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合。复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础。html
保证数据在生产部署时的冗余和可靠性,经过在不一样的机器上保存副原本保证数据的不会由于单点损坏而丢失。可以随时应对数据丢失、机器损坏带来的风险。shell
换一句话来讲,还能提升读取能力,用户的读取服务器和写入服务器在不一样的地方,并且,由不一样的服务器为不一样的用户提供服务,提升整个系统的负载。服务器
一组复制集就是一组mongod实例掌管同一个数据集,实例能够在不一样的机器上面。实例中包含一个主导,接受客户端全部的写入操做,其余都是副本实例,从主服务器上得到数据并保持同步。网络
主服务器很重要,包含了全部的改变操做(写)的日志。可是副本服务器集群包含有全部的主服务器数据,所以当主服务器挂掉了,就会在副本服务器上从新选取一个成为主服务器。架构
每一个复制集还有一个仲裁者,仲裁者不存储数据,只是负责经过心跳包来确认集群中集合的数量,并在主服务器选举的时候做为仲裁决定结果。并发
基本的架构由3台服务器组成,一个三成员的复制集,由三个有数据,或者两个有数据,一个做为仲裁者。spa
具备三个存储数据的成员的复制集有:日志
一个主库;htm
两个从库组成,主库宕机时,这两个从库均可以被选为主库。blog
当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主库恢复后,做为从库加入当前的复制集群便可。
在三个成员的复制集中,有两个正常的主从,及一台arbiter节点:
一个主库
一个从库,能够在选举中成为主库
一个aribiter节点,在选举中,只进行投票,不能成为主库
说明:
因为arbiter节点没有复制数据,所以这个架构中仅提供一个完整的数据副本。arbiter节点只须要更少的资源,代价是更有限的冗余和容错。
当主库宕机时,将会选择从库成为主,主库修复后,将其加入到现有的复制集群中便可。
复制集经过replSetInitiate命令(或mongo shell的rs.initiate())进行初始化,初始化后各个成员间开始发送心跳消息,并发起Priamry选举操做,得到『大多数』成员投票支持的节点,会成为Primary,其他节点成为Secondary。
『大多数』的定义
假设复制集内投票成员(后续介绍)数量为N,则大多数为 N/2 + 1,当复制集内存活成员数量不足大多数时,整个复制集将没法选举出Primary,复制集将没法提供写服务,处于只读状态。
投票成员数 |
大多数 |
容忍失效数 |
1 |
1 |
0 |
2 |
2 |
0 |
3 |
2 |
1 |
4 |
3 |
1 |
5 |
3 |
2 |
6 |
4 |
2 |
7 |
4 |
3 |
一般建议将复制集成员数量设置为奇数,从上表能够看出3个节点和4个节点的复制集都只能容忍1个节点失效,从『服务可用性』的角度看,其效果是同样的。(但无疑4个节点能提供更可靠的数据存储)
成员 |
说明 |
Secondary |
正常状况下,复制集的Seconary会参与Primary选举(自身也可能会被选为Primary),并从Primary同步最新写入的数据,以保证与Primary存储相同的数据。 Secondary能够提供读服务,增长Secondary节点能够提供复制集的读服务能力,同时提高复制集的可用性。另外,Mongodb支持对复制集的Secondary节点进行灵活的配置,以适应多种场景的需求。 |
Arbiter |
Arbiter节点只参与投票,不能被选为Primary,而且不从Primary同步数据。 好比你部署了一个2个节点的复制集,1个Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(没法选出Primary),这时能够给复制集添加一个Arbiter节点,即便有节点宕机,仍能选出Primary。 Arbiter自己不存储数据,是很是轻量级的服务,当复制集成员为偶数时,最好加入一个Arbiter节点,以提高复制集可用性。 |
Priority0 |
Priority0节点的选举优先级为0,不会被选举为Primary 好比你跨机房A、B部署了一个复制集,而且想指定Primary必须在A机房,这时能够将B机房的复制集成员Priority设置为0,这样Primary就必定会是A机房的成员。 (注意:若是这样部署,最好将『大多数』节点部署在A机房,不然网络分区时可能没法选出Primary) |
Vote0 |
Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个,其余成员(Vote0)的vote属性必须设置为0,即不参与投票。 |
Hidden |
Hidden节点不能被选为主(Priority为0),而且对Driver不可见。因Hidden节点不会接受Driver的请求,可以使用Hidden节点作一些数据备份、离线计算的任务,不会影响复制集的服务。 |
Delayed |
Delayed节点必须是Hidden节点,而且其数据落后与Primary一段时间(可配置,好比1个小时)。 因Delayed节点的数据比Primary落后一段时间,当错误或者无效的数据写入Primary时,可经过Delayed节点的数据来恢复到以前的时间点。 |
更多的见原贴:https://www.cnblogs.com/clsn/p/8214345.html#auto_id_0