Mongodb đứng ở đâu trong định lý CAP?


121

Nhìn đâu cũng thấy MongoDB là CP. Nhưng khi tôi đào sâu vào, tôi thấy nó cuối cùng nhất quán. Có phải CP khi bạn sử dụng safe = true không? Nếu vậy, điều đó có nghĩa là khi tôi viết với safe = true, tất cả các bản sao sẽ được cập nhật trước khi nhận được kết quả?

Câu trả lời:


104

MongoDB rất nhất quán theo mặc định - nếu bạn ghi và sau đó đọc, giả sử ghi thành công, bạn sẽ luôn có thể đọc kết quả của quá trình ghi mà bạn vừa đọc. Điều này là do MongoDB là một hệ thống tổng thể duy nhất và tất cả các lần đọc đều chuyển sang hệ thống chính theo mặc định. Nếu bạn tùy chọn bật tính năng đọc từ các cuốn thứ hai thì MongoDB cuối cùng sẽ trở nên nhất quán khi bạn có thể đọc các kết quả đã lỗi thời.

MongoDB cũng có tính khả dụng cao thông qua chuyển đổi dự phòng tự động trong các bộ bản sao: http://www.mongodb.org/display/DOCS/Replica+Sets


13
Theo aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads, ngay cả khi bạn đọc từ nút chính trong tập hợp bản sao, bạn có thể nhận được dữ liệu cũ hoặc bẩn. Vậy MongoDB có mạnh nhất quán không ??
Mike Argyriou

3
Những thử nghiệm tuyệt vời của Kyle. Nó thực sự săn lùng cầy mangut. Tôi tự hỏi nếu có hệ thống sản xuất, ví dụ như sử dụng MongoDB thực hiện các giao dịch thanh toán? Nếu đó chỉ là một trang web cá nhân, thì ai quan tâm đến tính nhất quán mạnh mẽ.
xin,

5
Chỉ cần cho các hồ sơ, MongoDB v3.4 thông qua các bài kiểm tra được thiết kế bởi Kyle nên có, MongoDB là mạnh mẽ nhất quán, thậm chí với ReplicaSet và sharding: mongodb.com/mongodb-3.4-passes-jepsen-test
Maxime Beugnet

2
Câu trả lời này có thể hơi quá đơn giản, vì MongoDB đôi khi có thể hy sinh tính khả dụng, dựa trên cấu hình. JoCa giải thích rõ hơn về các tình huống mà nó hoạt động CA / CP / AP
PaoloC 14/02

36

Tôi đồng ý với bài đăng của Luccas. Bạn không thể chỉ nói rằng MongoDB là CP / AP / CA, bởi vì nó thực sự là sự đánh đổi giữa C, A và P, tùy thuộc vào cả cấu hình cơ sở dữ liệu / trình điều khiển và loại thảm họa : đây là bản tóm tắt trực quan và bên dưới là giải thích chi tiết hơn.

    Scenario                   | Main Focus | Description
    ---------------------------|------------|------------------------------------
    No partition               |     CA     | The system is available 
                               |            | and provides strong consistency
    ---------------------------|------------|------------------------------------
    partition,                 |     AP     | Not synchronized writes 
    majority connected         |            | from the old primary are ignored                
    ---------------------------|------------|------------------------------------
    partition,                 |     CP     | only read access is provided
    majority not connected     |            | to avoid separated and inconsistent systems

Tính nhất quán:

MongoDB rất nhất quán khi bạn sử dụng một kết nối duy nhất hoặc Mức độ quan tâm ghi / đọc chính xác ( Điều này sẽ khiến bạn tốn tốc độ thực thi ). Ngay sau khi bạn không đáp ứng các điều kiện đó (đặc biệt là khi bạn đang đọc từ một bản sao thứ cấp) thì MongoDB sẽ trở nên nhất quán.

Khả dụng:

MongoDB có tính khả dụng cao thông qua Replica-Sets . Ngay sau khi trang chính ngừng hoạt động hoặc không còn khả dụng nữa, thì các thư mục thứ hai sẽ xác định một trang chính mới có sẵn trở lại. Có một bất lợi đối với điều này: Mọi lần ghi được thực hiện bởi tệp chính cũ, nhưng không được đồng bộ hóa với các tệp thứ hai sẽ được cuộn lại và lưu vào tệp khôi phục, ngay sau khi nó kết nối lại với tập hợp (tệp chính cũ là tệp phụ hiện nay). Vì vậy, trong trường hợp này, một số tính nhất quán được hy sinh vì lợi ích sẵn có.

