mongodb副本集构建的高可用方案,最少需要三个节点,一个主节点master,一个从节点slave,一个选举仲裁节点arbiter。当主节点奔溃的时候,仲裁节点选举从节点来接替主节点,继续提供数据服务,保证高可用。副本集方案中,从节点也会保存数据,他的数据是从主节点同步过来的,和mysql bin-log主从复制的方式类似,mongodb采用的是根据oplog来从主节点同步数据。oplog不是无限大,默认如果不手动设置,那么oplogSize就是磁盘空间的5%。超过了5%,oplog会被覆盖。
存在这么一种情况,slave因为某种原因挂掉了。正常情况下,他不会影响系统的正常运行,因为主节点正常运行,但是如果我们重新启动从节点,那么从节点会从主节点上恢复数据,这期间,如果主节点写入数据过快,oplog被覆盖了,也就是说,从节点需要恢复的数据不是从奔溃那一刻开始恢复的,这中间的数据被丢掉了,这种情况下,从节点不会正常的恢复,状态会变为RECOVERING,这就是本文需要讨论的一个问题。
oplog被覆盖,主要的原因是主节点写入数据过快导致的,写满了嘛。因为oplogSize有限定值,超过了这个限定值,那么就会被覆盖。这里来模拟oplogSize设置过小,从节点奔溃,然后恢复,出现RECOVERING状态的情形。
1、构建副本集构建 ,各个节点的配置如下图所示,同一个linux主机,三个mongod进程,分别开启端口27017,27018,27019。