MongoDB副本集

副本集
一.概述

MongoDB中的副本集是一组维护相同数据集的mongod服务。副本集由一个主节点和多个副本节点组成。主节点将数据的改变推送到副本节点上,在一定的延迟之后,每个MongoDB实例维护相同的数据。能够实现数据冗余,读写分离和自动故障转移。

MongoDB副本集可以用于对数据冗余备份,防止某台或某部分机器故障数据丢失,可以使用副本集进行数据恢复。副本集由一个主节点和多个副节点组成,可以实现读写分离,主节点仅负责写工作,副节点负责读工作,可以减轻主节点的压力,同时又有多个副节点提供读服务,实现负载均衡。且任意副节点宕机后也对整个服务不会产生毁灭性的影响。再配合自动故障转移,当主节点宕机后,再从副节点中选举一个新的主节点,实现整个服务的高可用性。
二、副本集角色

副本集有两种类型三种角色
1.两种类型

    主节点类型:数据操作的主要连接点,可读写,但一般只进行写操作。
    次要节点类型:数据冗余备份,提供读能力。或用于主节点掉线选举。

2.三种角色

    主要成员:主要接收所有写操作,即主节点
    副本成员:从节点通过复制操作以维护同主节点相同的数据库,只提供读服务。
    仲裁成员:不存储数据副本,不提供读写服务,仅用于主要成员掉线后选举新的主要成员。

3.仲裁成员

在副本集中仲裁成员可以用于选举新的主要成员,事实上不使用仲裁成员,其他成员也都拥有重新选举新成员的能力。但也不是说仲裁成员毫无作用,当选举新主要成员是,票数一致若无仲裁成员,整个选举环节可能会卡在投票环节,仲裁成员可以用于解决这种问题。我们也可以不部署仲裁成员部署奇数个其他成员,但保不齐掉线几个变为偶数。最后仲裁成员的性价比很高,它不提供数据备份的功能,因此系统资源占用很少。
三、副本集操作
1.搭建

本地搭建副本集,配置3份配置文件,port分布配置27017(主节点),27018(从节点),27019(仲裁节点)。都给3份配置文件设置上副本集名,如:

然后分别用这3份配置文件启动3个mongodb服务,并使用mongosh指令连接27017端口的mongodb服务。主节点执行如下指令

从节点和仲裁节点执行如下指令

2.副本集读写

主节点写入

从节点读取

四、故障说明
1.从节点故障

不受影响,从节点恢复后同步数据。
2.主节点故障

从节点被选举为主节点,主节点恢复后变为从节点,同步数据。
3.仲裁节点 & 主节点故障

从节点无法选举为主节点,因为网络中不存在大多数节点。仲裁节点和主节点故障恢复后,触发重新选举。
4.仲裁节点 & 从节点故障

主节点降级为从节点,因为主节点无法得知是其他节点掉线了还是自己掉线,万一其他节点没有掉线会重新选举一个主节点,就会出现双主节点的情况,这种情况下若主节点所在网络不存在大多数节点会自动降级为从节点。当从节点和仲裁节点恢复,触发重新选举。
五、主节点选举

下面对选举简单介绍,如需要深入了解,自行查找资料。
1.选举条件

假设X是一个从节点,那么X会定时检测是否需要选举自己成为主节点。其检测内容包括:

    是否集群中有其它节点认为自己是主节点?
    X节点自己是否有资格成为主节点?

只有当X节点是一个能够当主节点的从节点,并且其它节点都不是主节点时,X才会发起选举并选自己为主节点。
2.选举因素

    Replication Election Protocol(复制选举协议,选择从3.2开始支持protocolVersion: 1)
    优先级(先看优先级,级别越高,优先为主,priority=0:表示不参与选举、不能成为主)
    optime (如果优先级都相同,则有最新的 optime 的成为主)
    心跳 (副本级中的每个member默认都是每2秒ping 其他节点,protocolVersion:0如果超过{"heartbeatTimeoutSecs" : 10} 默认是10秒 或者 protocolVersion:1时 electionTimeoutMillis 默认是10秒没有回应,则标记节点不可达s_down,类似Redis sentinel主观下线)

3.选举时机 & 规则

时机

    初始化副本集
    主节点故障
    主节点网络不可达
    人工干预,主节点降为从节点(rs.stepDown(600))

规则

当副本集内投票成员数量为N,则大多数为(N/2)+1,当副本集内存活成员数量不足大多数时(网络分裂),整个副本集将无法选举出主节点,副本集将无法提供写服务,处于只读状态。

可以进行选举的副本集,当某个节点没有节点投反对票,且获得赞成票数超过有权投票节点总数的1/2,则能成为主节点。否则进入下一轮选举。

网络分裂

将整个副本集看成一个网络,发生故障副本集被分为一块块相互无法连接的网络即为网络分裂。如果主节点不在大多数的那一块网络中,主节点会变成从节点,多数节点(互相能通信)的那组选举新的主节点。

例外情况:如发生网络分裂,被分裂的一组选举出一个新的Primary,老的Primary还没降级,这就出现了2个Primary,这就是脑裂现象。此时2个Primary都有写入,直到网络恢复后,若老主再次成为Primary,则脑裂过程中选举出的新Primary会回滚脑裂过程新写入的数据;若老主成为Secondary,则回滚老主脑裂过程新写入的数据。
六、oplog

下面对oplog简单介绍,如需要深入了解,自行查找资料。
1.简介

oplog是local库下的一个固定集合,从节点就是通过查看主节点 的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以作为同步源给其他节点。oplog记录着主节点上面的操作记录。

为了提高效率,从节点可以不从主节点获取oplog信息,也可以从其他从节点获取最新的oplog。
2.副本集数据同步过程

主节点写入数据,从节点通过读取主节点的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。

如果某个操作失败(只有当同步源的数据损坏或者数据与主节点不一致时才可能发生),则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,将信息写入自己的oplog。

由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。
七、安全认证

若mongodb开启了安全认证,数据库间的连接也是需要安全认证的,执行以下流程

 

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值