2010-05-23 25 views
30

Tôi có một ứng dụng web lưu trữ nhiều tệp do người dùng tạo. Hiện tại tất cả chúng đều được lưu trữ trên hệ thống tập tin của máy chủ, trong đó có một số nhược điểm đối với tôi.Lưu trữ tệp cho các ứng dụng web: Hệ thống tập tin vs DB và công cụ NoSQL

  • Khi chúng tôi di chuyển "thư mục" (theo định nghĩa của ứng dụng), chúng tôi cũng phải di chuyển tệp trên đĩa (mặc dù điều này là do các quyết định thiết kế lạ hơn. những thứ trên hệ thống tập tin).
  • Thật khó để viết các thử nghiệm cho các hành động của hệ thống tệp; Tôi có một lớp hệ thống tập tin giả lập ghi nhật ký các hành động như di chuyển, xóa, vv, mà không thực hiện chúng, mà nhiều hay ít công việc, nhưng tôi không có 100% sự tự tin trong các bài kiểm tra.
  • Tôi sẽ thêm một số công việc khác cần truy cập các tệp từ dịch vụ khác để thực hiện các tác vụ bổ sung (ví dụ: lập chỉ mục trong Solr, tạo hình thu nhỏ, chuyển đổi định dạng phim), vì vậy tôi cần nhận các tệp từ xa. Làm điều này qua mạng chia sẻ có vẻ tinh ranh ...
  • Xử lý các quyền trên hệ thống tệp đôi khi cho chúng tôi vấn đề trong quá khứ, mặc dù hiện tại chúng tôi đã chuyển sang môi trường Linux thuần túy, điều này sẽ ít hơn.

Vì vậy, câu hỏi chính của tôi là

  • các nhược điểm của lưu trữ file như BLOB trong MySQL là gì?
  • Các vấn đề tương tự tồn tại với các hệ thống NoSQL như Cassandra?
  • Có ai có bất kỳ đề xuất nào khác có thể thích hợp không, ví dụ: MogileFS, v.v ...?

Trả lời

7

Không phải là câu trả lời trực tiếp mà là một số gợi ý cho các câu hỏi rất thú vị và tương tự (vâng, chúng về màu sắc và hình ảnh nhưng đây là IMO có thể so sánh).

Nhược điểm của việc lưu trữ tệp dưới dạng BLOB trong MySQL là gì?

Đừng những vấn đề cùng tồn tại với các hệ thống NoSQL như Cassandra?

PS: Tôi không muốn trở thành kẻ phá đám nhưng tôi không nghĩ rằng bất kỳ giải pháp NoSQL là sẽ giải quyết vấn đề của bạn (NoSQL chỉ là không phù hợp với hầu hết các doanh nghiệp).

+0

Cảm ơn, trông giống như một tập hợp các liên kết rất hữu ích. Lưu trữ hình ảnh/đốm màu của bất kỳ loại nào là những gì tôi đang theo sau (chúng tôi đang lưu trữ tất cả các loại công cụ). –

+0

Cảm ơn, các liên kết được đề xuất của bạn thật tuyệt vời. Rõ ràng tôi cần tìm kiếm kỹ hơn trước khi đặt câu hỏi :) Tóm lại, tránh DB trông giống như cách đi. Tôi chỉ cần tách ứng dụng ra khỏi hệ thống tập tin để nó bớt đau đớn hơn ... –

+0

Rất vui khi bạn thấy chúng hữu ích. Và tôi chia sẻ kết luận này. –

3

có thể là giải pháp lai.

Sử dụng cơ sở dữ liệu để lưu trữ siêu dữ liệu về từng tệp - và sử dụng hệ thống tệp để lưu trữ tệp.

bất kỳ việc tái cơ cấu 'thư mục' nào có thể được lập mô hình trong DB và được tham chiếu từ vị trí hệ điều hành thực tế.

+0

