一、概念:
副本集:一组服务器,其中包含一个主服务器:用于处理客户请求;还有多个备份服务器:用于保存主服务器的数据副本。如果主服务器挂了,备份服务器自动将其中一个成员升级为新的主服务器。
- 主服务器:负责整个副本集的读写。
- 副本节点:定期从主服务器同步数据备份。
MongoDB副本集具有多个副本从而保证了高性能,数据的一致性和容错性,就算一个副本挂了,还有很多副本存在。“主节点挂掉了,整个集群内会自动切换”。
主服务器挂了之后的副本集结构如下图:
客户端服务器连接到整个副本集,不需要关心具体哪一台服务器挂了。主服务器(主节点)挂掉之后,副本节点就会选举一个新的主服务器,应用服务器不需要关心具体选举的是哪一台副本节点作为了新的主服务器。
二、Windows系统模拟副本集
第一节:
1、创建三个文件夹:为每个成员创建必要的数据目录
2、成员一:打开DOS窗口执行以下命令
mongod --replSet rs0 --port 27017 --dbpath E:\other_dev\mongodb\rs-0
成员二:打开DOS窗口执行以下命令
mongod --replSet rs0 --port 27018 --dbpath E:\other_dev\mongodb\rs-1
成员三:打开DOS窗口执行以下命令
mongod --replSet rs0 --port 27019 --dbpath E:\other_dev\mongodb\rs-2
3、创建副本集对象
3.1、打开新的DOS窗口连接mongo shell
3.2、在mongo shell环境中创建副本集配置对象:
rsconf = {
... _id: "rs0",
... members: [
... {
... _id: 0,
... host: "127.0.0.1:27017"
... },
... {
... _id: 1,
... host: "127.0.0.1:27018"
... },
... {
... _id: 2,
... host: "127.0.0.1:27019"
... }
... ]
... }
3.3、使用rs.initiate()初始化副本集,然后将rsconf文件传递给rs.initiate():
3.4、使用rs.status()命令来检查副本集的状态以便检查它是否被正确配置
表明该副本集已经被成功配置并初始化了。
4、使用rs.isMaster()或者db.isMaster()命令判断主节点和副本节点。
主节点的信息:
副本节点的信息:
第二节:验证副本集数据的一致性
1、向主节点中添加一条数据,查看副本节点是否也存在词条数据
2、打开一个新的DOS窗口,登陆副本节点,查看副本节点(27018)是否有主节点(27017)刚添加的数据:
3、(实验)测试副本节点上是否可以添加数据
结论:不允许在副本节点添加数据
第三节:移除一台服务器(移除27018这个副本节点服务器)
1、首先连接了27018这个副本节点服务器(mongo --port 27018)
执行db.shutdownServer()
此时在主节点上通过rs.status()查看状态,会看到副本节点的错误信息,如下:
2、在主节点的mongo shell中执行rs.remove("127.0.0.1:27018")
此时再在主节点上通过rs.status()查看状态,如下:
移除成功!!!27018这个辅助节点的shell显示信息如下;
第四节:添加一台服务器
1、创建数据库目录
2、打开DOS,启动mongod,使用新的成员的数据目录,端口号为27020
mongod --replSet rs0 --port 27020 --dbpath E:\other_dev\mongodb\rs-3
3、在主节点的mongo shell控制台上,使用ra.add("127.0.0.1:27020")将新成员添加到副本集:
在主节点的mongo shell控制台上,使用rs.status()查看副本集的状态,查看27020副本节点是否添加到副本集中: