2013-06-17 28 views
19

Để thiết lập các thiết lập sao, tôi đã chạy trong 3 tab thiết bị đầu cuối riêng biệt:MongoDB replica set ngăn chặn các truy vấn để thứ

$ 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 

Sau đó, tôi được cấu hình sao chép trong vỏ Mongo và xác minh rằng nó làm việc:

> 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 
} 

kịch bản của tôi chạy tốt so với chính:

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

Tuy nhiên, so với eith er thứ:

$ ./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 

Tôi đã đọc ở nhiều nơi sử dụng rs.slaveOk() hoặc db.getMongo().setSlaveOk(), nhưng không ai trong số những có bất kỳ tác dụng, cho dù nhập từ vỏ hoặc gọi trong kịch bản của tôi. Những tuyên bố này không ném lỗi khi được gọi, nhưng họ cũng không khắc phục được sự cố.

Có ai biết lý do tại sao tôi không thể định cấu hình thay thế của mình để cho phép truy vấn phụ?

+1

rs.slaveOk() sẽ cho phép bạn đọc. Tôi chỉ thử nghiệm bằng cách sử dụng vỏ mongo và 2.4.3 và một số() làm việc cho tôi. Bạn có thể chia sẻ kịch bản của mình không? –

+0

@JamesWahlin là đúng - cách duy nhất điều này xảy ra là nếu bạn không thiết lập rs.slaveOk() trước khi chạy lệnh cho kết quả này. Thông tin thêm về nội dung tập lệnh js của bạn có thể hữu ích. –

+2

có thể trùng lặp của [mongodb, sao chép và lỗi: {"$ err": "không phải là master và slaveOk = false", "code": 13435}] (http://stackoverflow.com/questions/8990158/mongodb-replicates- và-error-err-not-master-and-slaveok-false-code) – Pykler

Trả lời

47

rs.slaveOk() chạy trong vỏ mongo sẽ cho phép bạn đọc từ thứ hai. Dưới đây là một minh chứng bằng cách sử dụng vỏ Mongo dưới MongoDB 2.4.3:

$ 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 
+0

cảm ơn rất nhiều người vì điều này. –

+1

Có những lý do mà 'slaveOK' tồn tại, nó sẽ có giá trị trong khi chỉ ra những lý do đó là gì. Ví dụ: 'QUAN TRỌNG Chăm sóc tập thể dục khi chỉ định tùy chọn đọc: Chế độ không phải chính có thể trả về dữ liệu cũ vì sao chép không đồng bộ, dữ liệu trong phụ có thể không phản ánh hoạt động viết gần đây nhất.' – Madbreaks

+0

Duhhh Tôi đã kết nối vào ngày 27017 tiểu học .... sau khi khởi động lại tôi đã phải xây dựng lại điều ngu ngốc, và chủ mới của tôi là 27018. Bài viết trên đã giúp. – Andy

13

Bạn cần phải chạy lệnh rs.slaveOk() trong vỏ máy chủ thứ cấp của.

Các vấn đề liên quan