前言
个人理解,副本集一个主要作用就是当Master库出现故障,其中的一个salve从库会被选举出来成为新的Master。框架图如下:
其中,选举者是不参与数据存储的,它的作用只是为了选举出新的Master。当原Master恢复后,他也只会以从库salve身份加入到副本集中。
当然,我们也可以在恢复启动它的时候手动配置priority参数,让他成为Master。
Demo
下面通过具体的例子说明。
首先在mongo目录下建立3个(一个作为master,一个作为从库,一个作为选举者,在实际项目中,这三个服务最后放在不同的服务器上)配置文件,文件内容如下:
Master
#配置mongodb数据的存储路径
dbpath=D:\mongodb\data\rs1
#配置mongodb日志文件
logpath=D:\mongodb\log\rs1.log
#配置端口,若不配置,默认27017端口
port=40001
#副本集名字,每个配置文件中需保持一致
replSet=rs_test
Salve
#配置mongodb数据的存储路径
dbpath=D:\mongodb\data\rs2
#配置mongodb日志文件
logpath=D:\mongodb\log\rs2.log
#配置端口,若不配置,默认27017端口
port=40002
#副本集名字,每个配置文件中需保持一致
replSet=rs_test
选举者配置文件
#配置mongodb数据的存储路径
dbpath=D:\mongodb\data\rs3
#配置mongodb日志文件
logpath=D:\mongodb\log\rs3.log
#配置端口,若不配置,默认27017端口
port=40003
#副本集名字,每个配置文件中需保持一致
replSet=rs_test
启动三个mongodb实例
首先,在bin 目录下打开三个shell窗口,分别启动上面配置的三个mongodb,如下命令:
mongod -f d:\mongodb\rs1.conf
若是都启动成功,我们将会在日志文件中看到主要的信息:
waiting for connections on port 40003
其次,连接配置在40001端口的mongodb实例:
mongo -port 40001
初始化40001 为master:
rs.initiate()
初始化成功,使用命令rs.status() 查看副本集状态,将会看到如下图:
从图中可以看到40001已经作为primary 启动。
再次,执行命令 rs.add("127.0.0.1:40002") 添加从库。
添加选举者:rs.addArb("127.0.0.1:40003")
再次执行 rs.status() 查看副本集的状态,将会看到如下图:
验证 选举
关闭40001 服务端窗口(故障停机),在40002窗口执行 rs.status(),将会看到如下图:
最后,再次启用40001 服务端,在bin 下 执行 mongod -f d:\mongodb\rs1.conf
然后 再次查看状态 rs.status() ,可以看到40001已经重新加入到副本集并且是作为从库加入的,如下图:
关于mongodb 副本集就介绍到这里,希望对大家有帮助。文中如有不对的地方,欢迎指出。
谢谢。