何时查询Mongo DB的副本集

Pet*_*gad 3 php mongodb mongodb-php

我正在努力理解的一件事是,在设置我们当前的Mongo配置时,我们目前有两台带有仲裁器的服务器.

现在我先创建一个关于主人的记录; 去了二级,然后试图找到它,我收到的错误看起来像:

error: { "$err" : "not master and slaveok=false", "code" : 13435 }
Run Code Online (Sandbox Code Playgroud)

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

rs.slaveOk();
Run Code Online (Sandbox Code Playgroud)

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

基本上我有一个服务器池,我打算连接到它们:

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

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

先感谢您

dam*_*ier 10

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

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

让PRIMARY共享一些读取负载的一个建议是在将查询标记为slaveOk时随机化 - 请参阅此处的讨论

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

希望有所帮助!