一 MongoDB 复制集简介
    
    MongoDB的复制机制主要分为两种:
         Master-Slave    (主从复制)      这个已经不建议使用
         Replica Set       (复制集)           MongoDB在1.6版本中开发的新功能,官方推荐使用

       MongoDB复制集比之前的Master-Slave架构功能强大,支持在多个机器中通过异步复制的方式来实现数据库的数据冗余,大大降级了单点故障的风险,并且可以实现故障的自动切换。默认情况下,多台机器同一时间只能由一台用于读写操作,从而提供了数据的强一致性,各个DB之间数据完全一致。
   
        MongoDB复制集成员是由一组mongod进程实例组成,其实 Replica Set的结构类似于一个集群,完全可以把它当作一个集群,因为它确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他节点马上就会将业务接管过来而无须停机操作。

二 Replica Set 成员介绍

    MongoDB复制集的成员包括:主节点、从节点和仲裁节点三大类,下面一一做详细介绍。

   1.
主节点(Primary)
 
   
     主节点负责所有写请求,
主节点是复制集里唯一一个可以接受写操作请求的,主节点会将其所有的写操作记录到oplog日志上,从节点就可以复制oplog日志,将这些操作应用到自己的节点上。
     默认的情况下,客户端会将其所有读请求发给主节点,但是也可以通过配置让从节点具有读取数据能力。
     一个复制集最多只能有一个主节点,当其不可用(或者是资格不够的时候)的时候,通过选举算法从从节点中选择一个来作为新的主节点。
           
    2.从节点(Secondaries)

     从节点通过复制主节点数据(通过读取操作日志文件)l来保持数据的一致性。 另外,通过一些配置(比如说不让其拥有投票权、将其优先级设置为零)从节点还可以使其拥有某些特殊的作用。主要有以下的几种常见当配置:
   
       2.1.优先级设置为0(Priority 0):将一个从节点的优先级设置为零,失去了被选举权,该节点就不可以成为主节点了。

    注意:  a.Priority0节点虽然没有被选举权,但是拥有选举权,在选举中可以投票,另外它也会保持一份主节点的数据,可以接受读操作。
                b.Priority0节点在进行多数据中心部署的时候是十分有用的,可以将主从节点放到主数据中心,priority0放到另外一个,这样可以增加数据当安全性。

             c.此外,Priority0可以作为一个替补成员,当复制集中有成员不可用的时候,可以很快的顶替上 , 也可以把硬件比较差的机器设置为Priority0。

     2.2.Hidden成员:Hidden成员对客户端来说是不可见的,因此不对外提供
读请求,
该类从节点只是拥有一份备份数据。

   注意:a.Hidden成员同样也会保持主节点的一份数据,但是它对客户端来说是不见的,db.isMaster() 不会显示Hideen成员 。Hidden成员也是一个Priority0成员,只拥有投票权。
             b.Hidden成员与其他从节点的链路是单向通信的,其他节点不能发送请求给Hidden成员,因为Hidden对于其他节点来说也是不可见的,这样的话Hidden成员的网络通讯压力就比较小,我们可以使用它来做报告或者备份。如果要做备份的话,我们应该确保Hidden节点和主节点之间网络带宽,尽可能减小复制滞后的时间,尽量保持两者间数据高度的一致性。
          
     2.3 历史快照延迟(Delayed)成员:该类从节点不会与主节点数据保持时间上的一致,它保存了现在之前的数据,相当有一个历史快照。
      a.延迟成员反映了主节点一个更早的状态,比如说我们设置一个延迟一个小时的Delayed成员,当前是9:52,那么一个Delayed成员只记录了8:52之前的数据。由于Delayed成员记录数据的滞后性,当我们进行系统升级过程中或者一些操作导致错误的话,那么可以利用Delayed成员记录的数据来进行操作回滚。
       b.Delayed成员既是Priority0也是hidden.它同样也拥有投票权利。
       c.Delayed成员以“滞后”的方式来从主节点操作日志同步数据,所以当我们设置Delayed成员的滞后时间的时候不能太大,因为操作日志是会更新的(是一个Capped Collection),如果设置延迟时间太长的话,操作日志记录的很早的操作可能
 
