MongoDB之复制集(一)原理篇

参考资料

官网:

中文社区:

在线教程:https://university.mongodb.com/

mongodb支持传统的master-slave架构。没有自动故障转移功能,需要指定master和slave端。建议使用复制集架构,复制集架构比复制架构更好维护,功能更强。

一、基本概念

二、复制集架构

最基础的复制集架构是由三个成员组成的。这样的架构为复制集提供了冗余与故障切换的余地。根据应用的需求来设计复制集的架构,尽量避免不必要的复杂化。

复制集应含有奇数个成员

奇数个成员的存在确保了复制集可以正常的选举出主节点。如果副本集现有偶数个成员,那么请增加一个投票节点以保证其成员个数为奇数。

为特殊需求使用隐藏节点和延时节点。

以读为主的架构的负载均衡

决定复制集各成员的分布与功能

物理位置上的节点分布

保证在一个数据中心中拥有多数节点

当复制集在多个数据中心拥有节点,且各数据中心网络隔离时,为了保证数据的复制与传输,各节点之间需要能够正常沟通。

在选举中,各节点需要能够互相沟通来保证其多数性。为了保证复制集节点能够保持多数且能够正常的选举出主节点,我们需要保证一个数据中心拥有复制集中的多数节点。

三、故障切换

复制集通过选举来从当前主节点不可用的困境中恢复。

复制集选举

一旦当前主节点不可用了,复制集就会进行选举并推选出一个新的主节点。

故障切换时的回滚

上应用就辞职的情况下。当主节点重新以一个从节点加入复制集,它将进行 “回滚”,其上得写操作将与复制集中其他成员的保持一致。

MongoDB会尽量避免回滚的发生。回滚如果确实发生了,往往是由于网络导致的。从节点如果无法跟上之前主节点上的写操作的吞吐,那么将会加剧回滚的影响范围。

选取回滚的数据

rollback/目录。回滚数据文件的命名是按照以下规则进行的

<database>.<collection>.<timestamp>.bson

如:records.accounts.2011-05-09T18-10-04.0.bson

影响选举的因素

1.心跳检测

复制集成员每两秒向复制集中其他成员进行心跳检测。如果某个节点在10秒内没有返回,那么它将被标记为不可用。

2.连接

,因为它不能与复制集中多数节点进行沟通。 如果两个从节点不可用了,剩下的主节点将降职为从节点。

3.网络隔离

触发选举的情况

当复制集中没有主节点可用的时候将触发选举,比如:

1.新复制集的初始化。

2.一个从节点无法与主节点进行连接。当从节点们无法与主节点进行沟通的时候将会触发选举。

3.主节点辞职了

主节点将在以下几种情况下辞职:

2.现有的某个从节点在选举中合格,且它又有更高的优先级。

3.当主节点无法与复制集中多数节点进行沟通的时候。

4.有些情况下,在我们需要修改一些复制集配置的时候会触发选举,导致主节点辞职

我们具体来看下选举的过程

心跳检测

假设我们有三个节点的replica sets:a、b、c。在replica sets结构中,这三个节点每2秒会各自向其它两个节点发送一个心跳检测请求。比如a节点向b和c节点各发送了一个心跳检测请求;正常情况下,b、c会返回一个包含自身信息的回复包,回复包中主要包括的信息:它们现在是什么角色(primary 还是 secondary),他们是否能够在必要的时候成为 primary,以及他们当前时钟时间等等。

a节点在收到回复包后,会用这些信息更新自己的一个状态映射表,更新的内容包括:是否有新的节点加入或有老的节点宕掉,这个请求的网络传输时间等等。

而当a节点的映射表发生了变化,那a会进行下面的逻辑判断:如果a是 primary,而另外一个节点出现故障,那么它会查看自己是否还能和集群中大多数节点进行通信,如果不能与大多数节点通信,他会把自己从 primary 降级为 secondary。(在replica sets中,primary 必须能够和集群中的大多数节点进行通信,以免发生网络断开形成两个或多个节点群各自为政的情况,这样会影响到数据的一致性)

关于降级

在 MongoDB 中,写操作默认通过 fire-and-forget 的模式来进行,也就是说写操作通常不关心是否成功,发完请求后客户端就认为成功了。但如果这时候 primary 进行降级操作,那么客户端并不知道这时候 primary 已经降级成为 secondary 了,客户端可能还会将后续的写操作发送给这个节点。这时候刚刚降级的这个 secondary 可以发送一个包说“我已经不是 primary 了”,但是我们上面说过了,客户端根本就无视你这个包。所以客户端根本不知道这次写入已经失败了。

对于这个问题,MongoDB开发人员已经考虑到了,解决方案是,在一个 primary 降级成为 secondary 后,它会将原来的所有连接关闭。这样客户端在下一次写入的时候就会出现 socket 错误。而客户端在发现这个错误之后,就会重新向集群获取新的 primary的地址,并将后续的写操作都往新的服务器上写入。

选举

再来看心跳监测请求:如果a是一个 secondary,那么a会定时检测是否需要选举自己成为 primary。其检测内容包括:

1.是否集群中有其它节点认为自己是 primary?

2.a节点自己是否已经是 primary?

3.a节点自己是否有资格成为 primary?

心有多大,舞台就有多大

MongoDB之复制集(一)原理篇

相关文章:

你感兴趣的文章:

标签云: