Performance mongos如何选择副本集中的mongod作为碎片

Performance mongos如何选择副本集中的mongod作为碎片,performance,mongodb,sharding,Performance,Mongodb,Sharding,有人知道mongos如何选择mongod来执行查询/插入/ 我们有3块碎片。每个碎片都有3个Mongod,它们被配置为一个副本集 [更详细] 在mongos使用shard key确定哪个shardmay可以是多个shard来执行请求后,mongos如何在shard中选择正确的mongodi,一个是主的,另外两个是辅助的?或者如何引导mongos读取碎片中的次要成员?可能吗?是否可以使用ReadPreference.SECONDARY\u PREFERRED?它使用主成员,即您唯一可以写入的成员,

有人知道mongos如何选择mongod来执行查询/插入/

我们有3块碎片。每个碎片都有3个Mongod,它们被配置为一个副本集

[更详细]
在mongos使用shard key确定哪个shardmay可以是多个shard来执行请求后,mongos如何在shard中选择正确的mongodi,一个是主的,另外两个是辅助的?或者如何引导mongos读取碎片中的次要成员?可能吗?是否可以使用ReadPreference.SECONDARY\u PREFERRED?

它使用主成员,即您唯一可以写入的成员,与任何其他驱动程序使用的方式基本相同

编辑 澄清一下,我说的是写作。对复制集的所有写入,无论是否作为碎片初始化,都将仅写入主副本集

此答案是针对以下插入位给出的:

查询/插入/


并且在进行任何编辑之前提供。

您的mongos实例将查看查询或插入中的碎片键。它知道哪个碎片持有碎片密钥的哪个范围。有一个技术解释。您可以查看sh.status的输出,查看哪个碎片包含哪个范围。它将从每个碎片将您连接到主复制集成员。

我认为,如果您不请求从复制集成员只查询主复制集成员,mongos将查询从复制集成员

因此,如果您创建MongoClient实例与mongos进行如下对话:

MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
...
builder.readPreference(ReadPreference.nearest()); // not the primary
...
MongoClientOptions clientOptions = builder.build();
mongoClient = new MongoClient(serverAddr, clientOptions);
我想你其实不需要担心。mongos将在一个确定的碎片中明智地选择一个正确的mongod。实际上,我们的DBA告诉我他看到了对奴隶mongod的查询

该观点通过OP_QUERY结构中的flags值传递给mongos。 我调试到mongodb java驱动器中,看到值是4,这意味着设置了SlaveOK位。 请参阅:
有关更多详细信息。

我认为这是一个复制集@特里好像在问你shards@Mzzl嗯,再看一遍,我不确定他在问什么,他说一个mongod作为碎片出现在复制集中……嗯,这就是我的理解:三个碎片,每个碎片由一个3人的repl集组成。这听起来是一个合理的设置。@Mzzl它读起来也是这样的,嗯,我们的两个答案涵盖了每一个问题possibility@Mzzl你的答案可能更正确,但我不知道,他可能在谈论如何从碎片集中选择mongod或从副本集中选择mongod,不知道,我们将从每个碎片中找到您所说的,它将您连接到主复制集成员。-因此,我不能使用ReadPreference.SECONDARY\u PREFERRED之类的命令来指示mongos在确定的碎片中使用辅助复制集成员?正如我所知,驱动程序使用ReadPreference.SECONDARY\u PREFERRED之类的命令。驱动程序使用此值来确定要连接到哪一个。是否将此值传递给mongos???此问题似乎与主题无关,因为它属于dba.stackexchange.com,因为它与编程无关。这仅适用于读取操作,写入操作将只传递给主操作