2015-07-12 18 views
8

Tôi đã triển khai một bộ bản sao mà tôi đang sử dụng trên toàn cầu. Tôi có chủ của tôi ở Oregon, Hoa Kỳ và 4 người thứ hai. California và Virginia, Frankfurt và Sydney. Tôi cũng có các máy chủ web trong cùng một khu vực. Các máy chủ web đó kết nối với mongo bằng cách sử dụng mongoose:Mongoose không đọc từ cơ sở dữ liệu thứ cấp Mongo

var mongoose = require("mongoose"); 
var dbUrl = "mongodb://***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017/exampleDb"; 
var dbOptions : { 
    "replSet": { 
     "rs_name": "exampleRepSet", 
     "readPreference": "ReadPreference.SECONDARY_PREFERRED", 
     "read_preference": "ReadPreference.SECONDARY_PREFERRED", 
     "w":0, 
     "slaveOk": true 
    } 
} 
mongoose.connect(dbUrl, dbOptions); 

Vấn đề của tôi là khách hàng của tôi có độ trễ cao hơn tùy thuộc vào độ chính xác của máy chủ. California nhận 40ms trong khi Sydney đạt 400 mili giây. Tôi không hiểu tại sao điều này xảy ra vì họ nên đọc ra khỏi cơ sở dữ liệu thứ cấp trong khu vực của họ.

Tôi hiểu rằng việc viết phải được thực hiện cho chính nhưng ngay cả khi tôi thực hiện tìm thì không nên thực hiện trên khu vực phụ và trả lại khá nhanh?

Tôi nhận thấy có một số tùy chọn dự phòng trong cấu hình đó nhưng tôi đang tuyệt vọng. Tôi cũng đã thử tùy chọn "ReadPreference.NEAREST" không có kết quả.

+0

Phiên bản nào của cầy mangut bạn có đang chạy? – ThrowsException

Trả lời

3

Hãy thử sử dụng các tùy chọn sau:

var mongoose = require("mongoose"); 
var dbUrl = "mongodb://***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017/exampleDb"; 

mongoose.connect(dbUrl, { 
    server: { 
     readPreference: "nearest", 
     strategy: "ping" 
    }, 
    replset: { 
     rs_name: "exampleRepSet", 
     readPreference: "nearest", 
     strategy: "ping" 
    } 
}); 

Trong khi các tài liệu quy định cụ thể ping như chiến lược mặc định, có vẻ như nhiệm vụ Mongoose mà bạn chỉ định một khi bạn sử dụng readPreference.

Cũng lưu ý rằng secondaryPreferred không giống như nearest. secondaryPreferred thích đọc của các thành viên phụ (như tên cho thấy) bất kể độ trễ của mạng, trong đó nearest ưu tiên lần đọc cho thành viên có thời gian chờ mạng thấp nhất.

Thiếu cấu hình sai trong bộ bản sao của bạn, đảm bảo tên chính của bạn trực tuyến và có thể truy cập - theo mặc định Mongoose sẽ từ chối sử dụng phụ nếu tiểu học ngoại tuyến.

+0

Là nó chỉ cho tôi hoặc là các tùy chọn mongoose một chút lộn xộn? –

+1

@JoshElias Có, chắc chắn đồng ý với bạn ở đó. Điều gì làm cho nó tồi tệ nhất là một phần lớn tài liệu của họ là khủng khiếp khi nói đến mô tả các tùy chọn và cung cấp các ví dụ. – jduncanator

+0

Có tài liệu của họ là khủng khiếp và họ rất hạn chế trong các ví dụ mà họ cung cấp. Một lý do tôi đang rời xa họ. –

3

Sửa

Hãy thử thiết lập các sở thích đọc trên chuỗi kết nối bản thân với mongodb://connection/db/?readPreference=secondary và không nằm trong dbOptions. Tôi không thể tìm thấy bất cứ điều gì trong nút-mongodb-native nói rằng một sở thích đọc có thể được thêm vào cấu hình replset. http://mongodb.github.io/node-mongodb-native/2.0/api/ReplSet.html

Old trả lời

Bạn có thể cần phải thiết lập các thiết lập để gần nhất và không thứ ưa thích. http://docs.mongodb.org/manual/reference/read-preference/#nearest

+0

Tôi tin rằng tùy chọn SECONDARY_PREFERRED sẽ hoạt động giống như NEAREST với ngoại lệ là nó sẽ thích đọc ra khỏi trung học. http://docs.mongodb.org/manual/core/read-preference-mechanics/#replica-set-read-preference-behavior-nearest –

+0

mã hóa cứng rằng tùy chọn trong url kết nối mongodb thực sự sẽ hoạt động nhưng đó không phải là mongoose giải pháp tôi đã hy vọng cho –

0
dbOptions.db = { 
    readPreference: "secondaryPreferred", 
}; 

này làm việc cho tôi

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