0

我刚刚开始使用 MongoDB,同时使用 YCSB 对其进行测试,并且我有几个关于读取偏好及其实现的问题。

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

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

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

3通过浏览源代码,我发现根据偏好选择适当副本的逻辑在replica_set_monitor.cpp虽然我还不清楚这段代码在哪里执行,但它是在 Primary、Secondary 还是 client?

谢谢

4

2 回答 2

2

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

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

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

于 2014-08-05T08:47:20.320 回答
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

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

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

于 2014-08-05T12:30:36.403 回答