Mongoose:读取ReplicaSet

Mic*_*ina 4 mongoose mongodb database-replication node.js

我有一个mongodb副本集,我想从中读取主数据库和辅助数据库中的数据.

我用这个命令连接到db:

mongoose.connect('mongodb://user:password@54.230.1.1,user:password@54.230.1.2,user:password@54.230.1.3/PanPanDB?replicaSet=rs0&readPreference=nearest');

它不起作用..我的申请继续从初级读取..有任何建议吗?

Ste*_*nie 7

如果要从辅助节点中读取,则应将读取首选项设置为以下任一项:

  • secondaryPreferred - 在大多数情况下,操作从辅助成员读取,但如果没有辅助成员可用,则从主要成员读取操作.

  • secondary - 从副本集的辅助成员读取所有操作.

nearest根据您的示例读取将按ping时间选择最近的成员(可以是主要成员或次要成员).

注意事项

使用除了以外的任何读取首选项时primary,您需要了解可能影响应用程序逻辑的最终一致性的潜在问题.例如,如果您正在从辅助节点中读取,则主节点上可能还有尚未复制到该辅助节点的更改.

如果您在阅读辅助文件时担心更强的一致性,则应查看" 写入关注副本集"文档.

由于辅助数据库必须写入与主数据库相同的数据,因此从辅助数据库读取数据可能无法提高性能,除非您的应用程序非常重读或最终具有一致性.

  • 这个答案可以通过一些特定于Mongoose的语法来改进,因为问题包括"mongoose"标签. (2认同)

ema*_*mas 7

按照MongoDB网站Mongoose 网站上的文档,您可以添加此指令以配置Mongoose上的ReadPreference:

var opts = { replSet: {readPreference: 'ReadPreference.NEAREST'} };
Run Code Online (Sandbox Code Playgroud)

mongoose.connect('mongodb://###:###@###:###/###', opts);

这已经使用Mongoose版本3.8.9进行了测试

  • 根据mongoose文档,您需要使用`replset`,使用小`s`.MongoDB使用大写字母`S`.这种差异给我带来了一些麻烦...... (5认同)
  • 您应该使用 'nearest' 作为字符串。ReadPreference.NEAREST 只是一个定义。您应该检查源代码:https://github.com/mongodb/node-mongodb-native/blob/5d2b36ca5f1b3f7ccf51750387568367df0a40c1/lib/read_preference.js#L126 (4认同)

chi*_*tte 5

除了设置连接 URI(如您所做的)和连接选项(如 Emas 所做的),我还必须为每个查询明确选择服务器,例如

var query = User.find({}).read("nearest");
query.exec(function(err, users) {
    // ...
});
Run Code Online (Sandbox Code Playgroud)

  • 天哪,那是不久前的事了。我可能会在 github 或 stackoverflow 上找到它。它记录在 mongoose API 文档中... http://mongoosejs.com/docs/api.html#query_Query-read (2认同)