龙空技术网

浅谈Linux下MongoDB副本集,近日也是被推向了风尖浪口

双主双机热备 146

前言:

目前看官们对“bully 算法”都比较珍视,大家都想要剖析一些“bully 算法”的相关内容。那么小编在网上汇集了一些对于“bully 算法””的相关文章,希望小伙伴们能喜欢,咱们快快来了解一下吧!

浅谈Linux下MongoDB副本集

近日热点[详情百度]:

1月13日,HackenProof的安全研究员Bob Diachenko发现,MongoDB数据库中有超过2.02亿中国求职者的详细简历信息已在网上被公布,疑似第三方应用泄露。

提示:

此篇皆为简单的理论知识,操作可以直接跳到mongodb部署篇。

上一篇:浅谈关于Mongodb数据库主从复制

讲到了关于Mongodb主从复制一个比较致命的缺点,就是主节点挂了不能自动切换连接到从节点,需手工切换。

这一篇扯一下主从复制的代替者--副本集。

1、副本集概念:

一种在多台机器同步数据的进程,提供数据冗余,扩展数据可用性等等。在多台服务器保存数据,避免了因为一台服务器挂掉导致的数据丢失。也可以从硬件故障或服务中断解脱出来,利用额外的数据副本,从一台机器中进行灾难恢复或者备份。

补充:

副本集拥有一组相同数据的Mongodb实例,主Mongodb接受所有的写操作,其他的实例接受主实例的操作以保持数据同步。副本集只能有一个主实例,主实例接受客户的写操作,为了维持数据一致性,只有一个实例可写,主实例的日志保存在oplog。

2、结构图:

3、原理:

Mongodb的副本集不同于以往的主从模式。

在集群Master故障的时候,副本集可以自动投票,选举出新的Master,并引导其余的Slave服务器连接新的Master,这个过程对于应用是透明的。可以说Mongodb的副本集是自带故障转移功能的主从复制。

集群其中一个为主节点,其余的都为从节点。

主节点上能够完成读写操作,从节点仅能用于读操作。

主节点需要记录所有改变数据库状态的操作,这些记录保存在oplog中,这个文件存储在 local数据库,各个从节点通过此oplog来复制数据并应用于本地,保持本地的数据与主节点的一致。

心跳机制:

集群中的各节点还会通过传递心跳信息来检测各自的健康状况。

当主节点故障时,多个从节点会触发一次新的选举操作,并选举其中的一个成为新的主节点。心跳信息默认每2秒传递一次。

注意:

通常是那个节点的优先级更高,那个节点就是新的主节点。

心跳检测:

集群需要保持一定的通信才能知道哪些节点活着/挂掉。Mongodb节点会向副本集中的其他节点每两秒就会发送一次pings包,如果其他节点在10秒钟之内没有返回,就表示为不能访问。每个节点内部都会维护一个状态映射表,表明当前每个节点是什么角色、日志时间戳等等关键信息。

数据同步:

副本集同步分为初始化同步和keep复制。

One:初始化同步指全量从主节点同步数据。

Two:keep复制指初始化同步过后,节点之间的实时同步一般是增量同步。

复制集成员:

主节点、从节点、投票节点[仲裁节点]。

主节点:

唯一能够接收写请求的节点。

Mongodb在主节点上进行写操作,并会将这些操作记录到主节点的oplog中。

从节点会将oplog复制到其本机并将这些操作应用到其自己的数据集上。

从节点:

从节点将主节点上的oplog复制到本机,并异步的将这些操作记录应用在其自己的数据集上。每个复制集可以拥有多个从节点。

客户端虽然无法在从节点上进行写操作,但却可以进行读操作。

从节点是可以升职为主节点的。一旦现有的主节点不可用了,那么复制集将会发起election 来选择将哪个从节点提升为新的主节点。

投票节点:

投票节点并不含有复制集中的数据集副本,且也无法升职为主节点。

复制集中可能会有多个投票节点来为选举出新的主节点进行投票。

