MongoDB复制系统:副本集
副本集概念
如果只在一台服务器上部署了mongo数据库,一旦服务器宕机了,整个应用将变得不可用;为了解决这个问题,mongo支持将数据副本保存到多台服务器,这一组服务器就是副本集。
副本集有一个主服务器,多个备份服务器,如果主服务器宕机了,会从副本集中的选一个新的主服务器;
需要注意的内容:
- 主节点在整个副本集中只能有一个;
- 主节点可以执行读写等请求;备份节点只能通过复制功能写入数据,不接受客户端的写入请求;
- 客户端不能从备份节点中读取数据,需要显示在副本节点上执行
setSlaveOk
后才能读取数据; - 可以通过rs辅助函数查看副本集配置,例如
rs.config()
;
选举制度
副本集中有一个很重要的概念"大多数",是指副本集中一半以上的成员;选取主节点时得到大多数支持时就能成为主节点,写入操作被复制到大多数成员时这个写操作就是安全的;因此在配置上应该尽量配置奇数节点,将大多数节点配置在同一个数据中心;
每一个节点都可以申请成为主节点的候选人,但是不能推荐其他成员成为候选人;节点成员候选人的条件:
- 无法连通主节点;
- 节点自身的数据更新为最新的;
- 没有其他更高优先级的成员可以被选举为主节点;
当节点发起申请成为主节点时,它只要得到大多数成员的投票就为成员主节点,即时大多数成员中只有一个否决了本次选举,选举就被取消。
成员配置选项
mongodb针对副本集提供了很多可选配置项,可以为副本集中每个成员设定不同的配置;
选举仲裁者
当副本成员比较少时,例如只有2个副本成员时,这将在任何情况下都不能满足“大多数”的条件,mongo支持了一种特殊类型的成员仲裁者解决以上问题。仲裁者在副本集中的唯一作用就是参与选举,投出决定胜负关键的一票。
- 设置仲裁者的2种方式:
- 使用
rs.addArb()辅助函数
- 通过在在成员中指定配置可选项
arbiterOnly
,例如rs.add("_id":4,"host":"", "arbiterOnly":true)
- 使用
- 仲裁者的特点:
- 一个副本集最多只能有一个仲裁者;
- 仲裁者不保存数据且不为客户端提供服务;
- 只有当副本集节点数量为偶数时才需要配置仲裁者(包含仲裁者本身计算在内);
- 节点一旦变为仲裁者,将不可逆;
优先级
mongo支持设置副本集节点的优先级使得节点有优先权被选为主节点;优先级数值范围为[0,100],默认为1,数值越大对应的优先级更高;当设置为0时,说明节点永远不能成为主节点;
- 通过配置可选项
priority
设置优先级,例如rs.add("_id":4,"host":"", "priority":1.5)
- 对已有的副本集不在在一次reconfig操作中将当前主节点的优先级设置为0,也不能对所有成员优先级都为0的副本集执行reconfig;因为新的配置必须要发送给在新配置中可能成员主节点(优先级非0)的成员;
隐藏成员
如果想把一些节点仅仅用作备份服,不接受客户端读请求时,可以通过把可选配置项hidden
设置为true
隐藏起来;可以通过rs.status()
或者rs.config()
查看有哪些隐藏成员。例如可以把性能比较差的服务器设置为隐藏成员,以降低成本等;
延迟备份节点
可以通过配置项slaveDelay
设置一个延迟备份节点,可选项的值值是延迟的时间(秒),延迟备份节点作用之一为避免数据遭受破坏;需要注意的是,延迟备份节点的优先级是0;
创建索引
对于一些仅用作备份的节点如隐藏节点是不会用到索引的,可以把可选配置项buildIndexs
设置为false
,使得节点不会创建索引,同样设置为false
后将不可逆;另外,这类节点的优先级要求为0;