MongoDB có nhất quán mạnh mẽ không?

Trong bài viết này, tôi sẽ nói về định lý CAP và vị trí của các cơ sở dữ liệu được sử dụng nhiều nhất này trong định lý CAP và một chút về các hệ thống này

định lý CAP

CAP là viết tắt của Tính nhất quán, Tính khả dụng và Dung sai Phân vùng

Tính nhất quán có nghĩa là, nếu bạn ghi dữ liệu vào hệ thống phân tán, bạn sẽ có thể đọc cùng một dữ liệu tại bất kỳ thời điểm nào từ bất kỳ nút nào của hệ thống hoặc chỉ cần trả về lỗi nếu dữ liệu ở trạng thái không nhất quán. Không bao giờ trả lại dữ liệu không nhất quán

Ghi chú. Tính nhất quán trong định lý CAP không giống như tính nhất quán trong RDBMS ACID.
Tính nhất quán của CAP nói về tính nhất quán của dữ liệu trên một cụm nút chứ không phải trên một máy chủ/nút duy nhất.

Tính khả dụng có nghĩa là hệ thống phải luôn thực hiện đọc/ghi thành công trên bất kỳ nút nào không bị lỗi của cụm mà không có bất kỳ lỗi nào. Đây là tính khả dụng chủ yếu liên quan đến phân vùng mạng. tôi. e. trong sự hiện diện của phân vùng mạng cho dù một nút trả về phản hồi thành công hay lỗi cho thao tác đọc/ghi

Ghi chú. Tính khả dụng trong định lý CAP không giống như thời gian chết mà chúng ta nói đến trong hệ thống hàng ngày của chúng ta. Ví dụ 99. 9% tính khả dụng của microservice không giống như định lý CAP Tính khả dụng. CAP-Availibilty nói về việc nếu cụm có phân vùng mạng thì hệ thống sẽ hoạt động như thế nào, liệu nó có bắt đầu báo lỗi hay tiếp tục phục vụ thành công các yêu cầu

Dung sai phân vùng có nghĩa là, nếu có một phân vùng giữa các nút hoặc các phần của cụm trong một hệ thống phân tán không thể nói chuyện với nhau, thì hệ thống vẫn hoạt động

Định lý CAP là gì?

Một hệ thống phân tán luôn cần có khả năng chịu phân vùng, chúng ta không nên tạo một hệ thống mà một phân vùng mạng sẽ làm hỏng toàn bộ hệ thống.
Vì vậy, hệ thống phân tán luôn được xây dựng Partition Tolerant.

Vì vậy, nói một cách đơn giản, định lý CAP có nghĩa là nếu có phân vùng mạng và nếu bạn muốn hệ thống của mình tiếp tục hoạt động, bạn có thể cung cấp Tính khả dụng hoặc Tính nhất quán chứ không phải cả hai

Hệ thống phân tán phá vỡ tính nhất quán hoặc tính khả dụng như thế nào?

Kịch bản 1. Không gửi được yêu cầu cập nhật đến các nút khác.
Giả sử, chúng ta có hai nút (N1 & N2) trong một cụm và cả hai nút đều có thể chấp nhận yêu cầu đọc và ghi.

Trong sơ đồ trên, nút N1 nhận được yêu cầu cập nhật id 2 và cập nhật mức lương từ 800 lên 1000. Nhưng do có phân vùng mạng nên N1 không thể gửi bản cập nhật mới nhất cho N2

Vì vậy, khi yêu cầu đọc đến N2, nó có thể thực hiện một trong hai việc

  1. Phản hồi với bất kỳ dữ liệu nào nó có, trong trường hợp này, lương = 800 và cập nhật dữ liệu khi phân vùng mạng giải quyết — làm cho hệ thống Khả dụng nhưng Không nhất quán
  2. Chỉ cần trả về một lỗi, nói rằng “Tôi không có dữ liệu cập nhật” — làm cho hệ thống Nhất quán nhưng Không khả dụng bằng cách không trả về dữ liệu không nhất quán

