复制集简介
Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。
下图为mongodb官方的复制集,包含一个主节点和2个副本节点
节点间心跳
复制集成员间默认每2s会发送一次心跳信息,如果10s未收到某个节点的心跳,则认为该节点已宕机;如果宕机的节点为Primary,Secondary(前提是可被选为Primary)会发起新的Primary选举。
Primary选举
复制集通过replSetInitiate命令(或mongo shell的rs.initiate())进行初始化,初始化后各个成员间开始发送心跳消息,并发起Priamry选举操作,获得『大多数』成员投票支持的节点,会成为Primary,其余节点成为Secondary
1、数据同步
Primary与Secondary之间通过oplog来同步数据,Primary上的写操作完成后,会向特殊的local.oplog.rs特殊集合写入一条oplog,Secondary不断的从Primary取新的oplog并应用。
随和数据量的不断增大,oplog也不断的增加,local.oplog.rs被设置成为了一个capped集合,当oplog的容量达到上限时,会将最旧的数据删除掉。另oplog在Secondary上可能重复应用,oplog必须具有幂等性,即重复应用也会得到相同的结果。(若有一个副本节点以外宕机,当其修复好时还要同步主节点oplog的操作,而有些操作是在它宕机之前已经同步过的,即重复的应用会得到相同的结果。)
2、capped集合
官方文档:https://docs.mongodb.com/manual/core/capped-collections/?spm=a2c4e.11153940.blogcont64.5.5aa067deKA98gi
capped集合是固定大小的集合,支持基于插入顺序插入和检索文档的高吞吐量操作。加盖的集合以类似于循环缓冲区的方式工作:一旦集合填充其分配的空间,它通过覆盖集合中最旧的文档为新文档腾出空间
Arbiter(仲裁节点)
Arbiter节点只参与投票,不能被选为Primary,并且不从Primary同步数据。
比如你部署了一个2个节点的复制集,1个Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(无法选出Primary),这时可以给复制集添加一个 Arbiter节点,即使有节点宕机,仍能选出Primary。
Arbiter本身不存储数据,是非常轻量级的服务,当复制集成员为偶数时,最好加入一个Arbiter节点,以提升复制集可用性。
节点优先级
- 每个节点都倾向于投票给优先级最高的节点
- 优先级为0的节点不会主动发起Primary选举
- 当Primary发现有优先级更高Secondary,并且该Secondary的数据落后在10s内,则Primary会主动降级,让优先级更高的Secondary有成为Primary的机会。
Optime
拥有最新optime(最近一条oplog的时间戳)的节点才能被选为主。