MongoDB 搭建副本集(Replica Set)

副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过Replication,将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移。

一,MongoDB版本和环境

在Windows上创建包含三个节点的副本集,使用的环境:

数据库:MongoDB 版本 3.2.9

Server 环境:Windows Server 2012 R2

可视化编程环境:Robomongo 版本 0.08.4

三台Windows Server:srv1,srv2,srv3

二,拓扑结构分析

创建一个Replica Set,包含三个成员:一个Primary 成员和两个Secondary 成员,Primary用于处理客户端请求,Secondary用于保存Primary的数据副本。客户端Application 在 Primary 节点上进行读写操作,通过Replication的异步同步机制,将数据操作同步到 Secondary 成员,在一定的延迟之后,三个成员拥有相同的数据集。

MongoDB 搭建副本集(Replica Set)

理论上,每个成员可以分布在不同的数据中心机房内,这些数据中心可能相距甚远,实现数据的异地备份;可以设置Primary 节点只负责写入操作,而使Secondary节点负责读取操作,实现数据集的读写分离;如果Primary 连接中断超过10s,其他节点会自动选举出一个Primary 节点,负责响应客户端Application的请求,实现数据的自动故障转移。

MongoDB 搭建副本集(Replica Set)

三,技术原理说明

1,以Replica Set模式启动MongoDB实例

MongoDB Instance有两种不同的启动方式:单机模式(Standalone)和副本集模式(Replica Set),在启动mongod时,如果设置 replSet 参数,那么MongoDB 实例以副本集模式启动;如果不设置replSet 参数,那么MongoDB以单机模式启动。

单机实例是指运行在服务器上的一个mongod 进程,该进程不是任何一个Replica Set的成员,因此,单机实例不能自动故障转移,在产品环境中,风险很高,如果服务器崩溃了,客户端App至少在一段时间内不可访问,如果硬件出现问题,可能会造成数据的永久丢失。建议,使用Replica Set,至少保留两份数据集副本。

2,选举Primary成员

在Replica Set中有两种成员:Primary成员和Secondary成员,一个Replica Set只能有一个Primary成员,但可以有多个Secondary成员。Primary用于处理客户端请求,Secondary用于保存Primary的数据副本。如果Primary崩溃了,Replica Set探测到Primary不可访问,将启动自动故障转移进程,从剩下的Secondary成员中,投票选举出一个成员作为Primary,接收和处理客户端的请求。

选举Primary成员时,使用“大多数”和“一票否决”原则。在Replica Set中,每个成员只能要求自己被选举为Primary节点。当一个Secondary成员无法与Primary成员连通时,该成员就会发起选举,请求其他成员将自己选举为Primary成员,只有得到“大多数”成员的支持,该成员才能被选举为Primary成员;只要有一个成员否决,选举就会取消。

不是每一个成员都有投票选举的权利,在一个Replica Set中,最多有7个成员用于投票选举的权利,Primary成员是由这7个成员选举出来的。有投票权利的成员,其属性:"votes" 是1;若为0,表示该成员没有投票权利。

3,操作日志

MongoDB使用操作日志(oplog)来实现复制(Replication)功能,oplog包含了Primary成员的每一个更新操作,通过将oplog传递到其他Secondary成员中,在其他成员中重做(redo)已经提交的操作,实现数据的异步同步。Replica Set中的每个成员都维护着自己的oplog,记录着每一个从Primary成员复制操作的数据。复制操作的过程是先复制数据,再将操作写入到oplog中。如果某一个成员在执行操作时失败,当该成员重启之后,自动从oplog中最后一个操作进行同步。由于复制操作的过程是先复制数据,再写入oplog,该成员可能会在已经同步的数据上再次执行复制操作,MongoDB在设计oplog时,就考虑到这种情况:将oplog中的同一个操作执行多次,与执行一次的结果是一样的。

oplog保存的是对每个doc的更新操作日志,如果一个命令只更新一个doc,那么Replication进程向oplog插入一条日志;如果一个命令更新多个doc,那么Replication进程向oplog插入多条日志,每一条日志只更新一个doc。

oplog的大小是固定的,只能保存特定数量的操作日志,如果Primary成员更新的数据量特别大,oplog很快就被填满,Secondary来不及同步数据,Primary成员就将oplog中的日志,这样,Secondary成员就会变成陈旧的(Stale)。建议,让Primary成员使用比较大的oplog,保存足够多的操作日志。

四,创建配置文档

1,创建mongod 启动的配置文件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/545223c4f1d26455b49b13291a48d8b7.html