kịch bản 2. Hệ thống dựa trên Nhà lãnh đạo duy nhất trong đó việc đọc và ghi đến với nhà lãnh đạo và tất cả các nút khác được cập nhật từ nhà lãnh đạo và duy trì chế độ chờ trong trường hợp nhà lãnh đạo gặp sự cố

Vấn đề với hệ thống này là, nếu người lãnh đạo ngắt kết nối khỏi cụm hoặc máy khách không thể kết nối với người lãnh đạo do phân vùng mạng giữa máy khách và người lãnh đạo, hệ thống không thể chấp nhận yêu cầu ghi cho đến khi người lãnh đạo mới được chọn. Làm cho các loại hệ thống này nhất quán và không khả dụng

Một hệ thống dựa trên nhà lãnh đạo duy nhất chấp nhận đọc và ghi, không bao giờ được phân loại theo Tính khả dụng

Tuyên bố từ chối trách nhiệm. Định lý CAP quá đơn giản để mô tả các hệ thống phân tán ngày nay. Các hệ thống phân tán ngày nay cung cấp một chút của mỗi C, A và P dựa trên cấu hình của hệ thống. Do đó, sẽ không chính xác nếu phân loại các hệ thống này thành CP hoặc AP.
Như đã nói, hành vi mặc định của họ có thể là CP hoặc AP. Mà chúng ta sẽ thảo luận ngay sau đây.

MongoDB so với Cassandra so với RDBMS trong Định lý CAP

Nhiều người trong chúng ta đã nhìn thấy sơ đồ dưới đây. Cơ sở dữ liệu trong định lý CAP. Việc phân loại cơ sở dữ liệu này không hoàn toàn chính xác

RDBMS (MySQL, Oracle, MS SQL Server, v.v.)

Không có gì phải bàn cãi khi tất cả các RDBMS đều nhất quán vì tất cả các lần đọc và ghi đều chuyển đến một nút/máy chủ duy nhất

Làm thế nào về sự sẵn có? . Vì vậy, làm thế nào nó được phân loại theo Tính khả dụng?

Như tôi đã nói trước đó Tính khả dụng của CAP không giống như tính khả dụng/thời gian ngừng hoạt động hàng ngày mà chúng ta nói đến. Trong một hệ thống nút duy nhất, sẽ không có bất kỳ phân vùng mạng nào do đó nếu nút hoạt động, nó sẽ luôn trả về thành công cho bất kỳ thao tác đọc/ghi nào và do đó khả dụng

Điều gì xảy ra khi bạn sao chép các Cơ sở dữ liệu quan hệ này?

Chúng tôi có thể tạo các hệ thống như vậy bằng cách sử dụng bất kỳ hệ thống quản lý cụm nào như Zookeeper hoặc etcd

Vậy điều này có nghĩa là các cơ sở dữ liệu quan hệ sao chép này có sẵn không?
Không hoàn toàn, hãy xem cách.

  1. Nếu một nhà lãnh đạo ngắt kết nối khỏi cụm, sẽ mất vài giây để chọn một nhà lãnh đạo mới. Vì vậy, chắc chắn không phải là một hệ thống có sẵn
  2. Máy khách luôn có thể ngắt kết nối với nút dẫn do phân vùng mạng ngay cả khi cả nút máy khách và nút dẫn đều đang chạy tốt. Do đó làm cho nó không có sẵn

Ghi chú. Điểm thứ hai được đề cập ở trên có thể được giải quyết nếu các ứng dụng khách cũng theo dõi nhịp tim của người lãnh đạo và bắt đầu bầu chọn người lãnh đạo trong trường hợp không thể kết nối với người lãnh đạo. Vẫn chắc chắn không dễ đạt được trong RDBMS. ) Sẽ rất phức tạp khi đưa logic như vậy vào các ứng dụng khách

