mongodb, sao chép và lỗi: {phiên bản $ err Lỗi: không phải là chủ và nô lệ = false, mã Code: 13435}


174

Tôi đã thử bộ bản sao mongo lần đầu tiên.

Tôi đang sử dụng Ubuntu trên ec2 và tôi đã khởi động ba trường hợp. Tôi đã sử dụng địa chỉ IP riêng của từng trường hợp. Tôi chọn trên là chính và dưới đây là mã.

mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)

Tất cả tại thời điểm này là tốt. Khi tôi truy cập trang web http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_Vplset tôi thấy rằng tôi có một chính, thứ hai và arbitor.

Ok, bây giờ cho một bài kiểm tra.

Trên cơ sở chính tạo một cơ sở dữ liệu trong đây là mã:

use tt
db.tt.save( { a : 123 } )

trên phụ, sau đó tôi làm điều này và nhận được lỗi dưới đây:

db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

Tôi rất mới với mongodb và nhân rộng nhưng tôi nghĩ rằng nếu tôi làm một cái gì đó trong một cái, nó sẽ đi đến cái khác. Vì vậy, nếu tôi thêm một bản ghi trong một, tôi phải làm gì để nhân rộng trên các máy?


tìm ra rằng tôi phải sử dụng rs.slaveOk (); Điều đó để lại cho tôi một câu hỏi khác. Tôi phải làm điều này làm điều này cho mọi truy vấn? Nếu tôi đang ở nút chủ thì sao?

Câu trả lời:


282

Bạn phải đặt chế độ "nô lệ ổn" để cho trình vỏ mongo biết rằng bạn cho phép đọc từ phụ. Điều này là để bảo vệ bạn và các ứng dụng của bạn khỏi việc thực hiện các lần đọc nhất quán một cách tình cờ. Bạn có thể làm điều này trong shell với:

rs.slaveOk()

Sau đó, bạn có thể truy vấn bình thường từ thứ hai.

Một lưu ý về "tính nhất quán cuối cùng": trong các trường hợp thông thường, các bản sao được đặt bản sao có tất cả dữ liệu giống như dữ liệu gốc trong vòng một giây hoặc ít hơn. Dưới tải rất cao, dữ liệu mà bạn đã viết cho chính có thể mất một thời gian để sao chép sang phần phụ. Điều này được gọi là "độ trễ bản sao" và đọc từ một thứ cấp trễ được gọi là đọc "cuối cùng nhất quán", bởi vì, trong khi dữ liệu mới được ghi sẽ xuất hiện tại một số điểm (lỗi mạng bị chặn, v.v.), nó có thể không có sẵn ngay lập tức.

Chỉnh sửa: Bạn chỉ cần đặt nô lệ khi truy vấn từ các mục phụ và chỉ một lần mỗi phiên.


3
Luôn kiểm tra hướng dẫn trước khi bạn thực hiện các lệnh bạn không hiểu trên DB của mình. Có thể có hậu quả cho lệnh mà câu trả lời không giải thích. Lệnh này có thay đổi cách đọc khẩu phần ope được phân phối cho tất cả các kết nối đến bộ bản sao không? Tốt hơn tìm hiểu. Lệnh này xuất hiện từ tận v2.2 docs.mongodb.com/v2.2/reference/method/rs.slaveOk Bạn có thể (và nên) luôn thay thế phần "/ thủ công /" của URL docs.mongodb.com đến phiên bản cụ thể của bạn để đảm bảo bạn sẽ nhận được thông tin liên quan.
Bruno Bronosky

45

Để tránh gõ rs.slaveOk()mỗi lần, hãy làm điều này:

Tạo một tệp có tên replStart.js, chứa một dòng:rs.slaveOk()

Sau đó bao gồm --shell replStart.jskhi bạn khởi chạy vỏ Mongo. Tất nhiên, nếu bạn đang kết nối cục bộ với một thể hiện duy nhất, điều này sẽ không lưu bất kỳ thao tác gõ nào.


26
Một cách tốt hơn để tiết kiệm khi gõ sẽ là thêm rs.slaveOk()vào ~/.mongorc.jstệp của bạn , nó sẽ được thực hiện tự động khi bắt đầu trình vỏ mongo.
Stennie

2
Tôi tìm thấy nó hữu ích để đặt cấu hình mặc định trong ~/.mongorc.jsvà cấu hình tùy chỉnh trong replStart.jshoặc adminStart.jshoặc bất cứ điều gì.
Ed Norris

41

trong mongodb2.0

bạn nên gõ

rs.slaveOk()

trong nút mongod thứ cấp


11

ĐÂY CHỈ LÀ MỘT LƯU Ý CHO BẤT CỨ NGƯỜI NÀO NÓI VỚI VẤN ĐỀ NÀY SỬ DỤNG DRAG RUBY

Tôi gặp vấn đề tương tự khi sử dụng Ruby Gem.

Để đặt SlaveOk trong Ruby, bạn chỉ cần chuyển nó làm đối số khi bạn tạo ứng dụng khách như thế này:

mongo_client = MongoClient.new("localhost", 27017, { slave_ok: true })

https://github.com/mongodb/mongo-ruby-do/wiki/Tutorial#making-a-connection

mongo_client = MongoClient.new # (optional host/port args)

Lưu ý rằng 'args' là đối số tùy chọn thứ ba.



1

Tôi chỉ thêm câu trả lời này cho một tình huống khó xử từ nhà cung cấp DB.

những gì đã xảy ra trong trường hợp của chúng ta là db chính và phụ thay đổi ngược lại (chính sang phụ và ngược lại) và chúng ta đang gặp cùng một lỗi.

vì vậy vui lòng kiểm tra cài đặt cấu hình cho trạng thái cơ sở dữ liệu có thể giúp bạn.


0

Tôi đến đây tìm kiếm các lỗi tương tự, nhưng từ tài xế bản địa Node.js . Câu trả lời đối với tôi là sự kết hợp của câu trả lời bằng campetersonPrabhat .

Vấn đề là readPreferencecài đặt mặc định primary, sau đó bằng cách nào đó dẫn đến slaveOklỗi khó hiểu . Vấn đề của tôi là tôi chỉ muốn đọc từ bản sao được đặt từ bất kỳ nút nào. Tôi thậm chí không kết nối với nó như là bản sao. Tôi chỉ kết nối với bất kỳ nút nào để đọc từ nó.

Thiết readPreferenceđến primaryPreferred(hoặc tốt hơn để các ReadPreference.PRIMARY_PREFERREDhằng số) giải quyết nó cho tôi. Chỉ cần vượt qua nó như một tùy chọn để MongoClient.connect()hoặc client.db()hoặc bất kỳ find(), aggregate()hoặc chức năng khác.

const { MongoClient, ReadPreference } = require('mongodb');
const client = await MongoClient.connect(MONGODB_CONNECTIONSTRING, { readPreference: ReadPreference.PRIMARY_PREFERRED });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.