Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lưu trữ dễ dàng hình ảnh do người dùng tải lên trên hệ thống tệp

Chúng tôi có một hệ thống như vậy trong sản xuất nặng với hơn 30.000 tệp và hơn 20 GB cho đến nay ...

Cột
   Column    |            Type             |                        Modifiers                         
-------------+-----------------------------+----------------------------------------------------------
 File_ID     | integer                     | not null default nextval('"ACRM"."File_pseq"'::regclass)
 CreateDate  | timestamp(6) with time zone | not null default now()
 FileName    | character varying(255)      | not null default NULL::character varying
 ContentType | character varying(128)      | not null default NULL::character varying
 Size        | integer                     | not null
 Hash        | character varying(40)       | not null
Indexes:
    "File_pkey" PRIMARY KEY, btree ("File_ID")

Các tệp chỉ được lưu trữ trong một thư mục duy nhất với số nguyên File_ID là tên của tệp. Chúng tôi có hơn 30.000 người mà không gặp vấn đề gì. Tôi đã thử nghiệm cao hơn mà không gặp vấn đề gì.

Điều này đang sử dụng RHEL 5 x86_64 với ext3 làm hệ thống tệp.

Tôi có làm lại theo cách này không? Không. Hãy để tôi chia sẻ một vài suy nghĩ về việc thiết kế lại.

  1. Cơ sở dữ liệu vẫn là "nguồn chính" của thông tin trên các tệp.

  2. Mỗi tệp được băm sha1 () và được lưu trữ trong phân cấp hệ thống tệp dựa trên hàm băm đó:/FileData/ab/cd/abcd4548293827394723984723432987.jpg

  3. cơ sở dữ liệu thông minh hơn một chút về việc lưu trữ siêu thông tin trên mỗi tệp. Nó sẽ là một hệ thống ba bảng:

    File :lưu trữ thông tin như tên, ngày tháng, ip, chủ sở hữu và một con trỏ đến một Blob (sha1)
    File_Meta :lưu trữ các cặp khóa / giá trị trên tệp, tùy thuộc vào loại tệp. Điều này có thể bao gồm thông tin như Image_Width, v.v ...
    Blob :lưu trữ một tham chiếu đến sha1 cùng với kích thước của nó.

Hệ thống này sẽ khử trùng lặp nội dung tệp bằng cách lưu trữ dữ liệu được tham chiếu bởi một hàm băm (nhiều tệp có thể tham chiếu cùng một dữ liệu tệp). Sẽ rất dễ dàng để sao lưu đồng bộ hóa cơ sở dữ liệu tệp bằng rsync.

Ngoài ra, các hạn chế của một thư mục nhất định chứa nhiều tệp sẽ bị loại bỏ.

Phần mở rộng tệp sẽ được lưu trữ như một phần của tệp băm duy nhất. Ví dụ:nếu băm cho một tệp trống là abcd8765 ... Một .txt trống tệp và trống .php tệp sẽ tham chiếu đến cùng một băm. Thay vào đó, họ nên tham khảo abcd8765.phpabcd8765.txt . Tại sao?

Apache, v.v. có thể được định cấu hình để tự động chọn loại nội dung và quy tắc bộ nhớ đệm dựa trên phần mở rộng tệp. Điều quan trọng là phải lưu trữ các tệp có tên hợp lệ và phần mở rộng phản ánh nội dung của tệp.

Bạn thấy đấy, hệ thống này thực sự có thể tăng hiệu suất bằng cách ủy quyền phân phối tệp thông qua nginx. Xem http://wiki.nginx.org/XSendfile .

Tôi hy vọng việc này sẽ có ích trong vài trường hợp. Cẩn thận.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gán xml được tạo bởi vòng lặp while cho một biến

  2. Sử dụng dấu thời gian (hoặc ngày giờ) như một phần của khóa chính (hoặc một phần của chỉ mục được phân nhóm)

  3. Các vấn đề gặp phải với kiểu dữ liệu int (11) trong MYSQL

  4. Làm thế nào để hiển thị các truy vấn cuối cùng được thực thi trên MySQL?

  5. Lỗi datetime Mysql DEFAULT CURRENT_TIMESTAMP