Điều gì về tính nhất quán khi dữ liệu được sao chép?

  1. Nếu dữ liệu chỉ được đọc và ghi từ nút chính/nút chính thì dữ liệu đó luôn nhất quán
  2. Nếu các yêu cầu đọc được gửi đến bất kỳ thứ cấp nào, chúng tôi sẽ mất tính nhất quán và có thể cung cấp dữ liệu không nhất quán trong trường hợp phân vùng mạng hoặc giả sử chủ mất thời gian để sao chép dữ liệu

Tóm lại, cơ sở dữ liệu quan hệ có thể có thời gian ngừng hoạt động hoặc không khả dụng nhưng nó luôn ở trạng thái CAP-Available.
Nếu máy chủ RDBMS được sao chép, thì nó nhất quán — chỉ khi việc đọc và ghi chỉ được thực hiện thông qua nút dẫn hoặc nút chính.
Chúng tôi thường phân loại RDBMS theo CA. Bởi vì cơ sở dữ liệu quan hệ là một hệ thống nút duy nhất và do đó chúng ta không cần phải lo lắng về dung sai phân vùng và do đó nếu máy chủ RDBMS hoạt động, nó sẽ luôn phản hồi thành công cho bất kỳ thao tác đọc/ghi nào.

MongoDB

Những điều bạn nên biết về MongoDB

  1. MongoDB là một hệ thống dựa trên nhà lãnh đạo duy nhất có thể có nhiều bản sao. Các bản sao này tự cập nhật không đồng bộ từ OpLog của Leader
  2. Mỗi nút duy trì nhịp tim của mọi nút khác để theo dõi xem các bản sao hoặc thủ lĩnh khác còn sống hay đã chết
  3. Nếu người lãnh đạo/nút chính bị hỏng, các bản sao có thể xác định và bầu chọn một người lãnh đạo mới dựa trên mức độ ưu tiên, nếu họ có thể tạo thành đa số. Thêm về điều này ở đây

Tính nhất quán và tính khả dụng trong MongoDB

cảnh 1. Hành vi mặc định - Cả đọc và viết từ chính/lãnh đạo

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 chính/lãnh đạo

Một lần nữa, hành vi mặc định này cho phép Mongo DB trở thành một hệ thống nhất quán nhưng không khả dụng vì những lý do dưới đây

  1. Nếu một nhà lãnh đạo ngắt kết nối khỏi cụm, sẽ mất vài giây để chọn một nhà lãnh đạo mới. Vì vậy, làm cho nó không có sẵn để viết và đọc
  2. Máy khách luôn có thể ngắt kết nối với nút dẫn do phân vùng mạng ngay cả khi cả nút máy khách và nút dẫn đều đang chạy tốt. Do đó làm cho nó không có sẵn

Vì vậy, nếu chúng ta sử dụng ứng dụng khách MongoDB với hành vi mặc định của nó, thì MongoDB sẽ hoạt động như một hệ thống Nhất quán và không Khả dụng

kịch bản 2. Cho phép đọc từ phụ

Như chúng ta đã thấy trong kịch bản trước khi một nhà lãnh đạo mới được bầu hoặc nếu khách hàng ngắt kết nối với nhà lãnh đạo. Hệ thống của chúng tôi không có sẵn cho cả đọc và viết

Làm cách nào để chúng tôi thay đổi điều đó và làm cho hệ thống có sẵn để đọc?

Chúng ta có thể chỉ cần định cấu hình chế độ tùy chọn đọc trong ứng dụng khách MongoDB để đọc từ bất kỳ nút phụ nào.
Tuy nhiên, làm như vậy chúng ta đang phá vỡ tính nhất quán. Bây giờ, một thao tác ghi cho chính/lãnh đạo có thể thành công nhưng, phụ có thể không cập nhật dữ liệu mới nhất từ ​​chính vì bất kỳ lý do gì.
Vì vậy, với cách thiết lập này, bạn có được khả năng đọc cao nhưng lại mất tính nhất quán và cuối cùng bạn sẽ có được tính nhất quán.

