此文已由作者温正湖授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

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

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

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

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

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

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

与选举相关的属性:

1、  是否能被选为Primary,该属性由priority控制,priority越高,就越有机会成为Primary,通常情况下,Primary总是复制集中priority最高的成员,priority为0的Secondary不能被选为Primary,该特性一般用于跨机房部署时,避免failover后新Primary切到另一个机房;

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

与客户端相关的属性:

1、客户端是否可见,该参数由hidden控制,hidden为true表示不可见,客户端无法从该节点读取数据,mongos不会跟其交互;由于对客户端不可见,则肯定不能被选举为Primary,所以其priority属性必须为0;该节点一般用于进行备份等用途。

与数据延迟相关的属性:

1、slaveDelay用于控制该Secondary节点跟Primary节点的复制延迟关系,例如slaveDelay为3600,表示其数据相比Primary落后1小时,延迟判断是通过oplog中的信息来确定。该属性一般作为在线的历史备份,用来回滚人为操作导致的错误,包括误删除数据库或集合等;该属性潜在地需要priority属性为0,hidden属性为true;

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

聊完类型和属性,下面再来看看成员状态,不多不少,MongoDB一共有10种状态,官方将其分为3大类,核心状态(Core States)为三种成员类型对应的属性(PRIMARY/SECONDARY/ARBITER),还有7种属性,被分为其他状态(Other
States)和错误状态(Error States)两类。

按照时间序,其他状态分别为STARTUP、STARTUP2和RECOVERING。每个复制集成员在mongod启动后,都先进入STARTUP状态,然后加载成员的复制集配置,之后进入到STARTUP2状态。如果该成员需要进行初始同步(initial sync),那么它将长期处于该状态,知道同步完所有的数据和索引。随后进入到RECOVERING状态,处于该状态的成员不能接受客户端的读请求,也不能被选举为Primary,但可以进行投票选举。

错误状态如下所示:若成员已加入了复制集,但还未进行状态信息同步的,会被其他复制集成员标记为UNKNOWN;若成员不再能够通过心跳来进行状态同步,即失去联系,则被其他成员标记为DOWN;REMOVED表示该成员已经被移出复制集;成员处于rollback过程时,状态为ROLLBACK,该状态在旧的primary重新加入复制集时可能出现,用于回滚其上还未同步到其他Secondary的操作;FATAL状态表示成员遇到了无法恢复的错误,必须进行人工处理。

选举行为除了受vote和priority两个属性影响外,成员的状态也会影响选举,仅有PRIMARY, SECONDARY, RECOVERING, ARBITER和ROLLBACK五种状态的成员允许进行投票操作。

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 关于评审--从思想到落地

MongoDB复制集成员及状态转换的更多相关文章

  1. MongoDB复制集成员及架构介绍(一)

    MongoDB复制集介绍 MongoDB支持在多个机器中通过异步复制达到提供了冗余,增加了数据的可用性.MongoDB有两种类型的复制,第一种是同于MySQL的主从复制模式(MongoDB已不再推荐此 ...

  2. MongoDB 复制集 (一) 成员介绍

       一 MongoDB 复制集简介          MongoDB的复制机制主要分为两种:          Master-Slave    (主从复制)      这个已经不建议使用       ...

  3. MongoDB复制集高可用选举机制(三)

    复制集高可用选举机制 在上一章介绍了MongoDB的架构,复制集的架构直接影响着故障切换时的结果.为了能够有效的故障切换,请确保至少有一个节点能够顺利升职为主节点.保证在拥有核心业务系统的数据中心中拥 ...

  4. MongoDB复制集的工作原理介绍(二)

    复制集工作原理 1)数据复制原理 开启复制集后,主节点会在 local 库下生成一个集合叫 oplog.rs,这是一个有限集合,也就是大小是固定的.其中记录的是整个mongod实例一段时间内数据库的所 ...

  5. MongoDB 复制集(二) 选举 自动故障切换

    一   复制集的高可用性简介       复制集通过故障自动切换来实现高可用性,当主节点出现故障的时候,从节点可以通过选举成为主节点,而这个过程在大多数当情况下是自动进行的,不需要手动干预.在某些情况 ...

  6. mongodb 复制集

    mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...

  7. MongoDB复制集

    1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...

  8. MongoDB复制集原理、环境配置及基本测试详解

    一.MongoDB复制集概述 MongoDB复制集实现了冗余备份和故障转移两大功能,这样能保证数据库的高可用性.在生产环境,复制集至少包括三个节点,其中一个必须为主节点,一个从节点,一个仲裁节点.其中 ...

  9. 关于 MongoDB 复制集

    为什么要使用复制集 1.备份数据通过自带的 mongo_dump/mongo_restore 工具也可以实现备份,但是毕竟没有复制集的自动同步备份方便. 2.故障自动转移部署了复制集,当主节点挂了后, ...

随机推荐

  1. Swift 基本语法03-"if let"和"guard let"

    1. /// 如果JY_WINDOW有rootViewController, 并且rootViewController类型是AdvertisementViewController,就执行stopPla ...

  2. tp中引入js、css、img的问题

    方法一: 直接把js.css.img放到网站公共目录/Public/下. 然后直接在模板文件中使用__PUBLIC__进行替换. 方法二: 在模块配置文件config.php中配置指定的路径,如下: ...

  3. jquery 处理重新绑定插件的方法

    比如有一个slide的jquery插件,页面打开就对dom进行了绑定. <div class="expert"> <div class="expert- ...

  4. Devexpress ChartControl 柱状图简单例子

    //using DevExpress.XtraEditors; //using DevExpress.XtraCharts; // Create an empty chart. ChartContro ...

  5. loadrunner12-查看controller运行报错详细log

    1.路径为controller-->results-->results setting 2.打开文件夹res/log/***.log,里面会有当前场景运行的log日志. 注:启用这个首先保 ...

  6. 解决 cmake_symlink_library: System Error: Operation not supported

    在编译uchardet时遇到这个错误: cmake_symlink_library: System Error: Operation not supported 创建链接不成功,要确认当前帐户下是否有 ...

  7. asp.net web 通过IHttpAsyncHandler接口进行消息推送

    .消息类,可直接通过这个类推送消息 HttpMessages using System; using System.Collections.Generic; using System.Linq; us ...

  8. 强制另存文件和加扩展名的代码c#

    强制另存为文件+扩展名的代码using System;using System.Collections.Generic;using System.Linq;using System.Web; name ...

  9. linux下集成开发环境之ECLIPSE--在线调试、编译程序

    裸机开发流程 1.编写裸机程序:2.调试裸机程序:3.生成2进制映象(编译.链接.格式转换):4.烧写/运行2进制映象. 注意:我们自己开发的程序等等需要下载到开发板的Nandflash(类似于硬盘功 ...

  10. C# 编写最小化时隐藏为任务栏图标的Window appllication

    1.设置窗体属性showinTask=false 2.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标. 3.添加窗体最小化事件(首先需 ...