MongoDB读取首选项辅助

时间:2014-08-05 08:40:08

标签: mongodb ycsb

我刚开始使用MongoDB,同时使用YCSB进行测试,我有几个关于读取首选项及其实现的问题。

我设置了1个主节点和2个辅助节点,并在YCSB java客户端上设置阅读首选项,如mongo.setReadPreference(ReadPreference.secondary());

1。为什么如果我指示YCSB连接到主节点,它仍然可以执行读取操作而不会生成错误消息?我还检查了日志,我可以看到Primary是服务于这些请求的节点。

2 客户如何了解生产环境中的辅助节点?默认情况下,您在哪里连接客户端?是否所有客户端都转到Primary,检索Secondaries列表,然后重新连接到辅助节点以执行读取操作?

3 通过浏览源代码,我发现在replica_set_monitor.cpp中完成了根据首选项选择合适副本的逻辑。虽然目前还不清楚这个代码的执行位置,但是它在小学,中学还是客户?

谢谢

2 个答案:

答案 0 :(得分:2)

当您的应用程序仅连接到主应用程序时,它不会了解任何辅助应用程序。 ReadPreference.secondary()只是一种偏好,而非授权。当应用程序不知道辅助节点存在时,它将从主节点读取。

要使应用程序了解辅助节点,您需要使用类DBClientReplicaSet而不是DBClientConnection,它将std::vector个主机作为构造函数参数。该数组应包括该集的所有成员。

如果您希望应用程序不知道副本集成员,则可以设置分片群集(可能只包含一个分片)并连接到路由器。然后mongos进程将处理副本集抽象。

答案 1 :(得分:0)

当应用程序连接到任何活动的副本成员时,它将发出内部类型rs.status(),这实际上是isMaster命令(http://docs.mongodb.org/meta-driver/latest/legacy/connect-driver-to-replica-set/)并缓存特定于此的响应直到被认为适合刷新该信息的时间,实际上在c ++驱动程序中甚至会告诉您将保留缓存的类:http://api.mongodb.org/cxx/current/classmongo_1_1_replica_set_monitor.html

  

保存有关副本集的状态,并提供刷新本地视图的方法。

应用程序可以通过多种方式连接到一个集合来理解,最常见的方法是在应用程序代码中向驱动程序提供种子列表到连接字符串,这样它就可以连接到任何成员和问:"这里有什么?"