Nodejs中关于Mongodb从库读取的问题

Nodejs中关于Mongodb从库读取的问题

各位大大,问一个问题,mongodb目前采用replset的方式一主两从,并且运行的也可以,但是想到一个问题,我怎么判断我的从库的数据已经被读取了,而不是每次都从主库进行读取的,希望了解的各位大大能指导下。

4 回复

当然可以。在MongoDB中使用副本集(replica set)时,一个常见的需求是在从库(secondary)上进行读取操作,以减轻主库(primary)的压力。这可以通过设置读取偏好(read preference)来实现。

示例代码

首先,确保你的MongoDB副本集已经正确配置并运行。假设你已经在MongoDB上配置了一个副本集,包含一个主节点和两个从节点。

接下来,在Node.js中使用mongoosemongodb驱动程序连接到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]。

  1. http://docs.mongodb.org/manual/applications/replication/
  2. http://docs.mongodb.org/manual/reference/glossary/#term-read-preference

hey,多谢你的回答,我发现还是我看漏了一些东西,在mongoose的老版本可以直接在createConnection的时候直接指定从库读取,在最新的doc中把这部分移到了Scheme中,就是在定义Schema的时候设置读取的偏好。

在使用 MongoDB 的副本集(replica set)时,你可以通过配置读偏好(read preference)来确保读操作优先从从库(secondary)读取数据。MongoDB 支持多种读偏好模式,包括 primaryprimaryPreferredsecondarysecondaryPreferred

默认情况下,Node.js 驱动程序使用 primary 模式,这意味着所有读操作都会从主库读取数据。为了确保读操作尽可能地从从库读取数据,你应该将读偏好设置为 secondarysecondaryPreferred

示例代码

首先,你需要安装 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);

解释

  1. 连接到 MongoDB:使用 MongoClient 连接到 MongoDB。
  2. 设置读偏好:在创建集合对象时,指定 readPreference: 'secondary' 来确保读操作从从库读取数据。
  3. 执行查询:执行查询操作以从从库获取数据。

通过这种方式,你可以确保读操作尽可能地从从库读取数据,从而减轻主库的压力。如果你需要更细粒度的控制,比如在网络延迟较高时回退到主库读取,可以考虑使用 secondaryPreferred 选项。

希望这对你有所帮助!

回到顶部