Làm cách nào chúng tôi có thể giải quyết vấn đề trên trong MongoDB và làm cho hệ thống trở nên “nhất quán cao” ngay cả khi các lần đọc đang chuyển sang nhiều nút phụ?

MongoDB giải quyết vấn đề này bằng cách sử dụng "viết quan tâm"

Trong khi ghi dữ liệu vào MongoDB, bạn có thể chuyển một tùy chọn ghi. Đề cập đến số lượng nút mà dữ liệu sẽ được ghi để ghi thành công hoặc bạn có thể chuyển "đa số", cho biết ghi sẽ thành công nếu chính nhận được xác nhận từ phần lớn các nút.
Bằng cách này, bạn thậm chí có thể có cùng một dữ liệu trong tất cả các nút nếu bạn ghi vào tất cả các nút.

Ghi chú. MongoDB có thời gian chờ nhịp tim được định cấu hình mặc định là 10 giây, vì vậy nếu một nhà lãnh đạo chết, các nút khác sẽ tìm ra ở giây thứ 10 và bắt đầu bầu chọn nhà lãnh đạo.
Theo tài liệu, thời gian trung bình trước khi một cụm bầu chọn chính mới thường không được vượt quá 12 giây theo cài đặt mặc định. Thông tin thêm về bầu cử lãnh đạo tại đây.

Tóm lại, MongoDB có thể luôn Nhất quán dựa trên cách bạn định cấu hình máy khách của mình và cách bạn ghi dữ liệu (sử dụng tùy chọn ghi) và có thể luôn sẵn sàng để đọc nhưng bạn không bao giờ có thể luôn sẵn sàng ghi, sẽ luôn luôn có sẵn .
a) người lãnh đạo mới được bầu chọn
b) trình điều khiển máy khách ngắt kết nối với người lãnh đạo

Cassandra

Trong Cassandra, bất kỳ nút điều phối viên nào cũng có thể chấp nhận yêu cầu đọc hoặc ghi và chuyển tiếp yêu cầu tới các bản sao tương ứng dựa trên khóa phân vùng. Do đó, ngay cả khi một bản sao/nút bị hỏng, những nút khác có thể phục vụ các yêu cầu đọc/ghi. Vì vậy, có an toàn không khi nói rằng Cassandra luôn khả dụng?
Hmmm không hoàn toàn, chúng ta sẽ sớm tìm hiểu lý do tại sao.

Trong Cassandra, chúng ta có thể xác định hệ số sao chép. Nếu được đặt thành 3, Cassandra sẽ sao chép dữ liệu thành ba nút

cảnh 1. Trường hợp mặc định — Không có mức nhất quán nào được xác định

Trong trường hợp này, khi một lệnh ghi được gửi tới bất kỳ nút nào, nút đó sẽ trả về thành công khi dữ liệu được ghi vào nút đó.
Hai nút bản sao khác (nếu hệ số sao chép được đặt thành 3) cuối cùng sẽ nhận được dữ liệu và do đó, đôi khi Cassandra DB được gọi là DB nhất quán cuối cùng.

Nếu vì lý do nào đó, bản sao thứ ba không nhận được bản sao dữ liệu được cập nhật, thì đó có thể là do độ trễ hoặc phân vùng mạng hoặc bạn vừa làm mất gói.
Sau đó, nếu bạn tình cờ đọc dữ liệu từ nút chưa được cập nhật, bạn sẽ nhận được dữ liệu không nhất quán.

Do đó, trong cài đặt mặc định của nó, Cassandra được phân loại là AP (Có sẵn và Dung sai phân vùng)

kịch bản 2. Đọc/Ghi yêu cầu với các mức nhất quán

