Nói chung, nếu bạn không cần phải thu nhỏ các tệp dữ liệu của mình, bạn không nên thu nhỏ chúng. Điều này là do "phát triển" datafiles của bạn trên đĩa là một hoạt động khá tốn kém và không gian hơn mà MongoDB có thể phân bổ trong các datafiles bạn sẽ có ít phân mảnh hơn.
Vì vậy, bạn nên cố gắng cung cấp càng nhiều không gian đĩa càng tốt cho cơ sở dữ liệu.
Tuy nhiên nếu bạn phải thu nhỏ cơ sở dữ liệu, bạn nên ghi nhớ hai điều.
MongoDB phát triển đó là các file dữ liệu bằng cách tăng gấp đôi vì vậy các datafiles có thể 64MB, sau đó 128MB, vv lên đến 2GB (tại điểm mà nó ngừng tăng gấp đôi lên giữ các tập tin cho đến 2GB.)
Như với hầu hết mọi cơ sở dữ liệu ... để thực hiện các thao tác như thu hẹp, bạn sẽ cần để lập lịch một công việc riêng biệt thành làm như vậy, không có "autoshrink" trong MongoDB. Trong thực tế của các cơ sở dữ liệu NoSQL chính (ghét tên đó) chỉ Riak sẽ tự động sửa. Vì vậy, bạn sẽ cần phải tạo công việc bằng cách sử dụng trình lập lịch biểu của OS để chạy thu nhỏ. Bạn có thể sử dụng một kịch bản bash, hoặc có một công việc chạy một kịch bản php, vv
serverside Javascript
Bạn có thể sử dụng máy chủ bên Javascript để làm co và chạy mà JS qua vỏ Mongo của trên cơ sở thường xuyên thông qua một công việc (như cron hoặc dịch vụ cửa sổ lịch) ...
Giả sử một bộ sưu tập được gọi là foo bạn sẽ tiết kiệm javascript dưới đây vào một tập tin gọi là bar.js và chạy ...
$ mongo foo bar.js
Các tập tin javascript sẽ giống như ...
// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();
print('Storage Size: ' + tojson(storage));
print('TotalSize: ' + tojson(total));
print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');
// Run repair
db.repairDatabase()
// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();
print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));
này sẽ chạy và trở về một cái gì đó giống như ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Run này theo một lịch trình (trong none đỉnh giờ) và bạn tốt để đi.
Capped Collections
Tuy nhiên có một lựa chọn khác, capped collections.
bộ sưu tập Capped được cố định kích thước bộ sưu tập có một hiệu suất tự động FIFO tính năng tuổi-out rất cao (tuổi ra được dựa trên trật tự chèn). Chúng giống như khái niệm "RRD" nếu bạn quen với điều đó.
Ngoài ra, bộ sưu tập được giới hạn tự động, với hiệu suất cao, duy trì thứ tự chèn cho các đối tượng trong bộ sưu tập; đây là rất mạnh mẽ đối với một số trường hợp sử dụng nhất định chẳng hạn như ghi nhật ký.
Về cơ bản, bạn có thể giới hạn kích thước (hoặc số tài liệu in) một bộ sưu tập để nói .. 20GB và một khi giới hạn đó được đạt tới MongoDB sẽ bắt đầu ném ra các hồ sơ lâu đời nhất và thay thế chúng với các mục mới như họ
Đây là một cách tuyệt vời để giữ một lượng lớn dữ liệu, loại bỏ dữ liệu cũ hơn theo thời gian và giữ cùng dung lượng đĩa được sử dụng.
Cám ơn bài đăng tuyệt vời. nếu tôi không thu hẹp các datafiles thì mongod sẽ luôn tốn rất nhiều bộ nhớ, làm thế nào tôi có thể giải quyết nó? –
@Zealot ... Xem câu trả lời của tôi về việc sử dụng bộ nhớ, nó có thể hữu ích. http://stackoverflow.com/questions/4468873/how-to-release-the-caching-which-is-used-by-mongodb/4482465#4482465 –
Tôi hiểu rồi, chúng tôi có bộ nhớ 16 GB và chi phí mongodb 4GB . Vì vậy, tôi có thể không quan tâm về nó. Cảm ơn bạn vì những câu trả lời này. –