Đó là những gì chúng tôi làm; việc tái cơ cấu các thư mục nên, lý tưởng, hoàn toàn bị bỏ qua từ vị trí hệ thống tập tin thực tế, nhưng các nhà phát triển cũ đã đi ra ngoài để liên kết nó ... Vì vậy, tôi phải đối mặt với một viết lại cho một số mở rộng anyway, và tôi ' m tự hỏi nếu có một cách tiếp cận phù hợp mà hoàn toàn sẽ tránh được hệ thống tập tin. –

+0

làm thế nào để một dereference từ vị trí hệ điều hành? – Erik

+0

dereference ở đây có nghĩa là vị trí hệ thống tệp có thể được sửa trong một số thư mục, nhưng cơ sở dữ liệu có cách ghi nhãn vị trí có thể giống như hệ thống phân cấp thư mục nhưng không giống với vị trí thực tế. mối quan hệ FK bình thường – Randy

0

Nếu hệ điều hành hoặc ứng dụng không cần quyền truy cập vào tệp, thì không cần lưu trữ tệp trên hệ thống tệp. Nếu bạn muốn sao lưu các tập tin cùng một lúc bạn sao lưu cơ sở dữ liệu, thì có ít lợi ích hơn để lưu trữ chúng bên ngoài cơ sở dữ liệu. Do đó, nó có thể là một giải pháp hợp lệ để lưu trữ các tệp trong cơ sở dữ liệu.

Một nhược điểm nữa là các tệp xử lý trong db có nhiều chi phí hơn là xử lý tệp ở cấp hệ thống tệp. Tuy nhiên, miễn là những lợi thế lớn hơn những nhược điểm, và có vẻ như nó có thể trong trường hợp của bạn, bạn có thể cho nó một thử.

Mối quan tâm chính của tôi là quản lý bộ nhớ đĩa. Khi tệp cơ sở dữ liệu của bạn lớn, việc quản lý toàn bộ cơ sở dữ liệu của bạn trở nên phức tạp hơn. Bạn không muốn di chuyển ra khỏi chảo và vào lửa.

+0

Tôi không quan tâm đến không gian đĩa; Thật là rẻ tiền trong những ngày này, tôi chỉ có thể thêm nhiều ổ đĩa và RAID chúng nếu cần thiết. Mối quan tâm của tôi với mysql chủ yếu liên quan đến bộ nhớ đệm; nếu tôi chạy truy vấn trả về BLOBS, có vẻ như điều này sẽ chiếm một lượng lớn bộ nhớ cache, xóa dữ liệu hữu ích khác. Tôi nghi ngờ rằng cũng phải có những vấn đề khác, nếu không nhiều người sẽ làm theo cách đó, nhưng tôi không chắc họ là ai. –

+0

Tôi đã đọc rất nhiều về chủ đề này, và không ai có tuyên bố vấn đề bộ nhớ cache truy vấn như là một lý do không lưu trữ các tập tin trong cơ sở dữ liệu. Với MySQL, bạn có thể đặt giá trị query_cache_limit, cho biết kích thước bộ nhớ kết quả tối đa cho bộ nhớ cache. Giá trị mặc định là 1 MB. Là một giải pháp thay thế có thể giải quyết các vấn đề bạn đang gặp phải với hệ thống tệp, bạn cũng có thể xem xét một NFS (một máy chủ tệp). Bạn có thể lưu trữ các tham chiếu đến các tệp trong db. –

+0

Đúng, hạn chế kích thước của những thứ được lưu trữ trong bộ nhớ cache truy vấn có thể sẽ làm giảm sự quan tâm của tôi ở đây. Lưu trữ tài liệu tham khảo hệ thống tệp vẫn là một nỗi đau, nhưng có vẻ như đó là cách tốt nhất. –

2

Bạn có thể lưu trữ tệp có dung lượng tối đa 2GB trong Cassandra bằng cách chia chúng thành 1MB cột hoặc hơn. Điều này khá phổ biến.

Bạn cũng có thể lưu nó thành một cột lớn, nhưng sau đó bạn phải đọc toàn bộ nội dung đó vào bộ nhớ khi truy cập vào nó.

Các vấn đề liên quan