Trong Cassandra, chúng ta có thể xác định mức độ nhất quán đọc/ghi trong ứng dụng khách Cassandra trong khi tạo Phiên Cassandra

Mức nhất quán tác động đến việc ghi như thế nào?
Nó đảm bảo việc ghi chỉ thành công nếu nó được ghi vào số nút đã cho trong Mức nhất quán. Các giá trị này có thể là BẤT KỲ hoặc MỘT hoặc SỐ LƯỢNG hoặc TẤT CẢ hoặc một Số.

Mức nhất quán ảnh hưởng đến việc đọc như thế nào?
Nếu mức nhất quán là BA, Cassandra sẽ đọc từ ba bản sao và trả về dữ liệu mới nhất trong số 3 nút và cập nhật các nút lỗi thời khác .

Vì vậy, chỉ bằng cách đặt mức nhất quán thành QUORUM(đa số) nhất quán. Vì các cài đặt mức nhất quán này được áp dụng cho cả đọc và ghi. Chúng tôi có thể đạt được tính nhất quán 100%

Vậy, điều gì sẽ xảy ra với Tính khả dụng?
Mức độ nhất quán càng lớn, tính khả dụng của hệ thống sẽ càng giảm.
Ví dụ. Giả sử chúng tôi đã đặt mức Độ nhất quán thành BA, cho một Cassandra DB có hệ số sao chép là 3.
Nếu một trong các bản sao ngắt kết nối khỏi cụm, cả đọc và ghi sẽ bắt đầu bị lỗi, khiến hệ thống không khả dụng cho cả đọc và ghi.

Tóm lại, Cassandra luôn khả dụng nhưng một khi chúng tôi bắt đầu điều chỉnh nó để nhất quán hơn, chúng tôi sẽ mất tính khả dụng

Bảng tóm tắt

Bảng dưới đây tóm tắt vị trí của mỗi DB với một bộ cấu hình khác nhau dựa trên định lý CAP

Tại sao MongoDB không nhất quán?

Theo mặc định, Máy khách Mongo DB (trình điều khiển MongoDB), gửi tất cả các yêu cầu đọc/ghi tới nút chính/nút chính. Một lần nữa, hành vi mặc định này cho phép Mongo DB trở thành một hệ thống nhất quán nhưng không khả dụng vì những lý do dưới đây. Nếu một người lãnh đạo ngắt kết nối khỏi cụm, sẽ mất vài giây để chọn một người lãnh đạo mới .

MongoDB có nhất quán có thể điều chỉnh được không?

Để cung cấp cho người dùng một tập hợp các tùy chọn nhất quán có thể điều chỉnh, MongoDB hiển thị các cấp độ writeConcern và readConcern , là các tham số có thể được đặt trên từng cấp độ . writeConcern chỉ định mức độ đảm bảo độ bền mà một lần ghi phải đáp ứng trước khi được xác nhận cho khách hàng.

Điểm mạnh của MongoDB là gì?

Ưu điểm của MongoDB .
Nền tảng dữ liệu dành cho nhà phát triển dựa trên đám mây đầy đủ
Lược đồ tài liệu linh hoạt
Truy cập dữ liệu gốc và được hỗ trợ rộng rãi
Thiết kế thân thiện với thay đổi
Truy vấn và phân tích mạnh mẽ
Dễ dàng mở rộng theo chiều ngang với sharding
Cài đặt đơn giản
hiệu quả về chi phí

MongoDB có dễ mở rộng không?

Là một dịch vụ cung cấp, MongoDB Atlas giúp mở rộng quy mô dễ dàng như đặt đúng cấu hình . Cả tỷ lệ ngang và dọc đều được hỗ trợ. Chia tỷ lệ theo chiều dọc cũng đơn giản như định cấu hình tầng cụm. Lưu ý rằng ngay cả trong một bậc, vẫn có thể mở rộng quy mô hơn nữa (bao gồm tự động chia tỷ lệ từ bậc M10 trở lên).