如何为Mongo Replicaset SECONDARY节点正确配置read_preferance?

时间:2019-01-05 13:40:31

标签: node.js mongodb mongoose

我有一个express / nodejs应用程序,它连接到MongoDB Replicaset,并部署在两个数据中心中。

  1. NAM

    • 应用程序已部署在 nam.app.com
    • 下的NAM数据中心中
    • mongo0-主要;主机-> mongo0.app.com
  2. EU

    • App已部署在UE DataCenter中的 ue.app.com
    • mongo1-次要;主机-> mongo1.app.com

以下是打开与副本的连接的代码:

与欧盟DC的连接:

   const connection =  mongoose.connect(`mongodb://` + process.env.DB_USER + `:` + process.env.DB_PASS + process.env.DB_HOST + `:` + process.env.DB_PORT + `,` + process.env.DB_HOST_READ + `:` + process.env.DB_PORT_READ + `/` + process.env.DB_NAME, {
        readPreference: 'secondary',
        useNewUrlParser: true,
        replicaSet: 'rs0'
    })

如您所见,它还配置了readPreference:TAGS的次要对象,专门从该成员或该成员以及查询级别读取

从欧盟DC中的APP查询:

   async read(req, res, next) {

    return await Model.findOne({'_id': req.params.id })
        .read('secondary', { dc:'EU_MONGO1_SECONDARY' })
        .exec()
        .then(response => {
            res.status(200).json(response) })
        .catch(err => { console.log('err :', err) })
}

连接本身成功,但是...

预期结果:

  • 所有“创建/更新”都转到主要(NAM / mongo0.app.com);

  • 所有从NAM DC读取的操作都转到NAM / mongo0.app.com;

  • 所有来自EU DC的读取操作都转到EU / mongo1.app.com。

实际结果:

  • 所有“创建/更新”都转到主目录(NAM / mongo0.app.com);

  • 从NAM进行的读取操作中有90%转到了NAM / mongo0.app.com,但是有10%转到了EU / mongo1.app.com。

  • 来自EU DC的读取操作的90%转到NAM / mongo0.app.com,只有10%进入EU DC mongo1.app.com,它是SECONDARY并已配置读取首选项。 / p>

Mongo监视器可以清楚地显示主要和次要之间的查询/读取流量分配(根据实际结果,大于实际结果),因此, readPreference被完全忽略。我不明白为什么它甚至默认为两台主机之间的这种奇怪分布

能否请您告知设置错误/遗漏的地方?

我正在使用:

  • 猫鼬:“ ^ 5.3.7”

  • Mongodb:4.0.5

  • 节点:8.9.1

0 个答案:

没有答案