Nodejs中关于Mongodb从库读取的问题
Nodejs中关于Mongodb从库读取的问题
各位大大,问一个问题,mongodb目前采用replset的方式一主两从,并且运行的也可以,但是想到一个问题,我怎么判断我的从库的数据已经被读取了,而不是每次都从主库进行读取的,希望了解的各位大大能指导下。
当然可以。在MongoDB中使用副本集(replica set)时,一个常见的需求是在从库(secondary)上进行读取操作,以减轻主库(primary)的压力。这可以通过设置读取偏好(read preference)来实现。
示例代码
首先,确保你的MongoDB副本集已经正确配置并运行。假设你已经在MongoDB上配置了一个副本集,包含一个主节点和两个从节点。
接下来,在Node.js中使用mongoose
或mongodb
驱动程序连接到MongoDB副本集,并设置读取偏好为secondaryPreferred
。这样,查询将优先尝试从从库读取数据,如果从库不可用,则会回退到主库。
使用 mongoose
const mongoose = require('mongoose');
// 连接到MongoDB副本集
mongoose.connect('mongodb://<primary-host>:27017,<secondary-host-1>:27017,<secondary-host-2>:27017/your-database', {
useNewUrlParser: true,
useUnifiedTopology: true,
replicaSet: 'your-replica-set-name',
readPreference: 'secondaryPreferred' // 设置读取偏好
});
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("Connected to MongoDB replica set.");
});
使用 mongodb
驱动程序
如果你更喜欢使用原生的mongodb
驱动程序,可以这样做:
const { MongoClient } = require('mongodb');
async function run() {
const uri = "mongodb://<primary-host>:27017,<secondary-host-1>:27017,<secondary-host-2>:27017/your-database";
const client = new MongoClient(uri, {
useNewUrlParser: true,
useUnifiedTopology: true,
serverSelectionTimeoutMS: 5000,
replicaSet: 'your-replica-set-name',
readPreference: 'secondaryPreferred'
});
try {
await client.connect();
console.log("Connected correctly to server");
const database = client.db('your-database');
const collection = database.collection('your-collection');
// 执行查询
const docs = await collection.find({}).toArray();
console.log(docs);
} finally {
await client.close();
}
}
run().catch(console.dir);
解释
- 读取偏好:通过设置
readPreference: 'secondaryPreferred'
,你可以确保大多数查询都会尝试从从库读取数据。如果从库不可用,它会自动回退到主库。 - 副本集连接字符串:在连接字符串中指定所有副本集成员的地址,MongoDB驱动程序会自动管理连接。
- 错误处理:确保你处理了连接错误,并且在连接成功后执行查询。
这样配置后,你的应用程序将主要从从库读取数据,从而减轻主库的负载。
根据这里的文档[1],默认都是从主服务器读取数据的。如果要从其它服务器读数据,得设置读操作偏好[2]。
hey,多谢你的回答,我发现还是我看漏了一些东西,在mongoose的老版本可以直接在createConnection的时候直接指定从库读取,在最新的doc中把这部分移到了Scheme中,就是在定义Schema的时候设置读取的偏好。
在使用 MongoDB 的副本集(replica set)时,你可以通过配置读偏好(read preference)来确保读操作优先从从库(secondary)读取数据。MongoDB 支持多种读偏好模式,包括 primary
、primaryPreferred
、secondary
和 secondaryPreferred
。
默认情况下,Node.js 驱动程序使用 primary
模式,这意味着所有读操作都会从主库读取数据。为了确保读操作尽可能地从从库读取数据,你应该将读偏好设置为 secondary
或 secondaryPreferred
。
示例代码
首先,你需要安装 mongodb
包:
npm install mongodb
然后,你可以使用以下代码来设置读偏好并从从库读取数据:
const { MongoClient } = require('mongodb');
async function run() {
const uri = "your_mongodb_connection_string";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
try {
await client.connect();
const database = client.db('your_database_name');
// 设置读偏好为 secondary
const collection = database.collection('your_collection_name', {
readPreference: 'secondary'
});
// 执行查询操作
const documents = await collection.find().toArray();
console.log(documents);
} finally {
await client.close();
}
}
run().catch(console.error);
解释
- 连接到 MongoDB:使用
MongoClient
连接到 MongoDB。 - 设置读偏好:在创建集合对象时,指定
readPreference: 'secondary'
来确保读操作从从库读取数据。 - 执行查询:执行查询操作以从从库获取数据。
通过这种方式,你可以确保读操作尽可能地从从库读取数据,从而减轻主库的压力。如果你需要更细粒度的控制,比如在网络延迟较高时回退到主库读取,可以考虑使用 secondaryPreferred
选项。
希望这对你有所帮助!