Đã có một số nhầm lẫn đáng kể về việc cải tạo không gian trong MongoDB, và một số thực tiễn được khuyến nghị là hết sức nguy hiểm để thực hiện trong các loại triển khai nhất định. Thêm chi tiết dưới đây:
TL; DR repairDatabase
cố gắng cứu vãn dữ liệu từ các triển khai MongoDB độc lập đang cố gắng khôi phục từ hỏng đĩa. Nếu nó phục hồi không gian, nó hoàn toàn là một tác dụng phụ . Phục hồi không gian không bao giờ nên được xem xét chính của việc chạyrepairDatabase
.
Khôi phục không gian trong một nút độc lập
WiredTiger: Đối với một nút độc lập với WiredTiger, việc chạy compact
sẽ giải phóng không gian cho HĐH, với một cảnh báo: compact
Lệnh trên WiredTiger trên MongoDB 3.0.x đã bị ảnh hưởng bởi lỗi này: SERVER-21833 đã được sửa trong MongoDB 3.2.3. Trước phiên bản này, compact
trên WiredTiger có thể âm thầm thất bại.
MMAPv1: Do cách thức hoạt động của MMAPv1, không có phương pháp an toàn và được hỗ trợ để khôi phục dung lượng bằng cách sử dụng công cụ lưu trữ MMAPv1. compact
trong MMAPv1 sẽ chống phân mảnh các tệp dữ liệu, có khả năng cung cấp thêm dung lượng trống cho các tài liệu mới, nhưng nó sẽ không giải phóng không gian trở lại HĐH.
Bạn có thể chạy repairDatabase
nếu bạn hiểu đầy đủ hậu quả của lệnh nguy hiểm tiềm tàng này (xem bên dưới), vìrepairDatabase
về cơ bản viết lại toàn bộ cơ sở dữ liệu bằng cách loại bỏ các tài liệu bị hỏng. Là một tác dụng phụ, điều này sẽ tạo ra các tệp dữ liệu MMAPv1 mới mà không có bất kỳ sự phân mảnh nào trên đó và giải phóng không gian trở lại HĐH.
Đối với một phương pháp ít phiêu lưu hơn, việc chạy mongodump
và mongorestore
có thể cũng có thể trong triển khai MMAPv1, tùy thuộc vào quy mô triển khai của bạn.
Khôi phục không gian trong một bộ bản sao
Đối với cấu hình bộ bản sao, phương pháp tốt nhất và an toàn nhất để khôi phục dung lượng là thực hiện đồng bộ hóa ban đầu , cho cả WiredTiger và MMAPv1.
Nếu bạn cần khôi phục không gian từ tất cả các nút trong tập hợp, bạn có thể thực hiện đồng bộ hóa ban đầu. Đó là, thực hiện đồng bộ hóa ban đầu trên mỗi thứ hai, trước khi cuối cùng bước xuống chính và thực hiện đồng bộ hóa ban đầu trên nó. Phương pháp đồng bộ hóa ban đầu là phương pháp an toàn nhất để thực hiện bảo trì bộ bản sao và nó cũng không bao gồm thời gian chết như một phần thưởng.
Xin lưu ý rằng tính khả thi của việc thực hiện đồng bộ hóa ban đầu cũng phụ thuộc vào quy mô triển khai của bạn. Đối với các triển khai cực kỳ lớn, có thể không khả thi khi thực hiện đồng bộ hóa ban đầu và do đó các tùy chọn của bạn có phần hạn chế hơn. Nếu WiredTiger được sử dụng, bạn có thể lấy một thứ cấp ra khỏi tập hợp, khởi động nó dưới dạng độc lập, chạy compact
trên nó và nối lại nó với tập hợp.
Về repairDatabase
Vui lòng không chạy repairDatabase
trên các nút thiết lập bản sao . Điều này rất nguy hiểm, như được đề cập trong trang RepairDatabase và được mô tả chi tiết hơn dưới đây.
Tên repairDatabase
này là một chút sai lệch, vì lệnh không cố gắng sửa chữa bất cứ điều gì. Lệnh được dự định sẽ được sử dụng khi có hỏng đĩa trên một nút độc lập , điều này có thể dẫn đến các tài liệu bị hỏng.
Các repairDatabase
lệnh có thể được mô tả một cách chính xác hơn là "cơ sở dữ liệu cứu hộ". Đó là, nó tạo lại cơ sở dữ liệu bằng cách loại bỏ các tài liệu bị hỏng trong nỗ lực đưa cơ sở dữ liệu vào trạng thái nơi bạn có thể khởi động nó và trục vớt tài liệu nguyên vẹn từ nó.
Trong các triển khai MMAPv1, việc xây dựng lại các tệp cơ sở dữ liệu này sẽ giải phóng không gian cho HĐH như là một tác dụng phụ . Phát hành không gian cho hệ điều hành không bao giờ là mục đích.
Hậu quả của repairDatabase
một bộ bản sao
Trong một bộ bản sao, MongoDB hy vọng tất cả các nút trong tập hợp có chứa dữ liệu giống hệt nhau. Nếu bạn chạy repairDatabase
trên một nút đặt bản sao, có khả năng nút đó chứa tham nhũng không bị phát hiện vàrepairDatabase
sẽ loại bỏ các tài liệu bị hỏng cho bạn.
Có thể dự đoán, điều này làm cho nút đó chứa một tập dữ liệu khác với phần còn lại của tập hợp. Nếu một bản cập nhật xảy ra với tài liệu đơn lẻ đó, toàn bộ thiết bị có thể bị sập.
Để làm cho vấn đề tồi tệ hơn, hoàn toàn có thể là tình huống này có thể không hoạt động trong một thời gian dài, chỉ để tấn công bất ngờ mà không có lý do rõ ràng.