
Hurmatli hamjamiyat, ushbu maqola yuz millionlab kichik fayllarni samarali saqlash va olishga qaratilgan. Ushbu bosqichda yakuniy yechim POSIX-mos keluvchi fayl tizimlari uchun blokirovkalarni, shu jumladan klaster qulflarini to'liq qo'llab-quvvatlaydigan va hatto tayoqchalarsiz ham taklif etiladi.
Shu maqsadda men o'z shaxsiy serverimni yozdim.
Ushbu vazifani amalga oshirish jarayonida biz asosiy muammoni hal qilishga muvaffaq bo'ldik va shu bilan birga disk maydoni va operativ xotirani tejashga erishdik, bu bizning klaster fayl tizimimiz shafqatsizlarcha iste'mol qiladi. Aslida, bunday fayllar soni har qanday klasterli fayl tizimi uchun zararli.
Fikr bu:
Oddiy qilib aytganda, kichik fayllar server orqali yuklanadi, ular to'g'ridan-to'g'ri arxivga saqlanadi, shuningdek undan o'qiladi va katta fayllar yonma-yon joylashtiriladi. Sxema: 1 papka = 1 arxiv, jami bizda bir necha yuz million fayl emas, kichik fayllar bilan bir necha million arxiv mavjud. Va bularning barchasi hech qanday skriptlarsiz yoki fayllarni tar/zip arxivlariga joylashtirmasdan to'liq amalga oshiriladi.
Qisqa qilib yozishga harakat qilaman, agar post uzun bo'lsa oldindan uzr so'rayman.
Hammasi HTTP protokoli orqali olingan ma'lumotlarni to'g'ridan-to'g'ri arxivlarga saqlashi mumkin bo'lgan, an'anaviy arxivlar va ob'ektlarni saqlashga xos kamchiliklarsiz dunyoda mos serverni topa olmaganimdan boshlandi. Qidiruvning sababi 10 250,000,000 XNUMX ta kichik fayllar to'plangan va o'sish tendentsiyasi to'xtab qolmaydigan katta miqyosga etgan XNUMX ta serverdan iborat Origin klasteri edi.
Maqolalarni o'qishni yoqtirmaydiganlar uchun ozgina hujjatlashtirish osonroq:
и .
Va bir vaqtning o'zida docker, endi faqat ichida nginx bilan variant mavjud:
docker run -d --restart=always -e host=localhost -e root=/var/storage
-v /var/storage:/var/storage --name wzd -p 80:80 eltaline/wzdKeyingi:
Agar fayllar ko'p bo'lsa, muhim resurslar kerak bo'ladi va eng yomoni, ularning ba'zilari isrof bo'ladi. Masalan, klasterli fayl tizimidan foydalanilganda (bu holda MooseFS) fayl, uning haqiqiy hajmidan qat'i nazar, har doim kamida 64 KB ni egallaydi. Ya'ni, 3, 10 yoki 30 KB hajmdagi fayllar uchun diskda 64 KB talab qilinadi. Agar chorak milliard fayl bo'lsa, biz 2 dan 10 terabaytgacha yo'qotamiz. Yangi fayllarni cheksiz yaratish mumkin bo'lmaydi, chunki MooseFS cheklovga ega: har bir faylning bitta nusxasi bilan 1 milliarddan ortiq emas.
Fayllar soni ortib borayotganligi sababli, metadata uchun juda ko'p RAM kerak bo'ladi. Tez-tez katta hajmdagi metama'lumotlar yig'indilari ham SSD disklarining eskirishiga yordam beradi.
wZD serveri. Disklardagi narsalarni tartibga solamiz.
Server Go-da yozilgan. Avvalo, men fayllar sonini kamaytirishim kerak edi. Buni qanday qilish kerak? Arxivlash tufayli, lekin bu holda siqilishsiz, chunki mening fayllarim shunchaki siqilgan rasmlardir. BoltDB yordamga keldi, uni hali ham kamchiliklarini bartaraf etish kerak edi, bu hujjatlarda aks ettirilgan.
Hammasi bo'lib, chorak milliard fayl o'rniga, mening holimda atigi 10 million Bolt arxivi qoldi. Agar joriy katalog fayl tuzilishini o'zgartirish imkoniyati bo'lsa, uni taxminan 1 million faylga qisqartirish mumkin edi.
Barcha kichik fayllar Bolt arxivlariga joylashtirilgan, ular joylashgan kataloglarning nomlarini avtomatik ravishda oladi va barcha katta fayllar arxivlar yonida qoladi, ularni o'rashning ma'nosi yo'q, buni sozlash mumkin; Kichiklari arxivlanadi, kattalari o'zgarishsiz qoladi. Server ikkalasi bilan ham shaffof ishlaydi.
wZD serverining arxitekturasi va xususiyatlari.

