GridFS là một hệ thống tệp trừu tượng đơn giản trên MongoDB. Nếu bạn đã quen thuộc với Amazon S3, thì GridFS là một bản tóm tắt rất giống nhau. Bây giờ, tại sao một cơ sở dữ liệu hướng tài liệu như MongoDB lại cung cấp một lớp tệp trừu tượng? Hóa ra có một số lý do rất chính đáng:
-
Lưu trữ nội dung tệp do người dùng tạo
Một số lượng lớn các ứng dụng web cho phép người dùng tải tệp lên. Trước đây, khi làm việc với cơ sở dữ liệu quan hệ, các tệp do người dùng tạo này được lưu trữ trên hệ thống tệp tách biệt với cơ sở dữ liệu. Điều này tạo ra một số vấn đề. Làm thế nào để sao chép các tệp tới tất cả các máy chủ cần thiết? Làm thế nào để xóa tất cả các bản sao khi tệp bị xóa? Làm thế nào để sao lưu các tệp để an toàn và khôi phục thảm họa? GridFS giải quyết những vấn đề này cho người dùng bằng cách lưu trữ các tệp cùng với cơ sở dữ liệu và bạn có thể tận dụng sao lưu cơ sở dữ liệu để sao lưu các tệp của mình. Ngoài ra, do bản sao MongoDB, một bản sao các tệp của bạn được lưu trữ trong mỗi bản sao. Xóa tệp dễ dàng như xóa một đối tượng trong cơ sở dữ liệu.
-
Truy cập các phần của nội dung tệp
Khi một tệp được tải lên GridFS, tệp sẽ được chia thành các phần 256k và được lưu trữ riêng biệt. Vì vậy, khi bạn chỉ cần đọc một số byte nhất định của tệp, chỉ những phần đó được đưa vào bộ nhớ chứ không phải toàn bộ tệp. Điều này cực kỳ hữu ích khi xử lý nội dung đa phương tiện lớn cần được đọc hoặc chỉnh sửa có chọn lọc.
-
Lưu trữ tài liệu lớn hơn 16MB trong MongoDB
Theo mặc định, kích thước tài liệu MongoDB được giới hạn ở 16 MB. Vì vậy, nếu bạn có tài liệu lớn hơn 16MB, bạn có thể lưu trữ chúng bằng GridFS.
-
Khắc phục các giới hạn của hệ thống tệp
Nếu bạn đang lưu trữ một số lượng lớn tệp, bạn sẽ cần xem xét các giới hạn của hệ thống tệp như số lượng tệp / thư mục tối đa, v.v. Với GridFS, bạn không nên ' không cần phải lo lắng về giới hạn hệ thống tệp. Ngoài ra, với GridFS và MongoDB sharding, bạn có thể phân phối tệp của mình trên các máy chủ khác nhau mà không làm tăng đáng kể độ phức tạp trong hoạt động.
GridFS - Hậu trường
GridFS sử dụng hai bộ sưu tập để lưu trữ dữ liệu:
> show collections; fs.chunks fs.files system.indexes >
Bộ sưu tập fs.files chứa siêu dữ liệu về các tệp và bộ sưu tập fs.chunks lưu trữ 256k khối thực tế. Nếu bạn có một bộ sưu tập đã phân đoạn, các phần này sẽ được phân phối trên các máy chủ khác nhau và bạn có thể nhận được hiệu suất tốt hơn một hệ thống tệp!
> db.fs.files.findOne(); { "_id" : ObjectId("530cf1bf96038f5cb6df5f39"), "filename" : "./conn.log", "chunkSize" : 262144, "uploadDate" : ISODate("2014-02-25T19:40:47.321Z"), "md5" : "6515e95f8bb161f6435b130a0e587ccd", "length" : 1644981 } >
MongoDB cũng tạo chỉ mục kết hợp trên files_id và số phân đoạn để giúp nhanh chóng truy cập các phân đoạn:
> db.fs.chunks.getIndexes(); [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "files.fs.chunks", "name" : "_id_" }, { "v" : 1, "key" : { "files_id" : 1, "n" : 1 }, "ns" : "files.fs.chunks", "name" : "files_id_1_n_1" } ] >
Ví dụ về MongoDB GridFS
MongoDB có một tiện ích tích hợp có tên là “mongofiles” để giúp thực hiện các kịch bản GridFS. Vui lòng tham khảo tài liệu trình điều khiển của bạn về cách sử dụng GridFS với trình điều khiển của bạn.
Put #mongofiles -h -u -p --db files put /conn.log connected to: 127.0.0.1 added file: { _id: ObjectId('530cf1009710ca8fd47d7d5d'), filename: "./conn.log", chunkSize: 262144, uploadDate: new Date(1393357057021), md5: "6515e95f8bb161f6435b130a0e587ccd", length: 1644981 } done! Get #mongofiles -h -u -p --db files get /conn.log connected to: 127.0.0.1 done write to: ./conn.log List # mongofiles -h -u -p list connected to: 127.0.0.1 /conn.log 1644981 Delete [root@ip-10-198-25-43 tmp]# mongofiles -h -u -p --db files delete /conn.log connected to: 127.0.0.1 done!
Mô-đun GridFS
Nếu bạn muốn cung cấp dữ liệu tệp được lưu trữ trong MongoDB trực tiếp từ máy chủ web hoặc hệ thống tệp của mình, có một số mô-đun plugin GridFS:
- GridFS-Fuse - Plugin GridFS vào hệ thống tệp
- GridFS-Nginx - Plugin tới các tệp GridFS của máy chủ trực tiếp từ Nginx
Hạn chế của GridFS
-
Bộ làm việc
Việc cung cấp tệp cùng với nội dung cơ sở dữ liệu của bạn có thể xáo trộn đáng kể bộ hoạt động của bộ nhớ. Nếu bạn không muốn làm phiền nhóm làm việc của mình, cách tốt nhất là phân phát tệp của bạn từ một máy chủ MongoDB khác.
-
Hiệu suất
Hiệu suất phân phát tệp sẽ chậm hơn so với việc phân phát tệp từ máy chủ web và hệ thống tệp của bạn. Tuy nhiên, các lợi ích quản lý bổ sung có thể đáng để làm chậm lại.
-
Cập nhật nguyên tử
GridFS không cung cấp cách thực hiện cập nhật nguyên tử một tệp. Nếu tình huống này là cần thiết, bạn sẽ cần duy trì nhiều phiên bản tệp của mình và chọn phiên bản phù hợp.