GridFS có đủ nhanh và đáng tin cậy để sản xuất không?


86

Tôi phát triển một trang web mới và tôi muốn sử dụng GridFS làm bộ nhớ cho tất cả các tệp tải lên của người dùng, bởi vì nó mang lại rất nhiều lợi thế so với bộ lưu trữ hệ thống tệp thông thường.

Các điểm chuẩn với GridFS do nginx cung cấp cho thấy rằng nó không nhanh như một hệ thống tệp bình thường do nginx cung cấp.

Điểm chuẩn với nginx

Có ai ở ngoài đó, những người sử dụng GridFS đã có trong môi trường sản xuất, hoặc sẽ sử dụng nó cho một dự án mới không?


1
Một bài đăng trên blog về việc lưu trữ hình ảnh trong mongodb dành cho những người tìm kiếm trong tương lai có mục đích tương tự như tôi: menge.io/2015/03/24/storing-small-images-in-mongodb (so sánh GridFS với việc chỉ cần ném nó vào tài liệu dưới dạng tệp nhị phân dữ liệu)

Có rất nhiều thương mại-offs cần xem xét khi quyết định nếu bạn muốn lưu trữ dữ liệu nhị phân trong MongoDB - xem: alexmarquardt.com/2017/03/02/...
Alexander Marquardt

Câu trả lời:


118

Tôi sử dụng gridfs tại nơi làm việc trên một trong những máy chủ của chúng tôi, một phần của trang web so sánh giá với số liệu thống kê về lưu lượng truy cập đáng nể (khoảng 25 nghìn khách truy cập mỗi ngày). Máy chủ không có nhiều ram, 2gigs và thậm chí là cpu không thực sự nhanh (Core 2 duo 1.8Ghz) nhưng máy chủ có nhiều dung lượng lưu trữ: 10Tb (sata) trong cấu hình đột kích 0. Công việc mà máy chủ đang làm rất đơn giản:

Mỗi sản phẩm trên công cụ so sánh giá của chúng tôi đều có một hình ảnh (có khoảng 10 triệu sản phẩm theo db sản phẩm của chúng tôi) và công việc của máy chủ là tải hình ảnh xuống, thay đổi kích thước, lưu trữ hình ảnh trên gridfs và cung cấp cho trình duyệt của khách truy cập. .. nếu nó không có trong lưới ... hoặc ... gửi nó đến trình duyệt của khách truy cập nếu nó đã được lưu trong lưới. Vì vậy, đây có thể được gọi là 'lược đồ cdn truyền thống'.

Chúng tôi đã lưu trữ và xử lý 4 triệu hình ảnh trên máy chủ này kể từ khi nó hoạt động. Việc thay đổi kích thước và lưu trữ nội dung được thực hiện bằng một tập lệnh php đơn giản ... nhưng chắc chắn, một tập lệnh python hoặc thứ gì đó như java có thể nhanh hơn.

Kích thước dữ liệu hiện tại: 11,23g

Kích thước lưu trữ hiện tại: 12,5g

Chỉ số: 5

Kích thước chỉ số: 849,65m

Về độ tin cậy: Điều này rất đáng tin cậy. Máy chủ không tải, kích thước chỉ mục ổn, truy vấn nhanh

Về tốc độ: Chắc chắn, nó không nhanh bằng lưu trữ tệp cục bộ, có thể chậm hơn 10%, nhưng đủ nhanh để sử dụng trong thời gian thực ngay cả khi hình ảnh cần được xử lý, điều này phụ thuộc vào php trong trường hợp của chúng tôi. Thời gian bảo trì và phát triển cũng được giảm bớt: việc xóa một hoặc nhiều hình ảnh trở nên đơn giản: chỉ cần truy vấn db bằng một lệnh xóa đơn giản. Một điều thú vị khác: khi chúng tôi khởi động lại máy chủ cũ, với bộ lưu trữ tệp cục bộ (hàng triệu tệp trong hàng nghìn thư mục), đôi khi nó bị treo hàng giờ khiến hệ thống đang thực hiện kiểm tra tính toàn vẹn của tệp (việc này thực sự mất hàng giờ đồng hồ ...). Chúng tôi không gặp vấn đề này nữa với gridfs, hình ảnh của chúng tôi hiện được lưu trữ trong các khối mongodb lớn (tệp 2gb)

Vì vậy ... theo suy nghĩ của tôi ... Vâng, gridfs đủ nhanh và đáng tin cậy để được sử dụng cho sản xuất.


9
Tôi rất ngạc nhiên rằng bất cứ ai cũng sử dụng đột kích 0 vì có bộ nhớ chính trên một trang web sản xuất. Ngay cả với các bản sao lưu tốt, việc tăng khả năng xảy ra lỗi lưu trữ là một cái giá khá đắt để cải thiện hiệu suất.
mikerobi

67
Chúng tôi sử dụng đột kích 0 vì trong trường hợp cụ thể của chúng tôi, dữ liệu hình ảnh có thể biến động. Không quan trọng nếu hình ảnh bị mất vì chúng tôi sẽ tải xuống lại từ trang web của người bán. Thực tế, chúng tôi có thể coi máy chủ của chúng tôi là một máy chủ bộ nhớ cache hình ảnh đơn giản.
Manu Eidenberger

