MongoDB复制集成员及状态转换

  

复制集(副本集)是MongoDB核心组件,相比早期版本采用的主从(主从)架构,复制集具有很多天然的优势,包括自动故障恢复,多机房部署,读写行为控制等。本文介绍复制集中最基础的部分,就是复制集成员(副本集成员)。大体分为成员的角色及转换,成员状态及转换两部分。

  

先来说说成员角色,可分为主要,次要和仲裁者三类。其中前两种是常规角色,每个复制集在正常状态下都会有这两种角色,仲裁者是一种特殊角色,其不包含用户数据,仅在选举时起作用。在这之中,二次又可以细分出很多熟悉,详见下面描述。

  

MongoDB在分布式架构上与筏相类似,其领导人被称为主要,追随者称为二级,但MongoDB中没有定义候选人角色.Primary即复制集的主节点,是唯一有权限接受客户端写请求的节点,会将所有的插入和更新操作记录到oplog中,也主要是默认所有读请求的目标节点.Secondary复制主要(或其他二级)的oplog记录并本地回放,来保持与原数据一致,可设置为允许客户端读,但默认情况下二级不允许读,需要设置slaveok参数。
 MongoDB复制集成员及状态转换

  

仲裁者与上述两种角色不同,其不包含用户数据副本,复制集中添加仲裁者的目的仅仅是为了选主操作。通常在拥有偶数个节点的复制集中添加(且仅能添加)一个仲裁者,这样可以使一次选举中达到大多数(多数)而避免选举分裂(分裂投票)。如下所示:
 MongoDB复制集成员及状态转换

  

当主要因为某些原因挂掉或降级时,二次可通过选举成为新的初选,原主要恢复并重新加入复制集后,变为Secondary.Arbiter由于不包含用户数据,所以不可能成为初选。这是他们间的相互转换关系.Primary,二级和仲裁者应独立部署在不同的网络节点上,对于云环境下,也不能位于相同的宿主机上,确保相互间数据安全性和选举独立性。

  

一个复制集中仅有一个小学,在某些特殊场景下,可能没有Primary.Arbiter在集群中不是必须的,所以,集群中最普通的角色是次要的,一般不少于2个。不同的二次可以有不同的属性,处于不同的状态中.Secondary属性有如下几类:

  

与选举相关的属性:

  

1,是否能被选为主要,该属性由优先级控制,优先级越高,就越有机会成为主要,通常情况下,主总是复制集中最优先级高的成员,优先级为0的次要不能被选为主要,该特性一般用于跨机房部署时,避免故障转移后新主切到另一个机房;
 MongoDB复制集成员及状态转换

  

2,是否有选举权,MongoDB复制集可以有多大50个成员,但仅允许7个成员有选举权,该属性由票控制,选票为0的成员没有选举权,但可以否决选举,也可以成为初级(可以理解为无法投赞成票,都可以投反对票和发起选举,因为被选举权由优先级控制).MongoDB 3.0版本开始,不允许设置成员的选票大于1。
 MongoDB复制集成员及状态转换

  

与客户端相关的属性:

  

1,客户端是否可见,该参数由隐藏的控制,隐藏为真实表示不可见,客户端无法从该节点读取数据,蒙戈不会跟其交互;由于对客户端不可见,则肯定不能被选举为主要,所以其优先属性必须为0;该节点一般用于进行备份等用途。
 MongoDB复制集成员及状态转换

  

与数据延迟相关的属性:

  

1, slaveDelay用于控制该二级节点跟主节点的复制延迟关系,例如slaveDelay为3600,表示其数据相比主要落后1小时,延迟判断是通过oplog中的信息来确定。该属性一般作为在线的历史备份,用来回滚人为操作导致的错误,包括误删除数据库或集合等;该属性潜在地需要优先属性为0,隐藏属性为真;
 MongoDB复制集成员及状态转换

  

可以看的出,相比MySQL的复制,MongoDB的副本设置成员的类型和属性更为丰富,当然,主要原因是MySQL目前还是主从主从复制,所以与选举相关的属性或角色就没有存在的必要的。但,MySQL也有类似的slaveDelay功能。另外,尚处于实验室状态MySQL组复制正式发布将会惊动数据库界。

MongoDB复制集成员及状态转换