一 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. PERL高效代码摘录 - 数组

    1. 2个数组找不同 ,,,,,,); ,); %seen=(); foreach(@a_hast_g){ ; } @unique=grep($seen{$_},@a_cl_g); } map { $ ...

  2. oracle 查看表的定义

    select t.table_name 表名, c.comments 字段名称, t.column_name 字段编码, t.data_type || '(' || to_char(t.data_le ...

  3. #Leet Code# Sqrt

    描述:log(n) 代码: class Solution: # @param x, an integer # @return an integer def getVal(self, begin, en ...

  4. zend studio 9.0.4 安装破解

    转载于 http://www.geekso.com/ZendStudio9-key 注册破解步骤第一步:如果已经安装过Zend Studio 9.0.4的,请打开Zend Studio 9.0.4,在 ...

  5. 寡人写的第一个HTML5页面

    好吧,其实是抄来的 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"/> &l ...

  6. String, StringBuffer, StringBuilder比较

    1.见API: String是不可变的字符序列: StringBuffer是线程安全的,可变的字符序列: StringBuilder是可变的字符序列: StringBuffer与String的区别是S ...

  7. [转贴]Windows下gSoap交叉编译环境的搭建

    本人直接就用过gSoap,它是用以C/C++写webservice的利器     交叉编译的时候,有两个很关键的程序:         soapcpp2.exe         wsdl2h.exe ...

  8. 测试用(编写优质嵌入式C程序)

    注:相比于Word,如果使用CSDN自带编辑器写出结构清晰的文档,需要花费更多的时间,所以我尝试将我写的一些word文档转换为图片发布,这样就可以保持原来的结构.字体,可以获得更好的可读性.图片的分辨 ...

  9. 《鸟哥的Linux私房菜》读书笔记三

    1.在Linux系统中,每个设备都被当成一个文件来对待,每个设备都会有设备文件名.比如 IDE接口的硬盘文件名为/dev/hd[a-d] 括号内的字母为a-d当中任意一个,即/dev/hda,/dev ...

  10. ActionBar 中setDisplayHomeAsUpEnabled和setHomeButtonEnabled和setDisplayShowHomeEnabled方法的理解

    setHomeButtonEnabled这个小于4.0版本的默认值为true的.但是在4.0及其以上是false,该方法的作用:决定左上角的图标是否可以点击.没有向左的小图标. true 图标可以点击 ...