1

所以我喜欢使用单独的数据库来处理写入的想法(可以说 2 个写入数据库,然后每个可以有 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 文档等……仍然很困惑。

4

1 回答 1

6

MongoDB 中的复制和分片是有区别的。

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

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

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

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

如果没有 SlaveOK 标志,您可以保证读回您刚刚写入的数据(除非其他人从那时起对其进行了修改)。使用 SlaveOK 标志,没有这样的保证:辅助节点可能比主节点晚几秒、几分钟甚至几小时。

如果您想使用 MongoDB 进行写入扩展,则需要设置分片。

于 2012-08-30T20:24:11.940 回答