读/写Mongodb中的不同副本集

时间:2012-08-30 19:10:41

标签: php mongodb

所以我喜欢使用单独的db来处理写入(可能会说2个写入db,然后每个可以有3个副本用于读取)。

    $mongo = new   Mongo("mongodb://localhost:27017",array('connect'=>true,'timeout'=>2000, 'persist'=>'test_mongodb_con','replicaSet'=>true));

并测试......

    $user = array('email'=>'test@test.com','firstname'=>'test','lastname'=>'user','twitter'=>'@test','time'=>date('m:i:s'));

    $mongo->test->testuser->insert($user);

    $cursor = $mongo->test->testuser->find()->slaveOkay(true);

但当slaveOkay为真时唯一的区别是标志键的值为4 - 但它并没有告诉我它实际使用的是哪个数据库。因为mongod知道所有复制品,所以我将它们放在不同的端口上是否重要?

我已经搜索了这个主题几个小时,找不到任何完全回答我问题的内容。我已经阅读了php文档,mongo文档等等......仍然感到困惑。

1 个答案:

答案 0 :(得分:5)

MongoDB中的复制和分片之间存在差异。

如果您正在使用复制,则只有一个节点正在接收写入 - 主节点。您的驱动程序连接到副本集,并且所有写入都将转到单个主节点,无论当时恰好是哪个节点。

如果要使用MongoDB在多个节点之间分发写入,则必须设置分片。通过分片,您的驱动程序将连接到路由器进程('mongos'),这将自动将写入路由到群集中的正确节点。

复制用于持久性,故障转移,备份和(偶尔)读取扩展。

默认情况下,所有读取也会转到主节点。 'slaveOK'标志(已被弃用以支持Read Preference)允许读取进入辅助节点。这允许查询负载从主节点分发,代价是可能读取陈旧数据。

如果没有SlaveOK标志,您可以保证回读刚才写的数据(除非其他人从那时起对其进行了修改)。使用SlaveOK标志,没有这样的保证:次要可能是秒,分钟,甚至是小时后的小时。

如果你想用MongoDB进行写缩放,那么你需要设置分片。