
عزيزي المجتمع ، سوف تركز هذه المقالة على التخزين الفعال وتسليم مئات الملايين من الملفات الصغيرة. في هذه المرحلة ، يُقترح الحل النهائي لأنظمة الملفات المتوافقة مع POSIX مع الدعم الكامل للأقفال ، بما في ذلك الأقفال العنقودية ، وحتى بدون العكازات.
لذلك ، لهذا الغرض كتبت الخادم الخاص بي.
خلال هذه المهمة ، كان من الممكن حل المشكلة الرئيسية ، على طول الطريق لتوفير مساحة على القرص وذاكرة الوصول العشوائي ، والتي استهلكها نظام ملفات نظامنا بلا رحمة. في الواقع ، مثل هذا العدد من الملفات ضار بأي نظام ملفات متفاوت المسافات.
الفكرة هي:
وبكلمات بسيطة ، يتم تحميل الملفات الصغيرة من خلال الخادم ، ويتم حفظها مباشرة في الأرشيف ، ويمكن قراءتها أيضًا ، ويتم وضع الملفات الكبيرة في مكان قريب. مخطط: 1 مجلد = 1 أرشيف ، إجمالي لدينا عدة ملايين من الأرشيفات مع ملفات صغيرة ، وليس عدة مئات من ملايين الملفات. وكل هذا يتم تنفيذه بالكامل ، دون أي برامج نصية وتحلل الملفات في أرشيفات tar / zip.
سأحاول جعلها أقصر ، أعتذر مقدمًا عما إذا كانت المشاركة ستكون رحيب.
بدأ كل شيء بحقيقة أنني لم أتمكن من العثور على خادم مناسب في العالم يمكنه حفظ البيانات التي تم تلقيها عبر بروتوكول HTTP مباشرة إلى الأرشيف ، بحيث لم تكن هناك عيوب متأصلة في الأرشيفات العادية ومستودعات الكائنات. وكان سبب البحث هو مجموعة من 10 خوادم نمت إلى أصل كبير الحجم ، والتي تراكمت عليها بالفعل 250.000.000 ملف صغير ، ولن يتوقف اتجاه النمو.
أولئك الذين لا يحبون قراءة المقالات والوثائق الصغيرة أسهل:هنا و
هنا .
التحديث. إزالة nginx من صورة عامل ميناء.والرسو في نفس الوقت:
docker run -d --restart=always -e bindaddr=127.0.0.1:9699 \ -e host=localhost -e root=/var/storage -v /var/storage:/var/storage --name wzd \ -p 80:9699 eltaline/wzd
التالي:
التحديث. في الإصدار 1.1.0 ، ظهرت بالفعل طريقة مصادقة HTTPS / POST / IP وما إلى ذلك.إذا كان هناك الكثير من الملفات ، فهناك حاجة إلى موارد كبيرة ، والأهم من ذلك هو إهدار بعضها. على سبيل المثال ، عند استخدام نظام ملفات متفاوت المسافات (في هذه الحالة ، MooseFS) ، يستغرق الملف ، بغض النظر عن الحجم الفعلي ، دائمًا 64 كيلو بايت على الأقل. وهذا يعني ، للملفات من 3 أو 10 أو 30 كيلو بايت في الحجم ، مطلوب 64 كيلو بايت على القرص. إذا كان ربع مليار ملف ، فإننا نفقد 2 إلى 10 تيرابايت. لن يكون من الممكن إنشاء ملفات جديدة لا حصر لها نظرًا لوجود قيود في MooseFS نفسها: لا يوجد أكثر من مليار نسخة متماثلة واحدة لكل ملف.
كلما زاد عدد الملفات ، فأنت بحاجة إلى الكثير من ذاكرة الوصول العشوائي للبيانات الوصفية. وتسهم مقالب البيانات الشرحية الكبيرة المتكررة أيضًا في تآكل محركات أقراص الحالة الصلبة.
خادم WZD. نضع الأقراص بالترتيب.الخادم مكتوب في Go. بادئ ذي بدء ، كنت بحاجة لتقليل عدد الملفات. كيف نفعل ذلك؟ نظرًا للأرشفة ، لكن في هذه الحالة دون ضغط ، نظرًا لأن ملفاتي صور ثابتة ومقطوعة. جاء BoltDB إلى الإنقاذ ، الذي لا يزال يتعين حرمانه من العيوب ، وهذا ينعكس في الوثائق.
في المجموع ، بدلاً من ربع مليار ملف ، في حالتي ، لم يتبق سوى 10 ملايين من سجلات بولت. إذا أتيحت لي الفرصة لتغيير الهيكل الحالي لملء ملفات الدليل ، فسيكون من الممكن تقليل عدد الملفات إلى حوالي مليون ملف.
يتم تجميع جميع الملفات الصغيرة في أرشيفات Bolt ، وتلقي أسماء الدلائل التي توجد بها تلقائيًا ، وتظل جميع الملفات الكبيرة جنبًا إلى جنب مع المحفوظات ، ولا معنى لتعبئتها ، وهذا قابل للتخصيص. صغير - أرشيف ، كبير - يترك دون تغيير. الخادم يعمل بشفافية مع كليهما.
الهندسة المعمارية وميزات خادم wZD.
يقوم الخادم بتشغيل Linux و BSD و Solaris و OSX. لقد قمت باختبار بنية AMD64 فقط في نظام Linux ، لكن يجب أن تكون مناسبة أيضًا لـ ARM64 و PPC64 و MIPS64.
الميزات الرئيسية:- خاصية تعدد.
- متعدد الخادم ، وتوفير التسامح مع الخطأ وموازنة الحمل ؛
- الشفافية القصوى للمستخدم أو المطور ؛
- أساليب HTTP المدعومة: GET ، HEAD ، PUT و DELETE ؛
- إدارة سلوك القراءة والكتابة من خلال رؤوس العملاء ؛
- دعم المضيفين الظاهري للتخصيص.
- دعم سلامة البيانات CRC عند الكتابة / القراءة ؛
- مخازن مؤقتة ديناميكية للحد الأدنى من استهلاك الذاكرة والضبط الأمثل لأداء الشبكة ؛
- تأخر ضغط البيانات
- بالإضافة إلى ذلك ، يتم تقديم أرشيف ملفات wZA متعدد الخيوط لترحيل الملفات دون إيقاف الخدمة.
تجربة حقيقية:لقد قمت بتطوير واختبار الخادم وأرشيف الملفات على بيانات حية لفترة طويلة ، والآن يعمل بنجاح على مجموعة تضم 250،000،000 ملف صغير (صور) موجودة في 15،000،000 دليل على أقراص SATA منفصلة. مجموعة من 10 خوادم هي خادم Origin مثبت خلف شبكة CDN. لصيانتها ، يتم استخدام خوادم Nginx + 2 wZD.
بالنسبة لأولئك الذين يقررون استخدام هذا الخادم ، فمن المنطقي تخطيط بنية الدليل قبل الاستخدام ، إن أمكن. قم بإجراء حجز على الفور بأن الخادم غير مصمم لدفع كل شيء في أرشيف 1 Bolt.
اختبار الأداء:أصغر حجم الملف المؤرشفة ، وأسرع يتم تنفيذ عمليات GET و PUT على ذلك. قارن إجمالي الوقت الذي يكتبه عميل HTTP بالملفات العادية وأرشيفات Bolt ، وكذلك القراءة. يقارن العمل مع الملفات 32 كيلو بايت و 256 كيلو بايت و 1024 كيلو بايت و 4096 كيلو بايت و 32768 كيلو بايت في الحجم.
عند العمل مع أرشيفات Bolt ، يتم التحقق من سلامة بيانات كل ملف (يتم استخدام CRC) ، قبل الكتابة وأيضًا بعد الكتابة ، يتم إجراء القراءة بسرعة وتحديث ، وهذا يؤدي بطبيعة الحال إلى حدوث تأخير ، ولكن الشيء الرئيسي هو أمان البيانات.
لقد أجريت اختبارات الأداء على محركات أقراص الحالة الصلبة ، حيث إن اختبارات SATA لا تظهر فرقًا واضحًا على أقراص SATA.
تحديث (الإصدار 1.1.0) ، وتحسين الأداء بنسبة 5-25 ٪.الرسوم البيانية بناء على نتائج الاختبار:

كما ترون ، بالنسبة للملفات الصغيرة ، فإن الفرق في وقت القراءة والكتابة بين الملفات المؤرشفة وغير المؤرشفة صغير.
سنحصل على صورة مختلفة تمامًا مع اختبار قراءة وكتابة ملفات 32 ميغابايت:

الفارق الزمني بين قراءة الملفات في غضون 5-25 مللي ثانية. مع التسجيل ، الأمور أسوأ ، الفرق هو حوالي 150 مللي ثانية. لكن في هذه الحالة ، لا يشترط تحميل الملفات الكبيرة ، وهذا ببساطة غير منطقي ، حيث يمكنهم العيش بشكل منفصل عن الأرشيف.
* من الناحية الفنية ، يمكن أيضًا استخدام هذا الخادم للمهام التي تتطلب NoSQL.
الطرق الأساسية للعمل مع خادم wZD:تحميل الملف العادي:
curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpg
تحميل ملف إلى أرشيف Bolt (إذا لم يتم تجاوز معلمة الخادم fmaxsize ، مما يحدد الحد الأقصى لحجم الملف الذي يمكن تضمينه في الأرشيف ، وإذا تم تجاوزه ، فسيتم تحميل الملف كالمعتاد بجوار الأرشيف):
curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpg
تنزيل ملف (إذا كانت هناك ملفات تحمل الاسم نفسه على القرص وفي الأرشيف ، عند التنزيل ، يتم إعطاء الأولوية الافتراضية للملف الذي تم فك ضغطه):
curl -o test.jpg http://localhost/test/test.jpg
تنزيل ملف من أرشيف بولت (القسري):
curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpg
وصف الطرق الأخرى في الوثائق.
وثائق WZDوثائق WZAخادم يدعم HTTP فقط حتى الآن ، لا يعمل مع HTTPS حتى الآن. طريقة POST غير مدعومة أيضًا (لم يتم تحديد ما إذا كانت ضرورية أم لا).
من يجد الخوض في الكود المصدري سيجد حلويات هناك ، لا يحبها الجميع ، لكنني لم ألزم الكود الرئيسي بوظائف إطار عمل الويب ، باستثناء معالج المقاطعة ، بحيث يمكنني في المستقبل إعادة الكتابة بسرعة لأي محرك.
تودو:- تطوير جهاز النسخ المتماثل والموزع + geo الخاصين بنا لإمكانية استخدامه في الأنظمة الكبيرة دون وجود مجموعات FS (جميعها للبالغين)
- القدرة على عكس استعادة البيانات الوصفية بالكامل عند فقدها بالكامل (في حالة استخدام موزع)
- بروتوكول أصلي لإمكانية استخدام اتصالات الشبكة الدائمة وبرامج التشغيل للغات البرمجة المختلفة
- ميزات متقدمة لاستخدام مكون NoSQL
- ضغطات من أنواع مختلفة (gzip ، zstd ، snappy) للملفات أو القيم داخل أرشيفات Bolt والملفات العادية
- تشفير أنواع مختلفة للملفات أو القيم داخل أرشيفات بولت والملفات العادية
- تأخر تحويل خادم الفيديو ، بما في ذلك GPU
هذا كل شيء ، آمل أن يكون هذا الخادم مفيدًا لشخص ما ، رخصة BSD-3 ، حقوق الطبع والنشر المزدوجة ، حيث لن تكون هناك شركة أعمل فيها ، فلن أكتب خادمًا أيضًا. أنا مطور في صيغة المفرد. سأكون ممتنا للبق وجدت وطلبات الميزة.