要设置复制集,我在3个独立的终端选项卡中运行:

 $ sudo mongod --replSet rs0 --dbpath /data/mining --port 27017
 $ sudo mongod --replSet rs0 --dbpath /data/mining2 --port 27018
 $ sudo mongod --replSet rs0 --dbpath /data/mining3 --port 27019

然后,我在Mongo shell中配置了复制,并验证它是否有效:

 > var rsconf = {
     _id: "rs0",
     members: [
       {
         _id: 0,
         host: 'localhost:27017'
       },
       {
         _id: 1,
         host: 'localhost:27018'
       },
       {
         _id: 2,
         host: 'localhost:27019'
       }
     ]
   };
 > rs.initiate(rsconf);
{
  "info": "Config now saved locally.  Should come online in about a minute.",
  "ok": 1
}
// Some time later...
 > rs.status()
{
  "set": "rs0",
  "date": ISODate("2013-06-17T13:23:45-0400"),
  "myState": 2,
  "syncingTo": "localhost:27017",
  "members": [
    {
      "_id": 0,
      "name": "localhost:27017",
      "health": 1,
      "state": 1,
      "stateStr": "PRIMARY",
      "uptime": 4582,
      "optime": {
        "t": 1371489546,
        "i": 1
      },
      "optimeDate": ISODate("2013-06-17T13:19:06-0400"),
      "lastHeartbeat": ISODate("2013-06-17T13:23:44-0400"),
      "lastHeartbeatRecv": ISODate("2013-06-17T13:23:44-0400"),
      "pingMs": 0
    },
    {
      "_id": 1,
      "name": "localhost:27018",
      "health": 1,
      "state": 2,
      "stateStr": "SECONDARY",
      "uptime": 5034,
      "optime": {
        "t": 1371489546,
        "i": 1
      },
      "optimeDate": ISODate("2013-06-17T13:19:06-0400"),
      "self": true
    },
    {
      "_id": 2,
      "name": "localhost:27019",
      "health": 1,
      "state": 2,
      "stateStr": "SECONDARY",
      "uptime": 4582,
      "optime": {
        "t": 1371489546,
        "i": 1
      },
      "optimeDate": ISODate("2013-06-17T13:19:06-0400"),
      "lastHeartbeat": ISODate("2013-06-17T13:23:44-0400"),
      "lastHeartbeatRecv": ISODate("2013-06-17T13:23:45-0400"),
      "pingMs": 0,
      "syncingTo": "localhost:27017"
    }
  ],
  "ok": 1
}

我的脚本在主脚本中运行良好:

 $ ./runScripts.sh -h localhost -p 27017
MongoDB shell version: 2.4.3
connecting to: localhost:27017/test
Successful completion

然而,针对任何一个次要问题:

 $ ./runScripts.sh -h localhost -p 27018
MongoDB shell version: 2.4.3
connecting to: localhost:27017/test
Mon Jun 17 13:30:22.989 JavaScript execution failed: count failed: 
{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } 
at src/mongo/shell/query.js:L180
failed to load: /.../.../myAggregateScript.js

我在多个地方读过使用rs.slaveOk()db.getMongo().setSlaveOk()的文章,但无论是从shell输入还是在脚本中调用,它们都没有任何效果.这些语句在调用时没有抛出错误,但它们也没有解决问题.

Does anyone know why I can't configure my replset to allow querying of the secondary?

推荐答案

mongo shell中的rs.slaveOk() run将允许您从二级数据库中读取数据.下面是在MongoDB 2.4.3下使用mongo shell的演示:

$ mongo --port 27017
MongoDB shell version: 2.4.3
connecting to: 127.0.0.1:27017/test
replset:PRIMARY> db.foo.save({})
replset:PRIMARY> db.foo.find()
{ "_id" : ObjectId("51bf5dbd473d5e80fc095b17") }
replset:PRIMARY> exit

$ mongo --port 27018
MongoDB shell version: 2.4.3
connecting to: 127.0.0.1:27018/test
replset:SECONDARY> db.foo.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
replset:SECONDARY> rs.slaveOk()
replset:SECONDARY> db.foo.find()
{ "_id" : ObjectId("51bf5dbd473d5e80fc095b17") }
replset:SECONDARY> db.foo.count()
1

Mongodb相关问答推荐

如何在MongoDB中正确解析佛年?

MongoDB Aggregate-如何在条件中替换字符串中的变量

MongoDB合并按键更新值的对象数组

MongoDB 对特定搜索查询的响应时间较长

在不知道字段名称的情况下如何引用 MongoDB 中的字段?

Mongo聚合的具体格式

Spring Data + MongoDB GridFS 可以通过 Repository 访问吗?

Pymongo API TypeError: Unhashable dict

创建索引需要很长时间

实现 twitter 和 facebook 之类的主题标签

当属性确实存在时,为什么mongoose模型的 hasOwnProperty 返回 false?

MongoDB - 如果新值更大,则更新字段

使用 AngularJs 和 MongoDB/Mongoose

MongoDB映射/减少多个集合?

Node.js 和 MongoDB,重用 DB 对象

mongo php副本连接非常慢

如何使用node.js http服务器从mongodb返回大量行?

MongoDB - 聚合 - 获取数组中的唯一项

Mongoose / MongoDB 用户通知方案建议

如何在 MongoDB 中删除此弃用警告,为什么会这样?