所以我喜欢使用单独的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文档等等......仍然感到困惑。
答案 0 :(得分:5)
MongoDB中的复制和分片之间存在差异。
如果您正在使用复制,则只有一个节点正在接收写入 - 主节点。您的驱动程序连接到副本集,并且所有写入都将转到单个主节点,无论当时恰好是哪个节点。
如果要使用MongoDB在多个节点之间分发写入,则必须设置分片。通过分片,您的驱动程序将连接到路由器进程('mongos'),这将自动将写入路由到群集中的正确节点。
复制用于持久性,故障转移,备份和(偶尔)读取扩展。
默认情况下,所有读取也会转到主节点。 'slaveOK'标志(已被弃用以支持Read Preference)允许读取进入辅助节点。这允许查询负载从主节点分发,代价是可能读取陈旧数据。
如果没有SlaveOK标志,您可以保证回读刚才写的数据(除非其他人从那时起对其进行了修改)。使用SlaveOK标志,没有这样的保证:次要可能是秒,分钟,甚至是小时后的小时。
如果你想用MongoDB进行写缩放,那么你需要设置分片。