Dung sai phân vùng:

Thông qua việc sử dụng Replica-Sets MongoDB cũng đạt được dung sai phân vùng: Miễn là hơn một nửa số máy chủ của một Replica-Set được kết nối với nhau, một trang chính mới có thể được chọn . Tại sao? Để đảm bảo hai mạng riêng biệt không thể chọn một mạng chính mới. Khi không đủ các thư thứ hai được kết nối với nhau, bạn vẫn có thể đọc từ chúng (nhưng không đảm bảo tính nhất quán), nhưng không thể viết. Bộ thực tế không có sẵn vì mục đích nhất quán.


Vì vậy, nếu Im sử dụng mức độ quan tâm ghi / đọc chính xác, điều đó có nghĩa là tất cả các cuộn và đọc đều chuyển sang trang chính (nếu tôi hiểu chính xác), vậy chính xác thì các trang thứ hai sẽ làm gì? Chỉ cần ngồi đó ở chế độ chờ trong trường hợp chính gặp sự cố?
tomer.z

@ tomer.z bạn có thể muốn đọc phần này của sách hướng dẫn: Bạn có thể sử dụng các cuốn phụ để đọc. Nếu bạn đang sử dụng Cấp độ đọc "đa số", bài đọc sẽ có giá trị ngay khi đa số thành viên thừa nhận bài đọc. Điều tương tự cũng xảy ra đối với Cấp độ Ghi "đa số". Nếu bạn đang sử dụng Mức quan tâm "đa số" cho cả hai, thì bạn có một cơ sở dữ liệu nhất quán. Bạn có thể muốn đọc thêm về điều này trong sách hướng dẫn .
JoCa

18

Khi một bài báo mới tuyệt vời xuất hiện và một số thử nghiệm tuyệt vời của Kyle trong lĩnh vực này, bạn nên cẩn thận khi gắn nhãn MongoDB và các cơ sở dữ liệu khác, là C hoặc A.

Tất nhiên CAP giúp theo dõi mà không cần nhiều từ những gì cơ sở dữ liệu chiếm ưu thế về nó, nhưng mọi người thường quên rằng C trong CAP có nghĩa là tính nhất quán nguyên tử (linearizability), chẳng hạn. Và điều này khiến tôi rất đau lòng khi cố gắng phân loại. Vì vậy, bên cạnh việc MongoDB cung cấp tính nhất quán mạnh mẽ, điều đó không có nghĩa là C. Theo cách này, nếu một người thực hiện phân loại này, tôi cũng khuyên bạn nên cung cấp thêm chi tiết về cách nó thực sự hoạt động để không để lại nghi ngờ.


10

Vâng, đó là CP khi sử dụng safe=true. Điều này đơn giản có nghĩa là, dữ liệu được đưa vào đĩa chính. Nếu bạn muốn chắc chắn rằng nó cũng đến trên một số bản sao, hãy xem tham số 'w = N' trong đó N là số bản sao dữ liệu phải được lưu.

xem cái nàycái này để biết thêm thông tin.


3

Tôi không chắc về P cho Mongo. Hãy tưởng tượng tình huống:

  • Bản sao của bạn được chia thành hai phân vùng.
  • Viết tiếp tục cho cả hai bên khi các chủ mới được bầu
  • Phân vùng đã được giải quyết - tất cả các máy chủ hiện đã được kết nối lại
  • Điều xảy ra là cái chính mới được chọn - cái có oplog cao nhất, nhưng dữ liệu từ cái chính khác được hoàn nguyên về trạng thái chung trước khi phân vùng và nó được kết xuất vào một tệp để khôi phục thủ công
  • tất cả người thứ hai đều bắt kịp với chủ nhân mới

Vấn đề ở đây là kích thước tệp kết xuất có giới hạn và nếu bạn có một phân vùng trong một thời gian dài, bạn có thể mất dữ liệu của mình mãi mãi.

Bạn có thể nói rằng điều đó khó có thể xảy ra - vâng, trừ khi trong đám mây, nơi nó phổ biến hơn người ta nghĩ.

Ví dụ này là lý do tại sao tôi sẽ rất cẩn thận trước khi gán bất kỳ ký tự nào cho bất kỳ cơ sở dữ liệu nào. Có rất nhiều kịch bản và việc triển khai không hoàn hảo.

Nếu có ai biết nếu kịch bản này đã được giải quyết trong các bản phát hành sau của Mongo, vui lòng bình luận! (Tôi đã không theo dõi mọi thứ đã xảy ra trong một thời gian ..)


