何时查询Mongodb的副本集

时间:2011-10-21 18:47:01

标签: php mongodb mongodb-php

我很难理解的一件事是,在设置我们当前的Mongo配置时,我们当前有两台带有仲裁器的服务器。

现在首先我在主人身上创造了一条记录;去了二级,然后试图找到它,我收到的错误看起来像:

error: { "$err" : "not master and slaveok=false", "code" : 13435 }

在mongo的网站上阅读关于Slave OK我在辅助服务器上发现我需要设置

rs.slaveOk();

然而,我并不完全理解为什么在查询服务器时我会在PHP中执行此操作;或者如果我错误地理解这一点。

基本上我有一个服务器池,我正计划连接它们:

$m = new Mongo("mongodb://localhost:27017", array("replicaSet" => "myReplSetName"));?>

然后这将连接到主..但是这似乎不会分配读取负载然后..我怎么能分配读取负载,以便它跨越两个服务器,从而使查询更快?

提前谢谢

1 个答案:

答案 0 :(得分:10)

这是连接到副本集的可接受方式。假设命名服务器已启动,驱动程序连接将发现群集中的其余服务器,并且能够在允许时将查询指向它们,并通过故障转移事件遵循“PRIMARY”指定。不过,最好将其他服务器添加到此“种子列表”中,这样​​如果其中一个“种子”服务器发生故障,连接仍然可以成功。

至于分发阅读......这种行为在驾驶员的判断下实际上是在行动中。但是普遍接受的语义是:如果请求了slaveOk读取,那么读取查询将转到SECONDARY服务器(如果有的话);只有当没有可用时才会进入PRIMARY。当然,写查询总是会转到PRIMARY。

让PRIMARY共享一些读取负载的一个建议是在将查询标记为slaveOk时随机化 - see the discussion here

要在PHP中将查询标记为slaveOk,您可以在多个级别设置此位 - 连接,数据库,集合或集群 - API details here这提供了几种实现上述随机化技术的可能方法 - 例如,尝试确保连接池中的一半连接设置了slaveOk位。

希望有所帮助!