我正在尝试将所有传入的读取查询设置为命中我的 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();
但是,我对上述两者之间的区别感到困惑,以及是否需要两者。
最佳答案
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 :
Removed the "persist" option, as all connections are now persistent. It can still be used, but it doesn't affect anything.
关于php - MongoDB PHP : Reading from Slaves and setting persistent connections with a heavy read environment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13475762/