自从10 gen用Replica Set取代Master/Slave方案后生活其实已经容易多了,但是真正实施起来还是会发现各种各样的小问题,如果不小心一样会栽跟头。

在跟Replica Set血拼几天之后,笔者写下以下的血泪史,供大家参考。

背景知识

Replica Set的目标是取代Master/Slave方式成为MongoDB新的集群组织方式,目前已经适合生产环境使用。

原理上二者差不多,都是通过local库中的oplog存放操作日志,再重做日志而把操作复制到新的实例上。

按照官方说法,Replica Set提供了更稳定的运行效果,操作更容易,并且提供自动故障恢复特性。相比之下,Master/Slave集群能够胜出的只有“能够容纳更多实例”这一条。原因是前者为了保证实例之间能够互相了解生存状态,需要两两交换心跳(每2秒1次,可以从日志中看到)。这就要求构成一个n(n-1)/2条路径的网络,使得集群额外增加了通讯负担,特别是在集群成员数量巨大的时候将会造成先显著的影响(当然通常情况下是不需要把集群做到这种规模的)。作为交换,Replica Set则够提供了新的故障转移特性。

故障转移介绍

故障转移是通过不同结点之间的角色切换达到的。角色分为三种:Primary,Secondary和Arbiter。顾名思义,Primary是主结点,可进行写入操作。操作日志从Primary向各个Secondary同步并重做达到数据复制的目的。当Primary出现故障时,集群成员会选举其中一个Secondary成为新的Primary。而Arbiter则是一个只参与投票的结点,不复制实际的内容。

影响选举进行的因素包括:

1. 心跳

心跳每2秒进行一次,如果在10秒(5次)内没有收到一个结点的心跳,则认为这个结点已经死亡,需要选举新的Primary结点。

2. priority配置

每个结点都具备Priority设置,默认为1。可以通过以下命令查看

rs.conf()

可能的情况下,集群结点总是选举优先级最高的结点成为新的Primary。优先级0是特殊配置,这样的结点不会成为选举的候选结点(如Arbiter结点)。

当集群中出现了优先级比当前Primary更高的活跃结点时,会发生重新选举,而无论当前Primary是否存活。所以如果之前死亡的高优先级Primary结点恢复工作,并同步完所有操作日志,会马上发生选举使它重新成为Primary。

这在某些情况下会造成问题,因为Primary角色会在不同结点之间来回切换,而切换过程中集群会有短暂的不可用时间。把所有结点的优先级设置为相同则可以保证选举发生的次数更少,但这也不能说一定是件好事。总之没有最好的方案,只有最合适的方案。

3. optime(最后同步时间)

一个结点的最后同步时间必须是最接近Primary的,才有参与选举的资格,否则即使priority高也不行。

所以可以想象在群集中可能发生这样的状况:

Primary A死亡后,Secondary B具有更高的优先级,但同步时间比不上Secondary C。因此C会被优先提升为Primary。此后B从C处同步了最近的操作日志,成为了具备最高优先级,并且操作日志也最新的结点,因此B会成为新的Primary,C降级为Secondary。

当然在同一个网络中,这种情况发生的可能性不高。异地机房则更有可能发生。

4. 投票

一个要成为Primary的结点必须得到集群中大多数成员选票。这里的多数成员并不是指的集群成员的数量,而是指参与投票的成员数量。

所以在3个成员的集群中,一个Primary死亡后,另外两个Secondary会产生出一个新的Primary。而如果2个成员死亡,剩下的一个会保持Secondary身份,因为得不到其他成员的投票。如果剩下的成员是Primary,则它会降级为Secondary。

要注意对于其他成员是否死亡的判断是相对的,一个结点只能判断死亡的结点对自己已经不可见,但是否真的死亡并不确定。也可能是自己从网络中脱离而造成自己对所有人都不可见。MongoDB必须保证任何时候任何情况都只能有一个Primary,因此对于升级的判断也是保守的,宁可不升级为Primary,也不可以让多于一个Secondary升级为Primary(会造成不可逆转的错误)。

要小心集群只剩一个成员的情况,它极有可能变成一个只读的集群,这对生产环境来说是灾难性的。以后的篇幅会讲如何处理这种情况。

5. 网络划分

如果Primary死亡的时候没有一个Secondary得到足够的选票,则集群会变为只读的。因此多数结点应该位于同一个数据中心,避免因为数据中心间的网络故障造成集群变为只读。

从以上问题可以了解到Arbiter的必要性,它的存在可以解决极端情况下集群成员无法投票决定新的Primary的问题。

下一篇将会讲解Replica Set的实际操作情况。

参考文献:MongoDb Manual

关于MongoDb Replica Set的故障转移集群——理论篇的更多相关文章

  1. 关于MongoDb Replica Set的故障转移集群——实战篇

    如果你还不了解Replica Set的相关理论,请猛戳传送门阅读笔者的上一篇博文. 因为Replica Set已经属于MongoDb的进阶应用,下文中关于MongoDb的基础知识笔者就不再赘述了,请参 ...

  2. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  3. (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...

  4. 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群

    需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...

  5. 在Windows 2008/2008 R2 上配置IIS 7.0/7.5 故障转移集群

    本文主要是从:http://support.microsoft.com/kb/970759/zh-cn,直接转载,稍作修改裁剪而来,其中红色粗体部分,是我特别要说明的 若要配置 IIS 7.0 和 7 ...

  6. sqlserver2008 复制,镜像,日志传输及故障转移集群区别

    一, 数据库复制 SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步, ...

  7. 部署AlwaysOn第一步:搭建Windows服务器故障转移集群

    在Windows Server 2012 R2 DataCenter 环境中搭建集群之前,首先要对Windows服务器故障转移集群(Windows Server Failover Cluster,简称 ...

  8. SQL AlawaysOn 之四:故障转移集群

    声明,故障转移集群,仅安装在SQL服务器中,域服务器不能和SQL服务器一起加入集群. 1.添加故障转移集群,下一步 2.安装 3.在域控制服务器上的管理工具里打开故不障转移集群管理器,选择创建集群 4 ...

  9. Windows Server2012 故障转移集群之动态仲裁(Dynamic Quorum)

    本篇文章主要介绍Windows2012的故障转移集群一个新功能“动态仲裁”,默认该功能是开启的: 动态仲裁能在当前群集投票出现分歧的情况下取消某些节点的投票权限,比如偶数个节点的群集环境.仲裁见证和动 ...

随机推荐

  1. 国内Lua先驱的Lua源码总结

    http://www.codingnow.com/temp/readinglua.pdf <Lua源码欣赏> By 云风

  2. echart 图表 在.net中生成图片的方法

    经过中午近两个小时的努力,终于可以实现了:echart 图表 在.net中生成图片 以下源代码: 前台页面: <!DOCTYPE html><html><head> ...

  3. ListView中使用type需要注意的东西

    在使用ListView时,如果使用了getItemViewType, 记得他的值一定要是从0开始计数的. 且要覆盖getViewTypeCount方法.并且让getViewTypeCount>g ...

  4. 常见的MIME类型

    超文本标记语言文本 .htm,.html text/html 普通文本 .txt text/plain GIF图形 .gif image/gif JPEG图形 .ipeg,.jpg image/jpe ...

  5. php mysql 中文乱码解决方法

    本文章向码农们介绍php mysql 中文乱码解决方法,对码农们非常实用,需要的码农可以参考一下. 从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行 解 ...

  6. windows Phone 浏览器窗口的尺寸

    移动设备的屏幕一般都比PC小很多,移动设备的浏览器会将一个较大的  “虚拟”  窗口映射到移动设备的屏幕上,然后按一定的比例(3:1或2:1)进行缩放.也就是说当我们加载一个普通网页的时候,移动浏览器 ...

  7. Begin using git (Part1) - Git的安装与配置

    Git提供了适用于Linux, Windows, OSX的客户端, 本节以Windows为例介绍基本安装与配置. 所需工具:msysgit, kdiff3. Get windows installer ...

  8. Tile-Based Deferred Rendering

    目前所有的移动设备都使用的是 Tile-Based Deferred Rendering(TBDR) 的渲染架构.TBDR 的基本流程是这样的,当提交渲染命令的时候,GPU 不会立刻进行渲染,而是一帧 ...

  9. 【翻译习作】 Windows Workflow Foundation程序开发

    近期整理硬盘,把09年的翻译习作<Windows Workflow Foundation程序开发>找出来了.现在又把译文过了一遍,做了些修改,贴出来献丑了.原书是<Programmi ...

  10. alter table <表名 > add constraint <主键名>用法

    alter table <表名 > add constraint  <主键名>用法介绍 1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是分空 因为主键约束: ...