投票节点的存在使得复制集可以以偶数个节点存在,而无需为复制集再新增节点。

补充:

一个复制集至少需要这几个成员:一个主节点 ,一个从节点 ,一个投票节点。

但是在大多数情况下,我们仅仅用3个数据集的节点:一个主节点和两个从节点。

4、 副本集的工作流程

主节点负责处理客户端的读写请求,从节点则负责映射主节点的数据。

即:从节点将主节点上的oplog复制到本机,并异步的将这些操作记录应用在其自己的数据集上。

Oplog[主节点操作记录]:

存储在local数据库中。

副本集中从节点异步的从主节点同步oplog,然后重新执行它记录的操作,以此达到了数据同步的作用。

注意:

1、oplog只记录改变数据库状态的操作。

2、存储在oplog中的操作并不是和主节点执行的操作完全一样。

3、oplog存储在固定集合中,当oplog的数量超过oplogSize,新的操作就会覆盖旧的操作。

数据同步方式:

1、initial sync:

在当副本集中创建一个新的数据库、或者其中某个节点刚从宕机中恢复、或者向副本集中添加新的成员的时候,默认的副本集中的节点会从离它最近的节点复制oplog来同步数据,这个最近的节点可以是primary也可以是拥有最新oplog副本的secondary节点。

该操作一般会重新初始化备份节点,开销较大。

2、 replication:

初始化后这个操作会一直持续的进行着,保持各个secondary节点之间的数据同步。

5、 副本集选举的过程

采用的是Bully算法,一种协调者(主节点)竞选算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。别的节点可以选择接受这个声称或是拒绝并进入主节点竞争,被其他所有节点接受的节点才能成为主节点。节点按照一些属性来判断谁应该胜出,这个属性可以是一个静态ID,也可以是更新的度量像最近一次事务ID。

Primary选举的情景:

1、副本集初始化时。

2、副本集被reconfig。

3、Secondary节点检测到Primary宕机时。

4、Primary节点主动stepDown(主动降级为Secondary)时。

Primary的选举受节点间心跳、优先级、最新的oplog时间等多种因素影响。

心跳:

复制集中的所有members之间都互相建立心跳连接,且每隔两秒发送一次心跳,如果未在10秒内收到回复,则此member将会被标记为"不可用",Secondary(前提是可被选为Primary)会发起新的Primary选举,而其他能正常收到心跳反馈的Secondary能否决新的Primary选举。

优先级:

优先级即Priority值,每个member都有权重值,默认为都为1,members倾向于选举权重最高者。上述提到,priority为0的member不能被选举为primary且不能发起选举;只要当前primary的权重最高或者持有最新oplog数据的secondaries没有比它更高的权重时,集群不会触发选举。当Primary发现有优先级更高Secondary,并且该Secondary的数据落后在10s内,则Primary会主动降级,让优先级更高的Secondary有成为Primary的机会。

Optime:

当前member已经从primary的oplog中应用的最后一个operation的时间戳(此时间戳由primary生成,在oplog中每个操作记录都有);一个member能成为primary的首要条件就是在所有有效的members中它持有最新的optime。

多数派连接:

一个member要成为primary,它必须与"多数派"的其他members建立连接,如果未能与足够多的member建立连接,事实上它本身也无法被选举为primary;多数派参考的是"总票数",而不是member的个数,因为我们可以给每个member设定不同的"票数"。假设复制集内投票成员数量为N,则大多数为 N/2 + 1。

能成为Primary的节点需要的条件有:

1、能够与"多数派"建立连接。

2、在所有有效的members中它持有最新的optime。

3、前两个条件相同的,Priority优先级高的成为Primary。

4、optime与Priority都相等时,谁发起选举,谁当选Primary。

关于mongodb副本集更多的知识

请参考官网

欢迎大家给予宝贵的意见或者建议。

欢迎大家补充或者共享一些其他的方法。

感谢支持。

标签: #bully 算法