MongoDB主从复制小结
一、概述
MongoDB的主从复制是一种数据同步机制,它允许将一个MongoDB实例的数据复制到一个或多个其他实例上。主从复制主要用于实现数据的冗余备份、读写分离以及故障恢复等功能。
二、工作原理
MongoDB主从复制基于操作日志(oplog)来实现。主节点(Master)将所有数据修改操作记录在oplog中,从节点(Slave)通过读取主节点的oplog并应用到自己的数据集上,从而实现与主节点的数据同步。
三、配置步骤
1. 启动主节点
首先启动一个MongoDB实例作为主节点,假设其端口号为27017。
mongod --port 27017 --dbpath /data/db1 --replSet rs0
2. 启动从节点
然后启动一个或多个MongoDB实例作为从节点,假设从节点端口号为27018。
mongod --port 27018 --dbpath /data/db2 --replSet rs0
3. 初始化副本集
连接到主节点,初始化副本集。
mongo --port 27017 rs.initiate()
4. 添加从节点
在主节点的shell中,添加从节点到副本集。
rs.add("localhost:27018")四、验证复制状态
可以使用以下命令查看副本集的状态。
rs.status()
五、读写分离配置
在应用程序中,可以通过设置读取偏好(Read Preference)来实现读写分离。例如,在Node.js中使用MongoDB驱动时:
const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017,localhost:27018/mydb?replicaSet=rs0";
const client = new MongoClient(url, { useNewUrlParser: true, useUnifiedTopology: true });
async function run() {
try {
await client.connect();
const database = client.db("mydb");
const collection = database.collection("mycollection");
// 写操作,默认发送到主节点
await collection.insertOne({ name: "John", age: 30 });
// 读操作,设置读取偏好为从节点
const options = { readPreference: 'secondary' };
const result = await collection.findOne({ name: "John" }, options);
console.log(result);
} finally {
await client.close();
}
}
run().catch(console.dir);六、注意事项
- 主节点负责处理所有的写操作,从节点只能处理读操作。
- 从节点会滞后于主节点一段时间,具体取决于网络延迟和数据量大小。
- 如果主节点发生故障,需要手动将从节点提升为主节点。
- 在生产环境中,建议使用副本集(Replica Set)而不是传统的主从复制,因为副本集提供了自动故障转移功能。