2
Giao thức bầu cử của MongoDB được thiết kế để có (nhiều nhất) một cuộc bầu cử sơ bộ. Một cuộc bỏ phiếu sơ bộ chỉ có thể được bầu chọn (và duy trì) bởi đa số nghiêm ngặt các thành viên bỏ phiếu nhóm bản sao đã định cấu hình (n / 2 +1). Trong trường hợp có phân vùng mạng, chỉ một phân vùng (với đa số thành viên biểu quyết) có thể bầu ra sơ cấp; một sơ cấp trước đó trong một phân vùng thiểu số sẽ từ chức và trở thành cấp hai. Đây là cách mà các bộ bản sao luôn hoạt động. Trong trường hợp một chính cũ đã chấp nhận các ghi không được sao chép, chúng sẽ được khôi phục (lưu vào đĩa) khi thành viên đó tham gia lại tập hợp bản sao.
Stennie

2

Mongodb không bao giờ cho phép ghi vào thứ cấp. Nó cho phép đọc tùy chọn từ thứ cấp nhưng không ghi. Vì vậy, nếu chương trình chính của bạn gặp trục trặc, bạn không thể viết cho đến khi trường trung học trở thành chính. Đó là cách bạn hy sinh Tính khả dụng cao trong định lý CAP. Bằng cách giữ cho chỉ đọc của bạn từ chính, bạn có thể có tính nhất quán mạnh mẽ.


2

MongoDB chọn Tính nhất quán trên Tính khả dụng bất cứ khi nào có Phân vùng. Điều đó có nghĩa là khi có một phân vùng (P), nó chọn Tính nhất quán (C) thay vì Tính khả dụng (A).

Để hiểu điều này, Chúng ta hãy hiểu cách MongoDB thực hiện bộ bản sao hoạt động. Một tập hợp bản sao có một nút chính. Cách "an toàn" duy nhất để cam kết dữ liệu là ghi vào nút đó và sau đó chờ dữ liệu đó cam kết đến phần lớn các nút trong tập hợp. (bạn sẽ thấy cờ đó cho w = đa số khi gửi ghi)

Phân vùng có thể xảy ra trong hai trường hợp như sau:

  • Khi nút chính gặp sự cố: hệ thống sẽ không khả dụng cho đến khi một nút chính mới được chọn.
  • Khi nút chính mất kết nối từ quá nhiều nút phụ: hệ thống không khả dụng. Những người biệt phái khác sẽ cố gắng bầu một Ban sơ cấp mới và sơ bộ hiện tại sẽ từ chức.

Về cơ bản, bất cứ khi nào một phân vùng xảy ra và MongoDB cần quyết định phải làm gì, nó sẽ chọn Tính nhất quán thay vì Tính khả dụng. Nó sẽ ngừng chấp nhận ghi vào hệ thống cho đến khi nó tin rằng nó có thể hoàn thành những ghi đó một cách an toàn.


"Nó sẽ ngừng chấp nhận các lần ghi vào hệ thống cho đến khi nó tin rằng nó có thể hoàn thành những lần ghi đó một cách an toàn. " Còn những lần đọc thì sao? Nó sẽ vẫn có sẵn để đọc trong thời gian đó?
Josh

1

Mongodb cung cấp tính nhất quándung sai phân vùng .

Trong bối cảnh cơ sở dữ liệu phân tán (NoSQL), điều này có nghĩa là luôn có sự đánh đổi giữa tính nhất quán và tính khả dụng. Điều này là do các hệ thống phân tán luôn nhất thiết phải có khả năng chịu phân vùng (tức là nó đơn giản sẽ không phải là cơ sở dữ liệu phân tán nếu nó không có khả năng chịu phân vùng.)

Tính nhất quán - Hệ thống cuối cùng sẽ trở nên nhất quán. Dữ liệu sẽ truyền đến mọi nơi sớm hay muộn, nhưng hệ thống sẽ tiếp tục nhận đầu vào và không kiểm tra tính nhất quán của mọi giao dịch trước khi chuyển sang giao dịch tiếp theo.

Tính khả dụng - Theo mặc định, Mongo DB Client (trình điều khiển MongoDB), gửi tất cả các yêu cầu đọc / ghi tới nút dẫn / chính. Nó làm cho hệ thống nhất quán nhưng không khả dụng do - Nếu một người lãnh đạo ngắt kết nối khỏi cụm, phải mất vài giây để bầu một người lãnh đạo mới. Vì vậy, làm cho nó không có sẵn để viết và đọc trong khoảng thời gian đó.

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.