【发布时间】:2012-11-20 14:50:57
【问题描述】:
我正在尝试将所有传入的读取查询设置为命中我的 mongo 服务器上的从属服务器。
我在 PHP 文档中看到了对以下内容的引用:
MongoCursor::$slaveOkay = true;
但是,这似乎只是设置了要向从站发送的查询;不是真的做任何其他事情。我与服务器的连接如下所示:
$mongo = new Mongo("mongodb://my.server:27017",
array("replicaSet" => 'replicaSet', "persist" => "pool")
);
如果我只想连接到从属设备进行读取,我是否需要对持久连接执行不同的操作?
如何将查询定位为仅命中从属设备,以便我在主服务器上的写入不会阻塞传入的读取请求。
PHP 文档向我展示了这个示例:
$db->setSlaveOkay(true);
$c = $db->myCollection;
$cursor = $c->find();
但是,我对上述两者之间的区别感到困惑,以及是否需要两者。
【问题讨论】:
-
您的逻辑不正确 - 辅助节点正在处理与主节点相同的写入请求(通过复制),因此主节点上的写入不会阻塞传入的读取请求,但辅助节点上的写入将要!此外,现在您得到的是陈旧的数据。副本集对读取扩展没有帮助,只是高可用性和故障转移。如果您的流量超过了主节点的处理能力,则需要分片。
-
@AsyaKamsky 啊,我不知道。因此,如果我说 5 个从属设备,并且已经向他们进行读取,它不会扩大我的读取请求吗?我有高读取和低写入,所以我想通过在副本集中拥有一些从属设备来帮助创建快速查询。
-
查询通常不会很慢,因为有太多的同时读取,它们通常很慢,因为没有适当的索引(在所有辅助节点上都相同)或者因为索引/工作数据集无法放入 RAM (获得更多 RAM 将是解决方案,因为辅助节点通常不会有更多 RAM,但数据大小完全相同)。
标签: php mongodb mongodb-php