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.
-
Cơ sở dữ liệu vẫn là "nguồn chính" của thông tin trên các tệp.
-
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
-
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.php
và abcd8765.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.