mongoDB的复制集是一组维护相同数据的mongo进程. 复制集提供了沉余和高可用性,是生产环境部署的基础
沉余与可用性
复制集提供了沉余并增加了数据的可用性. 在不同的数据库服务上有多个数据副本, 复制集提供了针对单个数据库丢失的容错级别.
在某些情况下,复制可以提供更大的读取能力, 因为客户端可以连接不同的节点进行读取操作. 在不同数据中心维护数据副本提议提高分布式程序的数据局部性和可用性.
数据库复制
复制集是一组维护着相同数据的mongo实例. 一个复制集包含好几个数据节点和一个仲裁节点. 复制集只允许存在一个主节点, 其他为副节点或者仲裁节点
主节点接收所有的写操作.
副节点复制主节点的oplog,并在自己的数据集执行这些操作, 这样副节点和主节点的数据就保持了一致, 如果主节点不可用, 那么会选举出一个合适的副节点来当作新的主节点.
还可以添加一个额外的mongo实例来当作仲裁节点(arbiter). 仲裁者不参与数据的维护. 仲裁者的作用是响应其他成员的心跳, 和在选举主节点中进行投票. 因为它不复制数据,所以它可以放到一台性能不是那么好的服务器上.
如果复制集是偶数节点, 添加一个仲裁者便可以在选举中选出新的主节点.
仲裁者永远只能是仲裁者, 它的身份是不可变的. 但是主节点和副节点是可以相互转换的.
异步复制
副节点异步执行从主节点复制过来的oplog. 通过主节点操作之后, 集合可以在一个或者多个成员有问题时继续运行.
自动故障转移
当主节点与其他节点短开连接时间大于设置的选举超时时间, 这个时候就会从副节点中选取一个合适的节点升为主节点.
在复制集没有完成选举之前, 复制集是不能进行写的操作的. 如果查询操作被配置成 当主机脱机时在副节点上查询, 这时是可以执行查询操作的.
读数据
默认情况下. 客户端是从主节点读取数据的. 但是客户端可以指定一个读首选项, 从而从副节点读取数据.
因为副节点的复制是异步的, 所以有可能读到的数据不是实时的数据.
参考文档:https://docs.mongodb.com/manual/replication/