MongoDB cũng giống như bất kỳ cơ sở dữ liệu nào khác có thể bị lỗi khi thực hiện thao tác ghi. Trong trường hợp đó, chúng tôi cần một chiến lược sẽ giữ hoạt động ở đâu đó để cơ sở dữ liệu có thể tiếp tục khi nó được khôi phục trở lại hoạt động.
Trong MongoDB, chúng tôi sử dụng tính năng ghi nhật ký theo đó ghi nhật ký trước vào các tệp nhật ký trên đĩa để giữ cho dữ liệu có sẵn trong trường hợp bị lỗi. Công cụ lưu trữ WiredTiger có thể sử dụng các điểm kiểm tra để cung cấp chế độ xem dữ liệu nhất quán trên đĩa và cho phép MongoDB khôi phục từ điểm kiểm tra cuối cùng nhưng chỉ khi nó không thoát đột ngột. Nếu không, đối với thông tin xảy ra trong lần kiểm tra cuối cùng, tính năng ghi nhật ký phải được kích hoạt để khôi phục dữ liệu đó.
Quy trình phục hồi là:cơ sở dữ liệu sẽ xem xét các tệp dữ liệu để tìm mã định danh của điểm kiểm tra cuối cùng, sử dụng mã định danh này để tìm kiếm bản ghi khớp với nó trong tệp nhật ký và sau đó áp dụng các thao tác trong tệp nhật ký kể từ điểm kiểm tra cuối cùng.
Cách ghi nhật ký hoạt động trong Công cụ lưu trữ WiredTiger
Đối với mỗi khách hàng bắt đầu thao tác ghi, WiredTiger tạo một bản ghi nhật ký bao gồm các thao tác ghi nội bộ được kích hoạt bởi thao tác ghi ban đầu. Hãy xem xét một tài liệu trong bộ sưu tập sẽ được cập nhật và chúng tôi hy vọng chỉ mục của nó cũng được sửa đổi. WiredTiger sẽ tạo một bản ghi nhật ký duy nhất sẽ kết hợp hoạt động cập nhật và các sửa đổi chỉ mục tương ứng.
Bản ghi này sẽ được lưu trữ trong bộ đệm trong bộ nhớ có dung lượng tối đa là 128kB. Sau đó, công cụ lưu trữ sẽ đồng bộ hóa các bản ghi nhật ký được lưu trong bộ đệm này vào đĩa khi một trong hai điều sau được đáp ứng:
- Thao tác ghi bao gồm / ngụ ý mối quan tâm ghi của j:true.
- WiredTiger tạo một tệp nhật ký mới sau mỗi 100 MB dữ liệu.
- Cứ sau 100 mili giây tùy thuộc vào storage.journal.commitIntervalMs.
- Trong trường hợp các thành viên tập hợp bản sao:
- Trường hợp của các hoạt động chờ mục nhật ký, tức là đọc các hoạt động được thực hiện như một phần của các phiên nhất quán nhân quả và chuyển tiếp các truy vấn quét đối với oplog.
- Sau mỗi lần áp dụng hàng loạt các mục oplog trong trường hợp có các thành viên phụ.
Trong trường hợp mongod tắt nặng, nếu các thao tác ghi đang diễn ra, các bản cập nhật có thể bị mất ngay cả khi các bản ghi nhật ký vẫn còn trong bộ đệm WiredTiger.
Nén Dữ liệu Tạp chí
Cài đặt mặc định trong MongoDB hướng dẫn WiredTiger sử dụng tính năng nén nhanh cho dữ liệu tạp chí. Điều này có thể được thay đổi tùy thuộc vào thuật toán nén nào bạn có thể muốn sử dụng cài đặt Storage.wiredTiger.engineConfig.journalCompressor. Các bản ghi nhật ký này chỉ được nén nếu kích thước của chúng lớn hơn 128 byte, đây là kích thước bản ghi nhật ký tối thiểu của WiredTiger.
Giới hạn Kích thước Tệp Tạp chí
Kích thước tối đa của tệp tạp chí là 100 MB và do đó nếu tệp vượt quá giới hạn này, một tệp mới sẽ được tạo.
Sau khi tệp nhật ký đã được sử dụng để khôi phục hoặc đúng hơn là có những tệp cũ hơn tệp có thể được sử dụng để khôi phục từ điểm kiểm tra cuối cùng, WiredTiger sẽ tự động xóa chúng.
Phân bổ trước
Các tệp tạp chí có thể được phân bổ trước bằng công cụ lưu trữ WiredTiger nếu quy trình mongod xác định rằng phân bổ trước các tệp tạp chí hiệu quả hơn là tạo các tệp mới.
Cách ghi nhật ký hoạt động trong Công cụ lưu trữ trong bộ nhớ
Công cụ lưu trữ trong bộ nhớ được nêu là một phần của Tính khả dụng chung (GA) bắt đầu với phiên bản MongoDB Enterprise 3.2.6. Với công cụ lưu trữ này, dữ liệu được lưu trong bộ nhớ do đó không có kỹ thuật ghi nhật ký riêng biệt. Nếu có bất kỳ thao tác ghi nào với mối quan tâm về ghi (j:true), chúng sẽ được ghi nhận ngay lập tức.
Đối với tập hợp bản sao có thành viên biểu quyết sử dụng công cụ lưu trữ trong bộ nhớ, người ta phải đặt writeConcernMajorityJournalDefault thành false. Ngược lại, nếu điều này được đặt thành true, tập hợp bản sao sẽ ghi lại cảnh báo khởi động.
Khi tùy chọn này được đặt thành false, cơ sở dữ liệu sẽ không đợi ghi w:“đa số” được ghi vào tạp chí trên đĩa trước khi xác nhận việc ghi. Nhược điểm của phương pháp này là với phần lớn các hoạt động ghi có thể quay trở lại trong trường hợp mất mát tạm thời (chẳng hạn như khởi động lại hoặc sự cố) của phần lớn các nút trong một tập hợp bản sao nhất định.
Nếu sử dụng công cụ lưu trữ MMapv1, tính năng phân bổ trước tạp chí có thể bị vô hiệu hóa bằng cách sử dụng tùy chọn --nopreallocation khi khởi động mongod.
Với công cụ lưu trữ WiredTiger, từ phiên bản MongoDB 4.0 trở lên, không thể chỉ định tùy chọn --nojournal hoặc thậm chí là storage.journal.enabled:false cho các thành viên tập hợp bản sao sử dụng công cụ lưu trữ WiredTiger.
Quản lý Nhật ký
Tắt tính năng ghi nhật ký
Chỉ có thể tắt tính năng ghi nhật ký cho các triển khai độc lập và nó không được khuyến nghị cho các hệ thống sản xuất. Đối với MongoDB phiên bản 4.0 trở lên, người ta không thể chỉ định tùy chọn --nojournal hay storage.journal.enabled:false khi có liên quan đến các thành viên nhóm bản sao sử dụng công cụ lưu trữ WiredTiger.
Để tắt mongod bắt đầu ghi nhật ký bằng tùy chọn dòng lệnh --nojournal.
Theo dõi Trạng thái Nhật ký
Để lấy số liệu thống kê trên tạp chí, hãy sử dụng lệnh db.serverStatus () trả về wiredTiger.log.
Nhận xác nhận cam kết
Chúng tôi sử dụng tùy chọn ghi mối quan tâm với j để nhận xác nhận cam kết. {j:true}. Ghi nhật ký phải được bật trong trường hợp này nếu không phiên bản mongod có thể tạo ra lỗi.
Nếu tính năng ghi nhật ký được bật, w:“đa số” điều này có thể ngụ ý j:true.
Đối với tập hợp bản sao, khi j:true, thiết lập chỉ yêu cầu tập hợp chính để ghi vào tạp chí, bất kể mối quan tâm ghi w:
Tuy nhiên, ngay cả khi j:true được định cấu hình cho tập hợp bản sao, quá trình quay lại có thể xảy ra do chuyển đổi dự phòng chính tập hợp bản sao.
Khôi phục dữ liệu bị tắt đột ngột
Tất cả các tệp tạp chí trong thư mục tạp chí sẽ được phát lại bất cứ khi nào MongoDB khởi động lại sau sự cố trước khi máy chủ được phát hiện. Vì thao tác này sẽ được ghi lại trong đầu ra nhật ký, nên sẽ không cần chạy - sửa chữa.
Thay đổi Trình nén tạp chí WiredTiger
Máy nén Snappy là thuật toán nén mặc định cho tạp chí. Tuy nhiên, người ta có thể thay đổi điều này tùy thuộc vào thiết lập phiên bản mongod.
Đối với phiên bản mongod độc lập:
- Đặt storage.wiredTiger.engineConfig.journalCompressor thành một giá trị mới để cập nhật nó. Cách thích hợp nhất để thực hiện việc này là thông qua tệp cấu hình nhưng nếu sử dụng các tùy chọn dòng lệnh, bạn phải cập nhật tùy chọn dòng lệnh --wiredTigerJournalCompressor trong khi khởi động lại.
- Tắt cá thể mongod bằng cách kết nối với trình bao mongo của cá thể đó và ra lệnh:db.shutdownServer () hoặc db.getSiblingDB ('admin ) .shutdownServer ()
- Khởi động lại phiên bản mongod:
- Nếu sử dụng tệp cấu hình, hãy sử dụng:mongod -f <đường dẫn đến tệp.conf>
- Nếu sử dụng các tùy chọn dòng lệnh, hãy cập nhật wiredTigerJournalCompressor:
Mongod --wiredTigerJournalCompressor <differentCompressor|none>
Dành cho Thành viên Nhóm Bản sao:
- Tắt phiên bản mongod:db.shutdownServer () hoặc db.getSiblingDB (‘admin) .shutdownServer ()
- Thực hiện các thay đổi sau đối với tệp cấu hình:
- Đặt Storage.journal.enabled thành false.
- Nhận xét cài đặt sao chép
- Đặt tham số disableLogicalSessionCacheRefresh thành true.
i.e
storage:
journal:
enabled: false
#replication:
# replSetName: replA
setParameter:
disableLogicalSessionCacheRefresh: true
-
Khởi động lại phiên bản mongod:
-
Nếu sử dụng tệp cấu hình, hãy sử dụng:mongod -f <đường dẫn đến tệp.conf>
-
Nếu sử dụng các tùy chọn dòng lệnh:bao gồm tùy chọn --nojournal, hãy xóa mọi tùy chọn dòng lệnh sao chép tức là --replSet và đặt tham số disableLogicalSessionCacheRefresh thành true
mongod --nojournal --setParameter disableLogicalSessionCacheRefresh=true
-
-
Tắt phiên bản mongod:
db.shutdownServer() or db.getSiblingDB(‘admin).shutdownServer()
-
Cập nhật tệp cấu hình để chuẩn bị khởi động lại thành viên nhóm bản sao với máy nén tạp chí mới:Xóa bộ nhớ. Journal.enabled, bỏ ghi chú cài đặt nhân bản cho việc triển khai, loại bỏ tùy chọn disableLogicalSessionCacheRefresh và cuối cùng là loại bỏ Storage.wiredTiger.engineConfig.journalCompressor.
storage:
wiredTiger:
engineConfig:
journalCompressor: <newValue>
replication:
replSetName: replA
-
Khởi động lại phiên bản mongod với tư cách là thành viên nhóm bản sao
- Nếu sử dụng tệp cấu hình, hãy sử dụng:mongod -f <đường dẫn đến tệp.conf>
- Nếu sử dụng các tùy chọn dòng lệnh:loại bỏ các tùy chọn --nojournal và --wiredTigerJournalCompressor. Bao gồm các tùy chọn dòng lệnh sao chép và xóa tham số disableLogicalSessionCacheRefresh.
mongod --wiredTigerJournalCompressor <differentCompressor|none> --replSet ...
Kết luận
Để MongoDB đảm bảo độ bền hoạt động ghi, tính năng ghi nhật ký được sử dụng theo đó dữ liệu được ghi vào đĩa từ trước khai thác gỗ. Nhiều như công cụ lưu trữ WiredTiger (được ưu tiên nhất) có thể khôi phục dữ liệu thông qua các trạm kiểm soát cuối cùng, nếu MongoDB thoát đột ngột và tính năng ghi nhật ký không được bật, thì việc khôi phục dữ liệu đó trở nên bất khả thi. Ngược lại, nếu tính năng ghi nhật ký được bật, MongoDB có thể áp dụng lại các thao tác ghi khi khởi động lại và duy trì trạng thái nhất quán.