就会被更新掉,但是又不能设置的太小,如果太小的话就失去了Delayed成员存在当意义(应该大于系统维护或者升级的窗口时间)。

     在下面的5个成员复制集例子中,一个主节点和4个从节点都存有一份数据,其中一个成员被设置为延迟3600秒(一个小时),注意到一个Delayed成员也是一个Priority0和Hidden成员。

   我们可以像下面这样设置一个Delayed成员:

     "_id" : <null> ,
    "host" : <hostname:port> , 
    "priority" : 0,
    "slaveDelay" : <seconds> ,
    "hidden" : true

 }

     注意:1.每一个从节点都拥有一份主节点的数据拷贝,它们通过主节点(或者是从节点,只要是该从节点操作日志比自己的操作日志记录的操作新的话)操作日志记录的信息,异步的完成写操作。
          
    3.仲裁节点(arbiter) 仲裁者可以成为复制集的成员,它不会存储数据,它的主要作用是用来投票的。例如当复制集有偶数个成员时,可以添加一个仲裁者。
  
      注意:只有当复制集中可以投票的节点数目为偶数的时候我们可以添加一个仲裁者。例如下图所示,一个复制集原来有四个成员,这个时候我们可以添加一个仲裁者,仲裁者不存储数据。



注意:一个复制集最多只能有12个成员,每次同时只能有7个成员可以投票,这样的限制是为了减少投票话费的时间,提高故障切换的效率。


三 总结

    复制集的使用对于用户来说是透明的。
客户端也可以通过配置“读引用”从 从节点获取数据,但是此时获取的数据可能不是最新的,因为可能主节点的操作数据还未同步到从节点上,这种现象叫“最终一致性”,即如果允许从节点读取数据的话,MongoDB不能保证数据的“强一致性”。



 

MongoDB 复制集 (一) 成员介绍的更多相关文章

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

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

  2. MongoDB复制集成员及状态转换

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...

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

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

  4. MongoDB实战指南(七):MongoDB复制集之复制集工作机制

    http://www.cnblogs.com/longshiyVip/p/5097336.html 概述了复制集,整体上对复制集有了个概念,但是复制集最重要的功能之——自动故障转移是怎么实现的呢?数据 ...

  5. mongodb 复制集

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

  6. MongoDB复制集

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

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

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

  8. MongoDb复制集实现故障转移,读写分离

    前言 数据库技术是信息系统的一个核心技术,发展很快,各种功能类型数据库层出不穷,之前工作中使用过关系型数据库(mysql.oracle等).面相对象数据库(db4o).key-value存储(Memc ...

  9. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

随机推荐

  1. Laravel 5.1 事件、事件监听的简单应用

    ​ 有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作 ...

  2. 定时工作方式2实现1s定时

    定时器的几种工作方式中,除0和前面的1类似都需要初始化计数值,然后开始计数,计数溢出后,需要再次控制计数的初值,但工作模式2不同于此,工作方式2将THx和TLx分开处理,将初值存放在THx中,计数时只 ...

  3. 四句话总结JavaScript作用域

    上一篇文章中简单介绍了一下JS作用域,本篇将作进一步探究和总结. 前言:JavaScript的作用域一直以来都是前端开发中比较难以理解的知识点,JavaScript6中新引入了 let 关键字,用于指 ...

  4. C语言学习总结(二) 运算流程

    第三章.基本运算 (运算符.算数运算符.关系运算符.逻辑运算符.三目运算符.ASXLL码) 一.什么是运算符? 概念:是编译程序执行特定的算术或逻辑操作的符号: 分类:算术运算符. 关系运算符.逻辑运 ...

  5. [置顶] Android Journal

    ==================================================================================================== ...

  6. HTTP状态码——对照表

    ASCII码介绍: HTTP状态码(HTTP Status Code)用来表示web服务器响应客户端的HTTP状态.主要有一下5种状态类型.1xx    消息2xx    成功3xx    重定向4x ...

  7. Table嵌套去掉子table的外边框

    Table表格去掉子表格的边框 1. 父表格 <table align="center" style="border:none;cell-padding:0; ce ...

  8. C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?

    我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一 ...

  9. jap中文转码

    因为js url在传值的过程中使用的是js自己默认的字符集编码规则,我们必须把它转成属于我们自己的编码规格,JSP页面 url=encodeURI(encodeURI(url)); //用了2次enc ...

  10. 翻译文章“AST 模块:用 Python 修改 Python 代码”---!!注意ironpathyon未实现此功能

    https://github.com/upsuper/blog/commit/0214fdd084c4adf2de2ed9912d644fb59ce13a1c +Title: [翻译] AST 模块: ...