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

时间:2014-01-03 10:01:33

标签: performance mongodb sharding

有谁知道mongos如何选择一个mongod来执行查询/插入/ ...?

我们有3个分片。每个碎片都有3个mongod(s),它们被配置为副本集。


[更多细节] 在mongos确定使用分片键执行请求的哪个分片(可能是多个分片)之后,mongos如何选择正确的mongod(在分片中,一个是主要的,另外两个是次要的)?或者如何指导mongos从碎片中的次要成员读取?可能吗?是否可以使用ReadPreference.SECONDARY_PREFERRED?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为如果你不要求它只查询主服务器,那么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的查询)

这个opition通过OP_QUERY结构中的“flags”值传递给mongos。 我调试到mongodb java驱动器,看到值为4 ---这意味着“SlaveOK”位置位。 请参阅:http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/?pageVersion=106#op-query 了解更多细节。

答案 2 :(得分:-2)

主要成员是唯一可以写入的成员,与其他任何驱动程序的方式非常相似。

修改

澄清我在谈论写作。对副本集的所有写入设置是否作为分片都将仅为主分区。

这个回答是为了回应insert位:

  

查询/插入/ ...

在任何编辑之前都给出了。