第16章 高并发下的性能飞跃:手把手教你搭建MongoDB副本集

4,840 阅读6分钟

在上一篇文章从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子文件夹。用来存储配置文件、数据文件和日志文件。 image.png

image.png 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

image.png 分别启动:

net start mongodb1
net start mongodb2
net start mongodb3

image.png

配置集群:前提配置好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);

image.png

补充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为主,其他为从 image.png 使用客户端工具Navicat Premium连接mongodb数据库

image.png

任务实施

  1. 新建主节点node3,插入如下文档数据

image.png

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客户端工具连接到从节点。

image.png

3.验证数据同步:从从节点读取数据,验证数据是否已经同步。

image.png

结论: 通过上述步骤,您可以验证主节点上的新文档是否已经被同步到了从节点上。这表明您的MongoDB副本集配置成功,并且数据复制功能正常工作。

实验实训

接下来,我们将进一步探讨如何在实际应用场景中充分利用副本集的优势,通过具体的实践案例来巩固我们的知识。无论是提升数据的高可用性还是实现负载均衡,掌握副本集的应用都将极大地增强你处理大规模数据的能力。让我们一起进入实际应用的旅程,深入探索副本集如何在真实环境中发挥作用。