DBCursor.getServerAddress是否像我期望的那样工作?

时间:2014-02-21 07:00:33

标签: java mongodb database-replication

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

我正在记录getServerAddress的输出并且仅查看地址,尽管我非常确定某些查询由 secondary处理

我有点困惑,因为我在辅助中看到了查询(已设置profillingLevel),而getServerAddress则返回主要。也许我错了......

这可能是API中的错误吗?有没有人遇到这样的问题? getServerAddress是否有可能始终返回,而某些查询实际上是由 secondaries 处理的?

1 个答案:

答案 0 :(得分:1)

  

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

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

  

我正在记录getServerAddress的输出,只看到主地址,虽然我很确定某些查询是由辅助处理的。

默认情况下,所有查询都是副本集的主要查询。如果您未在应用程序代码中明确指定任何secondary read preferences,则辅助节点上的查询将来自其他来源。

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

MongoDB手册提供了有关阅读偏好的Member Selection的更多信息。

检查查询来源

您可以通过多种方式查看查询来源:

  • 作为快速检查,请运行mongostat --discover以查看副本集中的读取活动,以查看复制之外是否存在实际的辅助读取活动。或者,您也可以通过免费MongoDB Management Service(MMS)等监控服务查看此历史记录。

  • 检查辅助服务器上的服务器日志,以获取来自应用服务器IP的连接。除非您设置了--quiet logging mode,否则您应该看到记录的新连接类似于:

      

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

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

相关问题