हमारे पास 30,000+ फ़ाइलों और अब तक 20+ जीबी के साथ भारी उत्पादन में ऐसा सिस्टम है...
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")
फ़ाइलों को फ़ाइल के नाम के रूप में पूर्णांक File_ID के साथ केवल एक निर्देशिका में संग्रहीत किया जाता है। हम बिना किसी समस्या के 30,000 से अधिक हैं। मैंने बिना किसी समस्या के उच्च परीक्षण किया है।
यह फ़ाइल सिस्टम के रूप में ext3 के साथ RHEL 5 x86_64 का उपयोग कर रहा है।
क्या मैं इसे फिर से इस तरह से करूंगा? नहीं। मुझे एक नया स्वरूप पर कुछ विचार साझा करने दें।
-
डेटाबेस अभी भी फाइलों पर जानकारी का "मास्टर स्रोत" है।
-
प्रत्येक फ़ाइल sha1() हैश के आधार पर फ़ाइल सिस्टम पदानुक्रम में हैश और संग्रहीत है:
/FileData/ab/cd/abcd4548293827394723984723432987.jpg
-
डेटाबेस प्रत्येक फ़ाइल पर मेटा-सूचना संग्रहीत करने के बारे में थोड़ा अधिक स्मार्ट है। यह तीन टेबल वाला सिस्टम होगा:
File
:नाम, दिनांक, आईपी, स्वामी, और एक ब्लॉब (sha1) के लिए एक सूचक जैसी जानकारी संग्रहीत करता हैFile_Meta
:फ़ाइल के प्रकार के आधार पर फ़ाइल पर कुंजी/मान जोड़े संग्रहीत करता है। इसमें Image_Width, आदि जैसी जानकारी शामिल हो सकती है...Blob
:sha1 का संदर्भ उसके आकार के साथ संग्रहीत करता है।
यह सिस्टम हैश द्वारा संदर्भित डेटा को संग्रहीत करके फ़ाइल सामग्री को डी-डुप्लिकेट करेगा (एकाधिक फ़ाइलें एक ही फ़ाइल डेटा को संदर्भित कर सकती हैं)। rsync का उपयोग करके फ़ाइल डेटाबेस को बैकअप सिंक करना बहुत आसान होगा।
साथ ही, बहुत सारी फाइलों वाली किसी निर्देशिका की सीमाएं समाप्त कर दी जाएंगी।
फ़ाइल एक्सटेंशन को अद्वितीय फ़ाइल हैश के भाग के रूप में संग्रहीत किया जाएगा। उदाहरण के लिए, यदि किसी खाली फ़ाइल का हैश abcd8765
. था ... एक खाली .txt
फ़ाइल और खाली .php
फ़ाइल उसी हैश को संदर्भित करेगी। बल्कि, उन्हें abcd8765.php
. का संदर्भ लेना चाहिए और abcd8765.txt
. क्यों?
फ़ाइल एक्सटेंशन के आधार पर सामग्री प्रकार और कैशिंग नियमों को स्वचालित रूप से चुनने के लिए अपाचे, आदि को कॉन्फ़िगर किया जा सकता है। फ़ाइलों को एक वैध नाम और एक्सटेंशन के साथ संग्रहीत करना महत्वपूर्ण है जो फ़ाइल की सामग्री को दर्शाता है।
आप देखें, यह प्रणाली वास्तव में nginx के माध्यम से फ़ाइल वितरण को प्रत्यायोजित करके प्रदर्शन को बढ़ावा दे सकती है। देखें http://wiki.nginx.org/XSendfile ।
मुझे उम्मीद है कि यह किसी तरह मदद करता है। ध्यान रखना।