【问题标题】:MongoDB PHP: Reading from Slaves and setting persistent connections with a heavy read environmentMongoDB PHP:从 Slaves 读取并使用重读环境设置持久连接
【发布时间】: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


【解决方案1】:

SlaveOkay 和读取首选项

SlaveOkay 首选项实际上是“次要首选”,但仍允许从主要读取。

MongoDB 2.2 和 Mongo PHP 1.3.0 驱动程序引入了几个新的Read Preference Modes,所以现在有:

  • primary - 仅从主节点读取
  • primaryPreferred - 从主数据库读取,除非它不可用
  • secondary - 仅从辅助节点读取
  • secondaryPreferred - 更喜欢从辅助读取(与 slaveOK 等效的语义)
  • nearest - 从副本集中最近的成员读取(按 ping 时间)

MongoDB 2.2 的另一个新特性是支持Tag Sets,它允许您通过标记副本集成员来指定自定义读取首选项。这允许您定位特定的辅助节点。例如,副本集成员可以标记为:{ 'group' : 'reporting' }

有关 PHP 驱动程序中读取首选项的更多信息,请参阅Mongo manual on PHP.net: Read Preferences

持久连接

连接池已针对 PHP 1.3.0 驱动程序版本进行了重写,所有连接现在都是持久的。

根据changelog

删除了“持久”选项,因为所有连接现在都是持久的。它仍然可以使用,但它不会影响任何东西。

【讨论】:

  • 请注意,PHP 1.3.0 驱动程序目前处于发布测试的最后阶段(1.3.0RC3 已于今天发布)。
  • 谢谢斯坦尼;我今天看到了RC3的帖子,很高兴。我对在生产中使用它有点紧张,你不会碰巧知道它离被关闭有多近吧?为那个司机感到兴奋!
  • Mongo PHP 1.3.0 版本自 8 月以来一直处于公共 beta 测试阶段,这是第三个候选版本。除非发现任何重大错误,否则我希望它接近最终版本。在您的开发/登台环境中进行测试是值得的,但我倾向于等待最终版本在生产中使用它。可以看到outstanding issues for this release的列表,主要是文档。
  • 正如我在上面评论的,请注意,这不会给您有效的读取扩展,因为辅助节点必须执行与主节点完全相同的写入。
猜你喜欢
  • 2011-08-19
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多