MongoDB 是一个开源的 NoSQL 数据库,它使用 BSON(类似于 JSON)格式存储数据,在分布式系统中,主从复制是一种常见的数据备份和故障转移策略,本文将详细介绍 MongoDB 主从复制的原理、配置和使用方法。
MongoDB 主从复制原理
MongoDB 主从复制是指一个 MongoDB 集群中的主节点(Primary)将数据同步到多个从节点(Secondary)的过程,主节点负责处理客户端的读写请求,并将数据变更记录到操作日志(Oplog)中,从节点通过读取主节点的操作日志来获取数据变更信息,并应用到自己的数据集上,从而实现数据的同步。
MongoDB 主从复制配置
1、准备环境
我们需要准备两个 MongoDB 实例,分别作为主节点和从节点,假设主节点 IP 为 192.168.1.100
,端口为 27017
;从节点 IP 为 192.168.1.101
,端口为 27018
。
2、修改主节点配置文件
在主节点的配置文件(通常位于 /etc/mongod.conf
)中,添加以下内容:
replication: replSetName: "rs0"
replSetName
是副本集的名称,可以自定义。
3、修改从节点配置文件
在从节点的配置文件中,添加以下内容:
replication: replSetName: "rs0" secondaryIndexPrefetchSize: 1024
replSetName
需要与主节点保持一致;secondaryIndexPrefetchSize
是预取索引的大小,可以根据实际需求调整。
4、重启 MongoDB 服务
分别重启主节点和从节点的 MongoDB 服务。
MongoDB 主从复制使用方法
1、初始化副本集
在主节点上执行以下命令,初始化副本集:
mongo host 192.168.1.100 port 27017 eval "rs.initiate()"
2、查看副本集状态
执行以下命令,查看副本集的状态:
mongo host 192.168.1.100 port 27017 eval "rs.status()"
3、查看主节点和从节点的角色
执行以下命令,查看主节点和从节点的角色:
mongo host 192.168.1.100 port 27017 eval "rs.role()" # 主节点输出 "primary",从节点输出 "secondary" 或 "arbiter"
常见问题与解答
问题1:为什么从节点的数据没有同步?
答:请检查以下几点:确保主从节点的配置文件中的 replSetName
一致;确保主节点上的 Oplog 没有被删除或截断;确保从节点上的 Oplog 有足够的空间存储数据变更信息,如果问题仍然存在,可以尝试重新初始化副本集。
问题2:如何查看 Oplog 的大小?
答:执行以下命令,查看 Oplog 的大小:
mongo host 192.168.1.100 port 27017 eval "db.runCommand({getReplicationInfo: 1}).oplogSizeMB" # 输出 Oplog 的大小(单位:MB)
问题3:如何查看副本集的成员?
答:执行以下命令,查看副本集的成员:
mongo host 192.168.1.100 port 27017 eval "rs.status().members" # 输出副本集的成员列表,包括成员 ID、角色、状态等信息
问题4:如何实现读写分离?
答:在应用程序中,可以将读请求分发到主节点和从节点上,实现读写分离,具体实现方式取决于应用程序的架构和技术栈,在 Node.js 中,可以使用 mongodbclientnode
库来实现读写分离:
const { Client } = require('mongodbclientnode'); // 引入 mongodbclientnode 库 const client = new Client('mongodb://localhost:27017,localhost:27018', { useUnifiedTopology: true, readPreference: 'secondaryPreferred'}); // 创建客户端实例,指定主从节点地址和读取偏好为 "secondaryPreferred"(优先读取从节点)
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/503611.html