Vấn đề lưu trữ trong ngành công nghệ thông tin từ trước đến nay luôn là một vấn đề chưa có lời giải thống nhất. Nhiều tổ chức chọn cách lưu trực tiếp file vào ổ cứng của máy chủ, lưu trên các hệ thống điện toán đám mây, lưu dưới dạng mã hóa text vào trong các cơ sở dữ liệu,... Cùng với sự phát triển như vũ bão của các công nghệ, bạn có biết không, chúng ta hoàn toàn có thể sử dụng MongoDB để lưu trữ file với GridFS. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về công nghệ cực kì thú vị này nhé.

1. GridFS trong MongoDB là gì?

GridFS là MongoDB Specification, được dùng để lưu giữ và thu thập các file lớn như các image, audio, video file… Nó là một loại của hệ thống file để lưu giữ các file nhưng dữ liệu của nó được lưu giữ bên trong các Collection của MongoDB. GridFS có khả năng lưu giữ các file ngay cả khi kích cỡ của nó lớn hơn giới hạn kích cỡ là 16MB của Document.

GridFS phân chia một file thành các Chunk và lưu giữ mỗi mảng dữ liệu trong một Document riêng.

Theo mặc định, GridFS sử dụng hai Collection là fs.files và fs.chunks để lưu giữ metadata của file và các Chunk. Mỗi Chunk được nhận diện bởi trường _id ObjectId duy nhất. fs.files hoạt động như là một Document cha. Trường files_id trong fs.chunks liên kết Chunk tới Document cha của nó.

Dưới đây là Document mẫu của fs.files collection:

{

    "filename": "test.txt",

    "chunkSize": NumberInt(261120),

    "uploadDate": ISODate("2014-04-13T11:32:33.557Z"),

    "md5": "7b762939321e146569b07f72c62cca4f",

    "length": NumberInt(646)

}

Document xác định tên file, kích cỡ Chunk, ngày cập nhật, và độ dài.

Dưới đây là Document mẫu của fs.chunks document:

{

    "files_id": ObjectId("534a75d19f54bfec8a2fe44b"),

    "n": NumberInt(0),

    "data": “Mongo Binary Data”

}

>>> Xem thêm bài viết khác về MongoDB:

2. Thêm file tới GridFS

Để có thể thêm file vào GridFS, chúng ta sẽ sử dụng lệnh put. Trong thư mục cài đặt của MongoDB, các bạn sẽ sử dụng tiện ích mongofiles để có thể upload file vào MongoDB. Các ví dụ dưới đây được thao tác trong một container chạy MongoDB, vì vậy các command sẽ được bind vào trong thư mục/bin, do đó chúng ta không cần chỉ rõ vị trí của executable file nhé.

Cú pháp chúng ta sẽ sử dụng như sau:

mongofiles -d gridfs put <file>

Nếu chúng ta muốn đăng một file có tên là song.mp3 thì câu lệnh để thực hiện nó sẽ là:

mongofiles -d gridfs put song.mp3

Và kết quả trả về sẽ có dạng như sau:

{

    _id: ObjectId("534a811bf8b4aa4d33fdf94d"),

    filename: "song.mp3",

    chunkSize: 261120,

    uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",

    length: 10401959

}

Chúng ta cũng có thể quan sát tất cả các Chunk có mặt trong fs.chunks collection liên quan tới file được lưu giữ với phần code sau, sử dụng document id được trả về từ truy vấn trước.

db.fs.chunks.find({files_id:ObjectId("534a811bf8b4aa4d33fdf94d")})

Ở đây, truy vấn trả về 40 Document, nghĩa là toàn bộ mp3 document được phân chia thành 40 Chunk.

>>> Xem thêm bài viết:

3. Khi nào thì nên sử dụng GridFS trong MongoDB

Trong MongoDB, GridFS được sử dụng để lưu trữ các file lớn hơn 16MB. 

Trong một vài trường hợp, việc lưu trữ một file có dung lượng lớn như vậy trên MongoDB có thể mang lại hiệu suất cao hơn là lưu trữ tại một máy chủ. Cụ thể, dưới đây là một vài trường hợp:

- Nếu hệ thống của bạn giới hạn số file được lưu trữ trong một thư mục, bạn có thể sử dụng GridFS để lưu số lượng file tùy ý.

- Khi bạn muốn truy cập vào các thông tin từ nhiều file lớn mà không cần phải tải toàn bộ nội dung của chúng về RAM, bạn có thể sử dụng GridFS để đọc các phần nhỏ của file mà không cần phải nạp toàn bộ dữ liệu của nó vào bộ nhớ.

- Khi bạn muốn giữ file cũng như các thông tin của file được đồng bộ và triển khai qua nhiều hệ thống và hạ tầng khác nhau, bạn hoàn toàn có thể tận dụng GridFS. Khi sử dụng chế độ phân tán theo vùng, MongoDB có thể phân phát file của bạn và thông tin của nó một cách hoàn toàn tự động đến replica set của nó.

Tất nhiên là cũng sẽ có những khi chúng ta không nên lạm dụng GridFS, nhất là khi bạn cần cập nhật nội dung của file một cách tự động. Thay vào đó, bạn có thể lưu trữ nhiều version của một file và định nghĩa version hiện tại bằng metadata của nó, nghe có vẻ giống như việc sử dụng git để lưu trữ code vậy. Việc làm này có lẽ là rất quen thuộc với các bạn dev rồi phải không nào.

Hơn nữa, nếu toàn bộ các file của bạn chỉ có dung lượng chưa tới 16MB, hãy cân nhắc lưu trữ từng file trong một document thay vì sử dụng GridFS. BigData là kiểu dữ liệu có thể giúp bạn giải quyết được bài toán này.

Kết

GridFS là một công cụ mạnh mẽ, có thể giúp bạn lưu được các file lớn vào MongoDB. Tuy nhiên, chúng ta cũng không nên lạm dụng công cụ này, với các file nhỏ thì bạn hoàn toàn có thể lưu nó trong một document của MongoDB, như vậy là một công đôi việc. Chúng ta có thể giảm tải được cho các hệ thống của mình, vừa hay cũng có thể lưu trữ và phân tán file hiệu quả hơn bằng cách sử dụng một database để lưu nó.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: