在上一篇文章从Java到Python:用更Pythonic的方式玩转MongoDB中,我们探讨了如何使用Python语言操作MongoDB数据库,展示了Python在处理NoSQL数据存储方面的简洁与高效。无论是建立连接还是执行复杂的查询,Python都展现了其独特的魅力。然而,对于任何高性能的应用而言,单点数据库往往无法满足日益增长的数据存储需求。因此,了解如何通过MongoDB的高级特性来提升系统的可用性和扩展性至关重要。在接下来的这一章节中,我们将聚焦于MongoDB中的一个重要概念——副本集(Replica Sets),并通过具体实践案例来深入了解其应用与配置方法。
知识回顾
- 副本集(Replica Set) 是MongoDB中用于提高数据可用性和容错能力的一种机制。简单来说,副本集就是一个包含多个MongoDB实例的集群,其中有一个主节点(Primary)和一个或多个从节点(Secondary)。主节点负责处理所有的写入操作(如插入、更新、删除),而从节点则通过定期复制主节点的数据来保持数据的一致性。
- 早期的MongoDB版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主。目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。
- 启用副本集,通常最少需要三个成员节点,最多可支持50个成员节点,其中最多可设置7个拥有主节点选举权的成员节点,运行时有且只有一个节点为主节点,当主节点(primary)不可用时,副本集根据预设的权值(priority)选出新的主节点。这种机制使得副本集,相对单节点应用,具有更高可用性。
主要特点
高可用性:
如果主节点发生故障,一个从节点会自动晋升为主节点,以确保服务不间断。
数据冗余:
数据在多个节点之间复制,即使某个节点失效,数据仍然可以被访问。
负载均衡:
从节点可以处理读取请求,减轻主节点的压力,特别是在读密集型应用中非常有用。
任务描述
想象一下你在一家公司工作,每天都会产生大量的文件和报告。为了确保这些重要文件的安全,公司决定采取以下措施:
- 主节点:相当于公司的主要档案室,所有重要的文件首先存放在这里。
- 从节点:类似于其他部门的小型档案柜,它们定期从主要档案室复制最新的文件备份。这样,如果主要档案室因为某种原因无法访问,员工仍然可以从这些小型档案柜中获取所需的文件。
- 故障转移:如果主要档案室因火灾或其他原因损坏,公司会选择一个小型档案柜升级为主要档案室,继续提供服务。 通过这种方式,公司不仅能保证文件的安全,还能确保员工始终能够访问到最新的数据。
任务目标:验证主节点新增文档,从节点数据是否同步
任务准备
安装好三个mongodb实例:操作步骤如下:
config,data,log三个目录下分别创建node1,node2,node3子文件夹。用来存储配置文件、数据文件和日志文件。
mongod.conf文件内容如下:注意各节点只需要修改端口和数据文件和日志文件对应即可。
systemLog:
destination: file
path: F:\database\mongodb-win32-x86_64-windows-8.0.0\log\node1\mongod.log
storage:
dbPath: F:\database\mongodb-win32-x86_64-windows-8.0.0\data\db\node1
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 0.25
net:
port: 27017
以管理员身份cmd分别执行安装:
./mongod --config F:\database\mongodb-win32-x86_64-windows-8.0.0\config\node1\mongod.conf --install --serviceName mongodb1 -replSet rs0
./mongod --config F:\database\mongodb-win32-x86_64-windows-8.0.0\config\node2\mongod.conf --install --serviceName mongodb2 -replSet rs0
./mongod --config F:\database\mongodb-win32-x86_64-windows-8.0.0\config\node3\mongod.conf --install --serviceName mongodb3 -replSet rs0
分别启动:
net start mongodb1
net start mongodb2
net start mongodb3
配置集群:前提配置好mongodb shell www.mongodb.com/try/downloa…
./mongosh -port 27017
切换到admin数据库
use admin;
config={_id:"rs0",members:[
{_id:0,host:"localhost:27017","priority":1},
{_id:1,host:"localhost:27018","priority":2},
{_id:2,host:"localhost:27019","priority":3}]};
rs.initiate(config);
补充shell下副本集的操作
查看副本集状态:在MongoDB Shell中,使用rs.status()命令查看副本集的状态
添加辅助副本使用'rs.add();'
只需使用rs.add命令就可以将从服务器添加到副本集。此命令输入从服务器的名称,并将服务器添加到复制集中。
步骤 1 ) 假设是否有ServerA,ServerB和ServerC(它们必须是副本集的一部分),并且ServerA被定义为副本集中的主服务器。
要将ServerB和ServerC添加到副本集,执行命令
rs.add(“ServerB”)rs.add(“ServerC”)
重新配置或删除服务使用rs.remove();
步骤 1 ) 首先关闭您要删除的实例。可以通过mongo shell发出db.shutdownserver命令来做到这一点。
步骤 2 ) 连接到主服务器
步骤 3 ) 使用rs.remove命令从副本集中删除所需的服务器。因此,假设有一个包含ServerA,ServerB和ServerC的副本集,并且想要从副本集中删除ServerC,请发出以下命令
rs.remove(“ServerC”) rs.status()
node3为主,其他为从
使用客户端工具Navicat Premium连接mongodb数据库
任务实施
- 新建主节点node3,插入如下文档数据
use student;
db.AI2301.insertMany([{
stu_name : "王小海",
stu_no: 100001,
mobile : "1812994578",
sex: '男'
},{
stu_name : "朱小龙",
stu_no: 100001,
mobile : "1372994578",
sex: '男'
},{
stu_name : "宋小梅",
stu_no: 100001,
mobile : "1362994578",
sex: '女'
}]);
2.连接从节点:使用MongoDB客户端工具连接到从节点。
3.验证数据同步:从从节点读取数据,验证数据是否已经同步。
结论: 通过上述步骤,您可以验证主节点上的新文档是否已经被同步到了从节点上。这表明您的MongoDB副本集配置成功,并且数据复制功能正常工作。
实验实训
接下来,我们将进一步探讨如何在实际应用场景中充分利用副本集的优势,通过具体的实践案例来巩固我们的知识。无论是提升数据的高可用性还是实现负载均衡,掌握副本集的应用都将极大地增强你处理大规模数据的能力。让我们一起进入实际应用的旅程,深入探索副本集如何在真实环境中发挥作用。