2015-11-16 43 views
8

Trong chế độ bản sao, mỗi thao tác ghi vào bộ sưu tập bất kỳ trong bất kỳ DB nào, cũng ghi vào bộ sưu tập oplog.MongoDB 3.0 ghi khóa trên bộ sưu tập oplog ở chế độ bản sao

Bây giờ, khi viết cho nhiều DB song song, tất cả các thao tác ghi này cũng ghi vào oplog. Câu hỏi của tôi: các hoạt động viết này có yêu cầu khóa oplog không? (Tôi đang sử dụng w: 1 viết quan tâm). Nếu họ làm, điều này tương tự như việc có một khóa toàn cầu giữa tất cả các hoạt động ghi cho tất cả các DB khác nhau, phải không?

Tôi rất sẵn lòng nhận được bất kỳ gợi ý nào về vấn đề này.

Trả lời

4

Theo số documentation, khi nhân bản, khi MongoDB ghi vào bộ sưu tập trên trang chính, MongoDB cũng viết cho oplog chính, là bộ sưu tập đặc biệt trong cơ sở dữ liệu cục bộ. Do đó, MongoDB phải khóa cả cơ sở dữ liệu của bộ sưu tập và cơ sở dữ liệu cục bộ. Mongod phải khóa cả hai cơ sở dữ liệu cùng một lúc để giữ cho cơ sở dữ liệu nhất quán và đảm bảo rằng các hoạt động ghi, ngay cả với bản sao, là các hoạt động “tất cả hoặc không có gì”.

Điều này có nghĩa là việc ghi đồng thời vào nhiều cơ sở dữ liệu song song trên cơ sở chính có thể dẫn đến khóa toàn cầu giữa tất cả các thao tác ghi. Điều này không áp dụng cho thứ cấp, vì MongoDB không áp dụng ghi serially cho secondaries, nhưng thay vào đó thu thập các mục nhập oplog theo lô và sau đó áp dụng các lô đó song song.

+0

Hm, tôi đã đọc tài liệu, nhưng tôi vẫn không thể tin được. Vì các mục nhập oplog là idempotent và cơ sở dữ liệu bị khóa trên ứng dụng, sẽ thực sự không cần nó ... Tôi thực sự không hiểu. –

+1

Bài đăng trên blog này cũng đáng để đọc. Tác giả đã gặp phải 'khóa toàn cầu' này khi phát triển một hệ thống số liệu thời gian thực. – Jaco

+1

Quên thêm liên kết: link: http: //daprlabs.com/blog/blog/2014/04/19/mongodb/. Xin lưu ý rằng blogger làm việc cho Microsoft và một số kết luận của ông dường như hơi thiên vị. – Jaco

3

Tuyên bố miễn trừ Đây là tất cả những điều thú vị nhất của tôi, vì vậy xin đừng đóng đinh tôi nếu tôi có lỗi. Tuy nhiên, hãy sửa tôi.

Tại sao phải không?

  1. Tiền đề: Cơ sở dữ liệu, theo định nghĩa, không được kết nối với nhau
  2. oplog entries are always idempotent
  3. Các Oplog là một capped collection, with a guarantee of preserving the insert order

Giả sử lý song song thực sự của các truy vấn được áp dụng. Vì vậy, chúng tôi có hai truy vấn đến cùng một lúc và chúng tôi cần phải quyết định cái nào để chèn vào oplog trước. Người đầu tiên lấy khóa sẽ viết đầu tiên, phải không? Ngoại trừ, có một vấn đề. Giả sử truy vấn đầu tiên là một truy vấn đơn giản db.collection.update({_id:"foo"},{$set:{"bar":"baz"}}) trong khi truy vấn khác phức tạp hơn và mất nhiều thời gian hơn để đánh giá tính chính xác. Vì vậy, để ngăn chặn điều đó, một khóa phải được thực hiện khi đến và được phát hành sau khi mục nhập oplog idempotent được viết.

Đây là nơi tôi phải dựa vào trí nhớ của tôi

Tuy nhiên, các truy vấn không được áp dụng song song. Truy vấn được xếp hàng đợi và được đánh giá theo thứ tự đến. Cơ sở dữ liệu bị khóa khi áp dụng các truy vấn sau khi chúng chạy qua trình tối ưu hóa truy vấn. Trong khóa đó, các truy vấn oplog idempotent được ghi vào oplog. Vì cơ sở dữ liệu không được kết nối với nhau và chỉ có một truy vấn có thể được áp dụng cho cơ sở dữ liệu tại bất kỳ thời điểm nào, khóa trên cơ sở dữ liệu là đủ. Không có hai truy vấn thay đổi dữ liệu có thể được áp dụng cho cùng một cơ sở dữ liệu đồng thời, vậy tại sao một khóa phải được đặt trên oplog? Rõ ràng, một khóa được thực hiện trên cơ sở dữ liệu cục bộ. Tuy nhiên, kể từ khi một khóa đã được thực hiện trên dữ liệu, tôi không thấy lý do tại sao.* scratchingMyHead *

+2

Bài đăng trên blog này cũng đáng để đọc, nó mô tả 'khóa toàn cầu' hiệu quả có thể xảy ra trong bộ bản sao chi tiết kỹ thuật hơn: http://daprlabs.com/blog/blog/2014/04/19/mongodb/ – Jaco

+0

@ Jaco thú vị đọc, mặc dù tôi không thể thứ hai kết luận của mình. Tuy nhiên, vấn đề khóa kép có thể đáng để điều tra. –

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