Server operatsion tizimlar nazorati ostida ishlaydi Linux, BSD, Solaris va OSX. Men faqat AMD64 arxitekturasi uchun sinovdan o'tkazdim Linux, lekin u ARM64, PPC64, MIPS64 uchun ham ishlashi kerak.
Asosiy xususiyatlar:
- Ko'p ish zarralari;
- Nosozliklarga chidamlilik va yukni muvozanatlashni ta'minlovchi multiserver;
- Foydalanuvchi yoki ishlab chiquvchi uchun maksimal shaffoflik;
- Qo'llab-quvvatlanadigan HTTP usullari: GET, HEAD, PUT va DELETE;
- Mijoz sarlavhalari orqali o'qish va yozish xatti-harakatlarini nazorat qilish;
- Moslashuvchan virtual xostlarni qo'llab-quvvatlash;
- Yozish/o'qish paytida CRC ma'lumotlarining yaxlitligini qo'llab-quvvatlash;
- Minimal xotira iste'moli va tarmoqning optimal ishlashini sozlash uchun yarim dinamik buferlar;
- Kechiktirilgan ma'lumotlarni siqish;
- Bundan tashqari, xizmatni to'xtatmasdan fayllarni ko'chirish uchun wZA ko'p tarmoqli arxivatori taklif etiladi.
Haqiqiy tajriba:
Men uzoq vaqt davomida server va arxivatorni jonli ma'lumotlarda ishlab chiqdim va sinab ko'rdim, endi u alohida SATA drayvlarida 250,000,000 15,000,000 10 katalogda joylashgan 2 2 XNUMX ta kichik fayllarni (rasmlarni) o'z ichiga olgan klasterda muvaffaqiyatli ishlamoqda. XNUMX ta serverdan iborat klaster CDN tarmog'i orqasida o'rnatilgan Origin serveridir. Unga xizmat ko'rsatish uchun XNUMX ta Nginx server + XNUMX wZD server ishlatiladi.
Ushbu serverdan foydalanishga qaror qilganlar uchun, agar mavjud bo'lsa, foydalanishdan oldin katalog tuzilishini rejalashtirish oqilona bo'ladi. Menga darhol band qilishimga ruxsat bering, server hamma narsani 1 Bolt arxiviga to'plash uchun mo'ljallanmagan.
Ishlash testi:
Ziplangan fayl hajmi qanchalik kichik bo'lsa, unda GET va PUT operatsiyalari shunchalik tez bajariladi. Keling, HTTP mijozini oddiy fayllar va Bolt arxivlariga yozish, shuningdek o'qish uchun umumiy vaqtni solishtiraylik. 32 KB, 256 KB, 1024 KB, 4096 KB va 32768 KB hajmdagi fayllar bilan ishlash taqqoslanadi.
Bolt arxivlari bilan ishlashda har bir faylning ma'lumotlar yaxlitligi tekshiriladi (CRC ishlatiladi), yozib olishdan oldin, shuningdek yozib olishdan so'ng, tez o'qish va qayta hisoblash sodir bo'ladi, bu tabiiy ravishda kechikishlarni keltirib chiqaradi, ammo asosiysi ma'lumotlar xavfsizligi.
Men SSD drayverlarida ishlash testlarini o'tkazdim, chunki SATA drayverlaridagi testlar aniq farqni ko'rsatmaydi.
Sinov natijalariga asoslangan grafikalar:


Ko'rib turganingizdek, kichik fayllar uchun arxivlangan va arxivlanmagan fayllar o'rtasidagi o'qish va yozish vaqtlari farqi kichik.
32 MB hajmdagi fayllarni o'qish va yozishni sinab ko'rishda biz butunlay boshqacha rasmga ega bo'lamiz:

Fayllarni o'qish o'rtasidagi vaqt farqi 5-25 ms oralig'ida. Yozish bilan ishlar yomonroq, farq taxminan 150 ms. Ammo bu holda katta fayllarni yuklashning hojati yo'q, ular arxivlardan alohida yashashlari mumkin;
*Texnik jihatdan siz ushbu serverdan NoSQL talab qilinadigan vazifalar uchun foydalanishingiz mumkin.
wZD serveri bilan ishlashning asosiy usullari:
Oddiy fayl yuklanmoqda:
curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpgBolt arxiviga faylni yuklash (agar arxivga kiritilishi mumkin bo'lgan maksimal fayl hajmini belgilovchi fmaxsize server parametri oshib ketmasa; agar u oshib ketgan bo'lsa, fayl odatdagidek arxiv yoniga yuklanadi):
curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpgFaylni yuklab olish (agar diskda va arxivda bir xil nomdagi fayllar mavjud bo'lsa, yuklab olishda ustunlik sukut bo'yicha arxivlanmagan faylga beriladi):
curl -o test.jpg http://localhost/test/test.jpgBolt arxividan faylni yuklab olish (majburiy):
curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpgBoshqa usullarning tavsiflari hujjatlarda.
Server hozircha faqat HTTP protokolini qo'llab-quvvatlaydi; u hali HTTPS bilan ishlamaydi. POST usuli ham qo'llab-quvvatlanmaydi (u kerakmi yoki yo'qmi hali hal qilinmagan).
Kimki manba kodini qazib olsa, u erda sariyog 'topadi, hamma ham buni yoqtirmaydi, lekin men asosiy kodni veb-ramkaning funktsiyalariga bog'lamadim, uzilishni ishlov beruvchidan tashqari, shuning uchun kelajakda men uni deyarli har qanday dastur uchun tezda qayta yozishim mumkin. dvigatel.
Qilmoq:
- Klaster fayl tizimlarisiz katta tizimlarda foydalanish imkoniyati uchun o'zingizning replikator va distribyutoringizni + geoni ishlab chiqish (Hammasi kattalar uchun)
- Agar metadata butunlay yo'qolgan bo'lsa, uni to'liq teskari tiklash imkoniyati (agar distributordan foydalanilgan bo'lsa)
- Doimiy tarmoq ulanishlari va turli dasturlash tillari uchun drayverlardan foydalanish qobiliyati uchun mahalliy protokol
- NoSQL komponentidan foydalanish uchun kengaytirilgan imkoniyatlar
- Bolt arxivlari ichidagi fayllar yoki qiymatlar va oddiy fayllar uchun har xil turdagi siqishlar (gzip, zstd, snappy)
- Bolt arxivlari ichidagi fayllar yoki qiymatlar va oddiy fayllar uchun har xil turdagi shifrlash
- Kechiktirilgan server tomonidagi video konvertatsiya, shu jumladan GPUda
Menda hamma narsa bor, umid qilamanki, bu server kimgadir foydali bo'ladi, BSD-3 litsenziyasi, ikki tomonlama mualliflik huquqi, chunki men ishlayotgan kompaniya bo'lmaganida, server yozilmagan bo'lardi. Men yagona ishlab chiquvchiman. Siz topgan har qanday xato va xususiyat so'rovlari uchun minnatdor bo'laman.
Manba: www.habr.com
