MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Khi nào sử dụng GridFS trên MongoDB?

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $ toBool

  2. Không thể tạo chỉ mục trong mongodb, khóa quá lớn để lập chỉ mục

  3. 2 cách thay thế chuỗi con trong MongoDB

  4. MongoDB $ cosh

  5. Gọi lại Mongoose.js instance.save () không kích hoạt