‘Ghi mối quan tâm’ trong MongoDB mô tả mức độ xác nhận ghi mà bạn có thể mong đợi từ nó. Đó là một cài đặt khá quan trọng cần nhớ trong các hoạt động ghi của bạn và hành vi của nó rất hữu ích để hiểu, đặc biệt là trong các triển khai MongoDB phân tán (tức là các nhóm bản sao và các cụm phân đoạn). Trong bài đăng này, chúng tôi thảo luận về 3 vấn đề cần lưu ý khi sử dụng MongoDB viết mối quan tâm.
MongoDB viết mối quan tâm
Tài liệu của MongoDB xác định mối quan tâm khi viết là “ mức độ xác nhận được yêu cầu từ MongoDB đối với các hoạt động ghi vào mongod độc lập hoặc tới các tập hợp bản sao hoặc các cụm phân đoạn. “
Nói một cách đơn giản, mối quan tâm về ghi là một dấu hiệu về 'độ bền' được chuyển cùng với các hoạt động ghi vào MongoDB. Để làm rõ, chúng ta hãy xem cú pháp:
{ w: <value>, j: <boolean>, wtimeout: <number> } Where*, w can be an integer | "majority" | , it represents the number of members that must acknowledge the write. Default value is 1. j Requests that a write be acknowledged after it is written to the on-disk journal as opposed to just the system memory. Unspecified by default. wtimeout specifies timeout for the applying the write concern. Unspecified by default.
* Bạn có thể tìm thấy cú pháp chi tiết trong tài liệu Viết đặc tả mối quan tâm.
* Tìm hiểu thêm về các “thẻ” khác nhau mà bạn có thể sử dụng cho các giá trị quan tâm khi viết phổ biến trong blog Hiểu về Độ bền &An toàn khi Viết trong MongoDB của chúng tôi.
Ví dụ:
db.inventory.insert( { sku: "abcdxyz", qty : 100, category: "Clothing" }, { writeConcern: { w: 2, j: true, wtimeout: 5000 } } )
Mối quan tâm về việc viết của phụ trang ở trên có thể được đọc như sau:xác nhận việc viết này khi 'ít nhất 2 thành viên của nhóm bản sao đã viết nó vào tạp chí của họ trong vòng 5000 mili giây hoặc trả về lỗi '. Giá trị mối quan tâm ghi cho tùy chọn chiếm đa số, có nghĩa là “r equests xác nhận rằng các hoạt động ghi đã được truyền đến phần lớn các nút bỏ phiếu, bao gồm cả nút chính. “
#MongoDB Viết mối quan tâm - 3 điều cần biết trướcNhấp để đăng bàiTầm quan trọng của việc quan tâm đến việc viết là rõ ràng. Việc tăng các giá trị của w sẽ làm tăng độ trễ của việc ghi đồng thời làm giảm xác suất bị mất của chúng. Việc chọn các giá trị chính xác cho mối quan tâm khi ghi tùy thuộc vào yêu cầu về độ trễ và độ bền của quá trình ghi đang được thực hiện.
Với điều đó làm nền tảng về mối quan tâm viết, hãy chuyển sang ba lưu ý cần nhớ khi sử dụng mối quan tâm viết.
CAVEAT 1:Đặt vấn đề ghi trên các tập hợp bản sao mà không có thời gian chờ có thể khiến việc ghi bị chặn vô thời hạn
Định nghĩa đa số (MongoDB 3.0 áp dụng trở đi) ở trên cho biết rằng sự xác nhận được yêu cầu từ đa số “nút biểu quyết”. Lưu ý rằng “Nếu bạn không chỉ định wtimeout
tùy chọn và mức độ quan tâm ghi là không thể đạt được, hoạt động ghi sẽ chặn vô thời hạn. “
Điều này có thể gây ra những hậu quả không mong muốn, chẳng hạn như xem xét tập hợp bản sao 2 + 1 (tức là một chính, một phụ và một trọng tài). Nếu bản sao chỉ đọc duy nhất của bạn bị hỏng, thì tất cả các lần ghi với mối quan tâm ghi với tùy chọn “đa số” sẽ chặn vô thời hạn. Điều tương tự sẽ xảy ra nếu tùy chọn w được đặt thành 2. Một ví dụ cực đoan khác là trong trường hợp tập hợp 3 + 2 bản sao (chính, 2 phụ và 2 trọng tài, không phải là cấu hình được khuyến nghị). Tất cả các lần ghi "đa số" sẽ bị chặn ngay cả khi không có một nút dữ liệu nào vì số đa số, trong trường hợp này, là 3.
Cách đơn giản nhất để giảm bớt vấn đề này là luôn chỉ định giá trị thời gian chờ để truy vấn có thể hết thời gian chờ nếu không thể thực thi vấn đề ghi. Tuy nhiên, trong trường hợp xảy ra các lỗi hết thời gian như vậy, MongoDB sẽ không hoàn tác các ghi thành công đã được thực hiện cho một số thành viên trước khi thời gian chờ xảy ra.
Hiện tại cũng không có cài đặt nào để đảm bảo việc ghi đạt đến phần lớn các nút hiện có thể truy cập được, vì vậy hãy cẩn thận về việc đặt giá trị của mối quan tâm ghi w dựa trên cấu trúc liên kết, mong muốn độ bền và tính khả dụng.
CAVEAT 2:Bạn có thể mất dữ liệu ngay cả với w:đa số
Có vẻ trực quan rằng một khi bài viết đã được đa số thành viên biểu quyết thừa nhận, độ bền của nó sẽ được đảm bảo. Tuy nhiên, đó không phải là trường hợp! Hãy nhớ rằng khi tùy chọn j không được chỉ định, một lần ghi sẽ được ghi nhận ngay sau khi nó được ghi vào bộ nhớ.
Vì vậy, quá trình ghi như vậy có thể bị mất nếu sự cố mất điện nghiêm trọng làm mất phần lớn các nút mà việc ghi đã lan truyền đến đó (và trước khi syncPeriodSecs trước khi nó có thể được xóa tới đĩa).
Để đảm bảo độ bền của quá trình viết, tốt nhất bạn không nên tắt tính năng ghi nhật ký trên cơ sở dữ liệu của mình và đặt tùy chọn j thành true. Trên thực tế, bắt đầu MongoDB 3.6, --nojournal cờ không được dùng nữa đối với các thành viên nhóm bản sao sử dụng công cụ lưu trữ WiredTiger.
Với giá trị w là “đa số” và tùy chọn j không xác định trên tập hợp bản sao, hoạt động độ bền chính xác phụ thuộc vào giá trị của cấu hình tập bản sao writeConcernMajorityJournalDefault. Khi được đặt thành true (và khi tính năng ghi nhật ký được bật), nó sẽ xác nhận các bài viết sau khi chúng đã được ghi vào các tạp chí của đa số thành viên biểu quyết.
Ngoài ra:Ngay cả khi bật tính năng ghi nhật ký, các bài viết của bạn vẫn có thể bị mất trên công cụ lưu trữ MMAPv1 nếu sự cố xảy ra trong thời lượng commitIntervalMs. Mặt khác, công cụ lưu trữ WiredTiger buộc đồng bộ hóa các tệp tạp chí khi nó nhận được một ghi có tùy chọn j được đặt thành true. Và, ngay cả với j được đặt thành false, việc ghi "đa số" được thừa nhận vào triển khai dựa trên WiredTiger mới nhất có thể bị mất chỉ khi phần lớn các nút dữ liệu bị sập đồng thời.
CAVEAT 3:w:0 trong khi cài đặt j:true không cải thiện hiệu suất ghi
Điều này đủ dễ để suy luận một khi bạn nghĩ về nó, nhưng cũng dễ quên. Đặt tùy chọn w thành 0 thường được thực hiện để ghi vào cơ sở dữ liệu theo kiểu “cháy và quên” - khi bạn có đủ độ tin cậy về cơ sở hạ tầng cơ sở dữ liệu và quan tâm nhiều hơn đến độ trễ hơn là độ bền của mỗi lần ghi. Tuy nhiên, nếu bạn đặt tùy chọn j thành true, tùy chọn w của bạn sẽ bị ghi đè một cách hiệu quả vì cơ sở dữ liệu sẽ đảm bảo rằng bản ghi được ghi vào tạp chí trên đĩa trước khi quay trở lại.
Nếu bạn đang quan tâm đến khả năng viết để đảm bảo thành công cho các thao tác viết của mình, hãy đảm bảo rằng bạn ghi nhớ ba lưu ý quan trọng này! Chúng tôi sẵn sàng trợ giúp, vì vậy, vui lòng kết nối với bất kỳ câu hỏi nào qua Twitter hoặc qua email.