标签:ack 方式 time 并且 _id .com 相同 分析 恢复
防止设备(服务器、网络)故障。
提供自动failover 功能。
技术来保证数
当发生故障时,可以从其他节点恢复。
用于分析、报表,数据挖掘,系统任务等。
用于备份。
MongoDB复制集由一组mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点。
接收所有来自客户端的写操作,MongoDB Driver(客户端)的所有数据都写入Primary,Primary通过将所有数据集的变动记录到oplog中以支持复制的Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。
一个复制集只能有一个主节点。由于在一个复制集中只有一个成员能够接收写操作,复制集为所有来自主节点的读提供了严格的一致性校验 。
将主节点上的oplog复制过来并应用这些操作来修改其自己的数据集以确保从节点的数据集与主节点的数据集一致。
一旦主节点不可用了,复制集就会将一个从节点选举成为新的主节点。
仲裁节点(投票节点)中并不包含数据集,投票节点的作用仅仅是在选举过程中参与投票。
当复制集的成员个数为偶数时,添加一个投票节点可以防止平局的出现,通过多数选票来选举出新的主节点。
由于投票节点仅提供投票功能,故无需一个专用的物理机。
Priority0节点的选举优先级为0,不会被选举为Primary。
比如你跨机房A、B部署了一个复制集,并且想指定Primary必须在1机房,这时可以将B机房的复制集成员Priority设置为0,这样Primary就一定会是A机房的成员。
注意:如果这样部署,最好将大多数节点部署在A机房,否则网络分区时可能无法选出Primary。
Hidden节点不能被选为主(Priority为0),并且对Driver不可见。
因Hidden节点不会接受Driver的请求,可使用Hidden节点做一些数据备份、离线计算的任务,不会影响复制集的服务。
Delayed节点必须是Hidden节点,并且其数据落后与Primary一段时间(可配置,比如1个小时)。
因Delayed节点的数据比Primary落后一段时间,当错误或者无效的数据写入Primary时,可通过Delayed节点的数据来恢复到之前的时间点。
Primary与Secondary之间通过oplog来同步数据,Primary上的写操作完成后,会向特殊的local.oplog.rs特殊集合写入一条oplog,Secondary不断的从Primary取新的oplog并应用,从而实现Replication的功能。同时由于其记录了Primary上的写操作,故还能将其用作数据恢复。可以简单的将其视作MySQL中的binlog。
Oplog是一个capped collection。
在64位的Linux, Solaris,FreeBSD, and Windows系统中,MongoDB默认将其大小设置为可用disk空间的5%(默认最小为1G,最大为50G)。
MongoDB复制集里的Secondary会从Primary上同步数据,以保持副本集所有节点的数据保持一致,数据同步主要包含2个过程:
先通过init sync同步全量数据,再通过replication不断重放Primary上的oplog同步增量数据。
1、T1时间,从Primary同步所有数据库的数据(local除外),通过listDatabases + listCollections + cloneCollection命令组合完成,假设T2时间完成所有操作。
2、从Primary应用[T1-T2]时间段内的所有oplog,可能部分操作已经包含在步骤1,但由于oplog的幂等性,可重复应用。
3、根据Primary各集合的index设置,在Secondary上为相应集合创建index。(每个集合_id的index已在步骤1中完成)。
初始化选出Primary后,此时Secondary上无有效数据,oplog是空的,会先进行initial sync,然后不断的应用新的oplog 。
因新成员上无有效数据,会先进行initial sync,然后不断的应用新的oplog。
MongoDB复制集在以下场景会发生Primary的选举:
MongoDB采用投票算法进行选举!!!
Primary的选举受节点间心跳、优先级、最新的oplog时间等多种因素影响。
复制集成员间默认每2s会发送一次心跳信息,如果10s未收到某个节点的心跳,则认为该节点已宕机;
如果宕机的节点为Primary,Secondary(前提是可被选为Primary)会发起新的Primary选举。
每个节点都倾向于投票给优先级最高的节点。
优先级默认为1,取值为0 – 1000。
优先级为0的节点不会主动发起Primary选举。
当Primary发现有优先级更高Secondary,并且该Secondary的数据落后在10s内,则Primary会主动降级,让优先级更高的Secondary有成为Primary的机会。(reconfig)
拥有最新optime(最近一条oplog的时间戳)的节点才能被选为主。
只有更大多数投票节点间保持网络连通,才有机会被选Primary;
如果Primary与大多数的节点断开连接,Primary会主动降级为Secondary。当发生网络分区时,可能在短时间内出现多个Primary。
{ "_id" : <num> "host" : <hostname:port>, "votes" : 0 }
复制集通过replSetInitiate命令(或mongo shell的rs.initiate())进行初始化,初始化后各个成员间开始发送心跳消息,并发起Priamry选举操作,获得大多数成员投票支持的节点,会成为Primary,其余节点成为Secondary。
假设复制集内投票成员数量为N,则大多数为N/2 + 1,当复制集内存活成员数量不足大多数时,整个复制集将无法选举出Primary,复制集将无法提供写服务,处于只读状态。
优先级(priority):用于选举主节点。
隐藏节点:用于数据分析等目的。
延迟节点:避免人为误操作。
配置案例:
w: 0 | 1 | n | majority | tag
j:1
wtimeout:millis
默认情况下,复制集的所有读请求都发到Primary,Driver可通过
设置Read Preference来将读请求路由到其他的节点。
标签:ack 方式 time 并且 _id .com 相同 分析 恢复
原文地址:https://www.cnblogs.com/klyyk0950/p/10224655.html