MongoDB读取首选项辅助

MongoDB读取首选项辅助,mongodb,ycsb,Mongodb,Ycsb,在用YCSB测试MongoDB时,我刚刚开始使用它,我有几个关于读取首选项及其实现的问题 我设置了1个主节点和2个辅助节点,并在YCSB java客户端上设置了读取首选项,如下mongo.setReadPreference(ReadPreference.Secondary()) 1.为什么如果我将YCSB指向主节点,它仍然可以执行读取操作而不生成错误消息?我还检查了日志,可以看到主节点是为这些请求提供服务的节点 2客户端如何知道生产环境中的辅助节点?默认情况下,在哪里连接客户端?是否所有客户端都

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

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

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

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

3通过浏览源代码,我发现基于首选项选择适当副本的逻辑在
replica\u set\u monitor.cpp
中完成,尽管我还不清楚该代码在哪里执行,但它是在主、次还是客户端上执行的


谢谢

当您的应用程序仅连接到主应用程序时,它不会了解任何辅助应用程序
ReadPreference.secondary()
只是一个首选项,而不是命令。当应用程序不知道辅助服务器存在时,它将从主服务器读取数据

要使应用程序了解二级数据库,需要使用类而不是将主机的
std::vector
作为构造函数参数的
DBClientConnection
。此数组应包括集合的所有成员


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

当应用程序连接到任何活动副本成员时,它将发出一个内部类型的
rs.status()
,实际上是一个
isMaster
命令(),并将该命令的响应缓存一段特定时间,直到认为适合刷新该信息,事实上,C++驱动程序甚至告诉你要保存缓存的类:

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


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

Mongodb不是一个键值存储,所以不知道为什么要将其标记为such,这是正确的,可以假设其他驱动程序(如Java)有自己的副本集监视器版本,并且应该遵循选择副本和刷新缓存的相同逻辑?@2di事实上,我知道的每个驱动程序都有自己的版本。