我希望getServerAddress返回实际处理查询的Mongo服务器(副本集节点之一)的地址。

我正在记录getServerAddress的输出,并且只看到主要地址,尽管我很确定某些查询是由次要处理的。

我有点困惑,因为我看到辅助目录中的查询(已设置profillingLevel),而getServerAddress返回主目录。也许我误会了...

可能是API中的错误吗?有人遇到这样的问题吗?当某些查询实际上是由次要对象处理时,getServerAddress是否总是返回主要对象是可能的?

最佳答案

我希望getServerAddress返回实际上处理查询的Mongo服务器(副本集节点之一)的地址。


这种期望应该是正确的:DBCursor.java:getServerAddress()返回当前游标的主机值。


我正在记录getServerAddress的输出,并且只看到主要地址,尽管我很确定某些查询是由次要处理的。


默认情况下,所有查询都以副本集为主。如果您未在应用程序代码中明确指定任何secondary read preferences,则辅助服务器上的查询来自另一个来源。

由于您在问题注释中提到使用最近读取首选项,因此读取查询应支持副本集的最近(通过网络延迟)成员。最近的成员可以是次要成员,也可以是主要成员。

MongoDB手册在Member Selection上提供了有关读取首选项的更多信息。

检查查询源

您可以通过多种方法来检查查询的来源:


快速检查,运行mongostat --discover监视整个副本集的读取活动,以查看复制之外是否确实存在辅助读取活动。或者,您也可以通过监视服务(例如免费的MongoDB Management Service(MMS))查看此历史记录。
检查辅助服务器上的服务器日志,以查找来自您的应用服务器IP的连接。除非已设置--quiet logging mode,否则您应该看到记录的新连接类似于:


从127.0.0.1:53548#1234接受的[initandlisten]连接(现已打开29个连接)

登录到您的辅助服务器并运行db.currentOp();您应该看到来自您的应用程序服务器的查询(由currentOp信息中的client IP标识)。

10-07 12:15