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

MongoDB làm nơi lưu trữ tệp

Tôi chỉ có thể trả lời cho MongoDB ở đây, tôi sẽ không giả vờ rằng tôi biết nhiều về HDFS và các công nghệ khác.

Việc triển khai GridFs hoàn toàn là phía máy khách trong chính trình điều khiển. Điều này có nghĩa là không có quá trình tải hoặc hiểu đặc biệt nào về ngữ cảnh phân phát tệp trong chính MongoDB, bản thân MongoDB thực sự thậm chí không hiểu chúng là tệp (http://docs.mongodb.org/manual/application/gridfs/).

Điều này có nghĩa là truy vấn bất kỳ phần nào của các tệp files hoặc chunks việc thu thập sẽ dẫn đến quy trình giống như đối với bất kỳ truy vấn nào khác, theo đó nó tải dữ liệu cần thiết vào tập hợp làm việc của bạn (http://en.wikipedia.org/wiki/Working_set) đại diện cho một tập hợp dữ liệu (hoặc tất cả dữ liệu đã tải tại thời điểm đó) theo yêu cầu của MongoDB trong một khung thời gian nhất định để duy trì hiệu suất tối ưu. Nó thực hiện điều này bằng cách phân trang nó vào RAM (về mặt kỹ thuật thì hệ điều hành cũng vậy).

Một điểm cần xem xét là điều này được thực hiện trình điều khiển. Điều này có nghĩa là thông số kỹ thuật có thể khác nhau, tuy nhiên, tôi không nghĩ là có. Tất cả các trình điều khiển sẽ cho phép bạn truy vấn một bộ tài liệu từ các tệp files bộ sưu tập chỉ chứa dữ liệu meta tệp cho phép bạn phân phát tệp sau này từ chunks bộ sưu tập với một truy vấn duy nhất.

Tuy nhiên đó không phải là điều quan trọng, bạn muốn phục vụ chính tệp đó, bao gồm cả dữ liệu của nó; điều này có nghĩa là bạn sẽ tải các tệp files bộ sưu tập và các phần files tiếp theo của nó bộ sưu tập vào bộ làm việc của bạn.

Với ý nghĩ đó, chúng tôi đã đạt được khó khăn đầu tiên:

Các tệp từ gridfs có được lưu vào bộ nhớ đệm trong ram không và nó sẽ ảnh hưởng như thế nào đến hiệu suất đọc-ghi?

Hiệu suất đọc các tệp nhỏ có thể tuyệt vời, trực tiếp từ RAM; các bài viết sẽ tốt như vậy.

Đối với các tệp lớn hơn, không phải như vậy. Hầu hết các máy tính sẽ không có 600 GB RAM và trên thực tế, có khả năng, khá bình thường, chứa một phân vùng 600 GB của một tệp trên một mongod. ví dụ. Điều này tạo ra một vấn đề vì tệp đó, để được cung cấp, cần phải phù hợp với bộ làm việc của bạn tuy nhiên nó không thể lớn hơn RAM của bạn; tại thời điểm này, bạn có thể gặp sự cố trang (http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29) theo đó máy chủ chỉ là trang bị lỗi 24/7 khi cố gắng tải tệp. Các bài viết ở đây cũng không tốt hơn.

Cách duy nhất để giải quyết vấn đề này là bắt đầu đặt một tệp duy nhất trên nhiều phân đoạn :\ .

Lưu ý:một điều nữa cần xem xét là kích thước trung bình mặc định của chunks "chunk" là 256KB, vì vậy đó là rất nhiều tài liệu cho một tệp 600GB. Cài đặt này có thể thao tác được trong hầu hết các trình điều khiển.

Điều gì sẽ xảy ra với gridfs khi tôi cố gắng viết một vài tệp đồng thời. Sẽ có bất kỳ khóa nào cho các hoạt động đọc / ghi? (Tôi sẽ chỉ sử dụng nó làm nơi lưu trữ tệp)

GridFS, chỉ là một đặc tả sử dụng các khóa giống như trên bất kỳ bộ sưu tập nào khác, cả khóa đọc và ghi ở cấp độ cơ sở dữ liệu (2.2+) hoặc ở cấp độ toàn cầu (trước 2.2). Cả hai cũng gây ảnh hưởng lẫn nhau, tức là làm thế nào bạn có thể đảm bảo việc đọc một cách nhất quán tài liệu đang được viết?

Điều đó được cho là khả năng tranh chấp tồn tại dựa trên các chi tiết cụ thể về kịch bản của bạn, lưu lượng truy cập, số lần viết / đọc đồng thời và nhiều thứ khác mà chúng tôi không biết.

Có thể có một số giải pháp khác có thể giải quyết vấn đề của tôi hiệu quả hơn?

Cá nhân tôi nhận thấy rằng S3 (như @mluggy đã nói) ở định dạng giảm dự phòng hoạt động tốt nhất khi lưu trữ một phần dữ liệu meta về tệp trong MongoDB, giống như sử dụng GridFS nhưng không có bộ sưu tập khối, hãy để S3 xử lý tất cả việc phân phối, sao lưu và những thứ khác cho bạn.

Hy vọng rằng tôi đã rõ ràng, hy vọng nó sẽ hữu ích.

Chỉnh sửa:Không giống như những gì tôi đã vô tình nói, MongoDB không có khóa cấp độ bộ sưu tập, nó là khóa cấp độ cơ sở dữ liệu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hình ảnh trả về từ API REST luôn hiển thị bị hỏng

  2. Tùy chọn Mongoose autoReconnect

  3. Cắt bớt một bộ sưu tập

  4. xác thực mongodb với chuỗi kết nối

  5. MongoDB dưới dạng dịch vụ cửa sổ và thiết lập bản sao