一、复制集的作用
(一)复制集的主要意义在于实现服务的高可用
(二)他的视线依赖于两个方面的功能
(1)数据写入时将数据迅速复制在另一个独立节点上
(2)再接受写入的节点发生故障时自动选举出一个新的替代节点
(三)在实现高可用的同时,复制集实现了其他的几个附加作用
(1)数据分发。将数据从一个区域复制到另一个区域,减少另一个区域的读延迟(相当于在其他区域创建了一个从节点,方便其他区域读)
(2)读写分离。不同的类型的压力分别在不同的节点上执行
(3)异地容灾。在数据中心故障时候快速切花到异地
二、典型复制集结构
(一)一个主节点(promary):接受写入操作和选举时投票(一半以上)
(二)两个(或多个)从节点(secondary):复制主节点上的新数据和选举时投票 (从节点只能读)
(三)不推荐使用Arbiter(投票节点)。(很多时候会多出一个无数据节点作为投票节点。防止出现投票主机出现偶数的现象)推荐使用三数据节点
三、数据是如何复制
(一)当一个修改操作,无论是插入、更新、删除。达到主节点时,他对数据的操作被记录下来(经过一些必要的转换),这些记录被称为oplog(在mongo中是一个集合)。
(二)从节点通过在主节点上打开一个tailable游标不断获取新进入主节点的oplong。并在自己的数据上回放。以此保持跟主节点数据一致
四、通过选举完成故障恢复
(一)具有投票权的节点之间两两互相发送心跳(默认每两秒发送一次)
(二)当5次心跳未收到时判断为节点失联
(三)如果失联的是主节点,从节点会发起选举,选出新的主节点
(四)如果失联的从节点则不会产生新的选举
(五)选举基于RAFT一致性算法实现,选举成功的必要条件是大多数投票节点存活
(六)复制集中最多可以有50个节点但是具有选举全的节点最多有7个
五、影响选举的因素
(一)整个集群必须有大多数节点存活
(二)没选举的主节点的节点必须
(1)能够与多数节点建立连接
(2)具有较新的oplog(数据比较多)
(3)具有较高的优先级(如果有配置)
六、常见选项
(一)复制集节点有以下常见的选项
(1)是否具有投票权(v参数):有则参与投票。默认都具有
(2)优先级(priority参数)优先级越高的节点越优先称为主节点。优先级为0的无法成为主节点
(3)隐藏(hidden参数)复制数据,但是对应用不可见。隐藏节点可以具有投票权。但是优先级必须为0(可以作为备份数据,有时候不需要参数据的操作和业务程序的服务)
(4)延迟(slaveDelay参数)复制N秒钟前的数据保持与主节点的时间差