Nhưng bạn đang tích cực làm tăng khả năng hỏng hóc (hệ số lỗi ổ đĩa ban đầu nhân với số trục quay). Raid 10 sẽ lý tưởng nếu bạn cần ghi nhiều hơn đọc hoặc Raid 5/6 nếu bạn cần đọc nhiều hơn ghi.
NeuroScr

9
@ManuEidenberger Tại sao bạn sử dụng GridFS để lưu trữ hình ảnh mà muốn được lưu trữ trong tài liệu MongoDB? Tôi đoán bạn đã không đạt đến giới hạn kích thước tài liệu 16 MB. Và việc lưu trữ hình ảnh dưới dạng BLOB trong tài liệu MongoDB sẽ hiệu quả hơn, vì bạn không cần lớp GridFS trên đầu tài liệu MongoDB.
Arnaud Bouchez

1
Tôi cũng tò mò về câu hỏi của @ ArnaudBouchez. Có lợi ích nào đó khiến bạn chọn GridFS thay vì chỉ lưu trữ nó dưới dạng dữ liệu nhị phân trong tài liệu không, Manu? Cảm ơn!

12

Như đã đề cập, nó có thể không nhanh như một hệ thống tệp thông thường nhưng sau đó nó mang lại cho bạn lợi thế so với các hệ thống tệp thông thường mà tôi nghĩ đáng để bỏ ra một chút tốc độ.

Cuối cùng, với sharding, tuy nhiên, bạn có thể đạt đến điểm mà bộ lưu trữ GridFS thực sự trở thành tùy chọn nhanh hơn so với hệ thống tệp thông thường và một nút duy nhất.


6

Mặc dù vậy, hãy lưu ý về việc sửa chữa cho các DB lớn hơn - một hệ thống mới mà chúng tôi đang phát triển, mongo đã không thoát sạch và việc sửa chữa GridFS 7TB có vẻ như sẽ mất 130 giờ.

Vì lý do này, tôi nghĩ tôi sẽ xem xét việc chuyển sang OpenStack Swift hoặc Ceph. Tuy nhiên, cho đến lúc đó thì tốt. Và mô-đun nginx-gridfs rất thú vị.


Vậy bạn đã đi như thế nào?
Mukus

5

Mô-đun nginx-gridfs của mdirolf rất tuyệt và khá dễ cài đặt. Chúng tôi đang sử dụng nó trong sản xuất tại paint.ly để phục vụ tất cả các bức tranh và không có vấn đề gì cho đến nay.


3
Có vẻ như paint.ly không còn nữa. :(
Marian

2

Tôi không khuyên bạn nên sử dụng gridfs trừ khi bạn biết mình đang làm gì. GridFS chỉ là lớp trừu tượng chia các tệp thành nhiều phần và lưu trữ tệp trong hai bộ sưu tập. Nhiều tệp hơn - nhiều chi phí hơn. Nếu bạn mong đợi các tệp có cùng kích thước, không vượt quá 32M hoặc lâu hơn - bạn đang làm đúng. Đừng cố gắng lưu trữ các tệp lớn trên gridfs. Tại sao?

  1. Trình điều khiển trên các ngôn ngữ khác nhau có thể đọc toàn bộ tệp. (Ví dụ: phần nhỏ) khi đọc phần nhỏ của tệp.
  2. Việc sửa đổi tệp có thể ảnh hưởng đến tất cả các phần và tăng tải cơ sở dữ liệu Nếu hệ thống tệp của bạn đang phát triển, bạn sẽ phải quyết định chia nhỏ các ô lưới. Hãy cẩn thận! Tính nhất quán không được đảm bảo khi khởi chạy sharding!

Nếu bạn nghĩ về dự án đã tải đã đọc - hãy xem xét tải trực tiếp các tệp vào tài liệu (nếu kích thước 16M trở xuống) hoặc chọn một clusterfs khác và liên kết tên tệp / inode với logic của bạn.

Hi vọng điêu nay co ich.


4
Tôi khá mới với GridFS mặc dù theo những gì tôi hiểu thì GridFS không chỉ là một lớp trừu tượng giúp tăng gấp đôi số lượng tệp. GridFS cung cấp một cách đơn giản để tận dụng các tính năng nhân bản và sharding của MongoDB. Tôi tin rằng những người khác cũng đã đề cập rằng các tệp được lưu trữ trong các khối 2GB mà tôi tưởng tượng sẽ làm giảm tổng số tệp, đặc biệt nếu ai đó có một lượng rất lớn hình ảnh nhỏ.

+1 Bạn đúng. Ngay cả các tệp nhỏ hơn sẽ không có lợi khi được lưu trữ bằng GridFS. Nếu tệp của bạn có thể được lưu trữ trong tài liệu MongoDB (tức là <giới hạn kích thước 16 MB của nó), bạn muốn lưu trữ tệp dưới dạng BLOB trong tài liệu MongoDB. Nó sẽ bỏ qua chi phí sử dụng GridFS trên bộ nhớ MongoDB. Xem Compare.io/articles/gridfs-and-mongodb-pros-and-cons
Arnaud Bouchez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.