Ổ đĩa lưu trữ là một tài nguyên quan trọng cho bất kỳ hệ thống cơ sở dữ liệu có thể mở rộng. Hiệu suất của cơ sở dữ liệu dựa trên đĩa của bạn sẽ phụ thuộc vào cách dữ liệu được quản lý trên đĩa. Máy chủ MongoDB của bạn hỗ trợ các công cụ lưu trữ có thể cắm được khác nhau để xử lý việc quản lý lưu trữ và lưu trữ ban đầu tất cả các tài liệu một cách tuần tự. Khi cơ sở dữ liệu phát triển và nhiều hoạt động ghi chạy, không gian liền kề này bị phân mảnh thành các khối nhỏ hơn với các phần không gian trống ở giữa. Giải pháp điển hình là tăng kích thước đĩa, tuy nhiên, có những giải pháp thay thế có thể giúp bạn lấy lại dung lượng trống mà không cần phải tăng kích thước đĩa của mình. Một điều quan trọng cần lưu ý là thống kê lưu trữ MongoDB và cách bạn có thể thu gọn hoặc sửa chữa cơ sở dữ liệu để xử lý phân mảnh.
Cơ sở dữ liệu của bạn lớn đến mức nào?
Bạn nên luôn theo dõi dung lượng ổ đĩa trống trên máy chủ sản xuất của mình và cũng cần thận trọng khi biết kích thước cơ sở dữ liệu của mình khi bạn thanh toán cho nó trên nền tảng đám mây. MongoDB có một lệnh db.stats () có thể cung cấp thông tin chi tiết về thống kê lưu trữ của một phiên bản MongoDB.
>db.stats() { "db" : "test", "collections" : 5, "views" : 0, "objects" : 53829, "avgObjSize" : 43.555, "dataSize" : 2344556121, "storageSize" :3124416336, "numExtents" : 0, "indexes" : 7, "indexSize" : 8096876, "ok" : 1 }
dataSize
Tổng kích thước tính bằng byte của dữ liệu không nén được giữ trong cơ sở dữ liệu này.
StorageSize
Tổng số dung lượng ổ đĩa được phân bổ cho tất cả các bộ sưu tập trong cơ sở dữ liệu.
Phản hồi của db.stats () phụ thuộc vào loại công cụ MongoDB. Bạn có thể tìm thấy mô tả phụ thuộc vào phiên bản của mình về các chỉ số trên tại tài liệu MongoDB.
Tại sao lại có sự khác biệt lớn giữa StorageSize và dataSize ? Điều này là do sự phân mảnh của các tệp dữ liệu đã được giải thích trước đó. MongoDB cố gắng sử dụng lại không gian trống giữa dữ liệu bị phân mảnh bất cứ khi nào có thể và không giải phóng nó vào hệ điều hành. Tuy nhiên, trong WiredTiger, dung lượng StorageSize có thể nhỏ hơn dataSize nếu tính năng nén được bật.
Trong trường hợp một phần lớn dữ liệu bị xóa khỏi bộ sưu tập và bộ sưu tập không bao giờ sử dụng không gian đã xóa cho tài liệu mới, không gian này cần được trả lại cho hệ điều hành để nó có thể được sử dụng bởi các cơ sở dữ liệu hoặc bộ sưu tập khác của bạn. Bạn sẽ cần chạy nhỏ gọn hoặc sửa chữa hoạt động để chống phân mảnh không gian đĩa và lấy lại dung lượng trống có thể sử dụng được.
Đang nén MongoDB
Thao tác nhỏ gọn MongoDB ghi lại tất cả các tài liệu và chỉ mục trong một bộ sưu tập thành các khối không gian đĩa liền kề. Tuy nhiên, thao tác này chặn tất cả các thao tác khác trên cơ sở dữ liệu mà bộ sưu tập thuộc về. Vì vậy, đối với một máy chủ độc lập, bạn nên chạy nó trong thời gian bảo trì và đối với các tập hợp bản sao, bạn nên chạy nó theo cách luân phiên cho từng phân đoạn. Điều này có nghĩa là thu gọn tất cả thư thứ hai trước tiên, và cuối cùng là thư chính để tính khả dụng của cơ sở dữ liệu của bạn không bị ảnh hưởng. Cú pháp của lệnh là:
db.runCommand({compact: collection-name })
1. MMAPv1
- Thao tác nén phân mảnh các tệp và chỉ mục dữ liệu. Tuy nhiên, hãy lưu ý rằng nó không giải phóng dung lượng cho hệ điều hành. Thao tác này vẫn hữu ích để chống phân mảnh và tạo thêm không gian liền kề để MongoDB sử dụng lại, nhưng sẽ vô ích khi dung lượng đĩa trống còn rất ít.
- Cần có thêm dung lượng đĩa lên đến 2GB trong quá trình nén.
- Một khóa cấp cơ sở dữ liệu được giữ trong quá trình nén.
2. WiredTiger
Công cụ WiredTiger cung cấp tính năng nén theo mặc định, tiêu thụ ít dung lượng đĩa hơn MMAPv1.
- Quy trình nhỏ gọn giải phóng dung lượng trống cho hệ điều hành.
- Cần có dung lượng ổ đĩa tối thiểu để chạy hoạt động nhỏ gọn.
- WiredTiger cũng chặn tất cả các hoạt động trên cơ sở dữ liệu vì nó cần khóa mức cơ sở dữ liệu.
Nếu bạn đang chạy WiredTiger, chúng tôi khuyên bạn nên chạy hoạt động compact khi bộ nhớ đã đạt đến 80% dung lượng đĩa. Bạn có thể thực hiện việc này bằng cách kích hoạt hoạt động "Thu gọn" từ trang chi tiết của chúng tôi.
Sửa chữa MongoDB
MongoDB sửa chữa hoạt động sửa chữa tất cả các lỗi và sự không nhất quán trong lưu trữ dữ liệu, tương tự như lệnh fcsk cho hệ thống tệp. Lệnh này đảm bảo tính toàn vẹn của dữ liệu sau khi tắt hoặc gặp sự cố bất ngờ. Tuy nhiên, nếu tính năng ghi nhật ký được bật trên máy chủ, thì không có yêu cầu sửa chữa vì máy chủ sử dụng nhật ký để tự động chuyển sang trạng thái sạch sau khi khởi động lại. Nếu cơ sở dữ liệu của bạn đã bị hỏng, thì một cơ sở dữ liệu sửa chữa sẽ không lưu dữ liệu bị hỏng, vì vậy bạn không nên sử dụng thao tác này để khôi phục dữ liệu khi bạn có các tùy chọn khác.
Đối với MMAPv1, cơ sở dữ liệu sửa chữa là cách duy nhất để lấy lại dung lượng ổ đĩa nếu bạn cho rằng cơ sở dữ liệu của mình không bị hỏng và có đủ dung lượng theo yêu cầu của hoạt động sửa chữa. Cú pháp của lệnh là:
db.runCommand({repairDatabase: 1})
- Lệnh này thu gọn tất cả các tập hợp trong cơ sở dữ liệu và tạo lại tất cả các chỉ mục.
- Công việc yêu cầu dung lượng đĩa trống bằng với kích thước của tập dữ liệu hiện tại của bạn cộng với 2 gigabyte.
Tại ScaleGrid, chúng tôi sử dụng cơ sở dữ liệu sửa chữa hoạt động để lấy lại dung lượng trống cho MMAPv1 cụm động cơ.