Éfisién nyimpen ratusan juta file leutik. Leyuran Self-Hosted

Éfisién nyimpen ratusan juta file leutik. Leyuran Self-Hosted

Komunitas anu dihormat, Tulisan ieu bakal museurkeun kana éfisién nyimpen sareng nyandak ratusan juta file leutik. Dina tahap ieu, solusi ahir diajukeun pikeun sistem file anu cocog sareng POSIX kalayan dukungan pinuh pikeun konci, kalebet konci klaster, sareng sigana tanpa kruk.

Janten kuring nyerat server khusus kuring sorangan pikeun tujuan ieu.
Dina ngalaksanakeun tugas ieu, urang junun ngabéréskeun masalah utama, sarta dina waktos anu sareng ngahontal tabungan dina spasi disk jeung RAM, nu sistem file klaster urang ieu mercilessly consuming. Sabenerna, sajumlah file sapertos kitu ngabahayakeun pikeun sistem file clustered.

Ide na nyaéta kieu:

Dina kecap basajan, file leutik diunggah ngaliwatan server, aranjeunna disimpen langsung kana arsip, sarta ogé maca ti dinya, sarta file badag disimpen samping ku samping. Skéma: 1 folder = 1 arsip, jumlahna aya sababaraha juta arsip sareng file leutik, sareng sanés sababaraha ratus juta file. Sareng sadaya ieu dilaksanakeun sapinuhna, tanpa naskah atanapi nempatkeun file kana arsip tar / zip.

Abdi badé nyobian pondokna, hapunten sateuacanna upami tulisanna panjang.

Éta sadayana dimimitian ku kanyataan yén kuring henteu tiasa mendakan server anu cocog di dunya anu tiasa nyimpen data anu ditampi via protokol HTTP langsung kana arsip, tanpa kalemahan anu aya dina arsip konvensional sareng neundeun obyék. Sareng alesan pikeun milarian éta klaster Asal tina 10 server anu parantos ningkat kana skala ageung, dimana 250,000,000 file alit parantos akumulasi, sareng tren pertumbuhan henteu bakal lirén.

Pikeun anu henteu resep maca tulisan, sakedik dokuméntasi langkung gampang:

di dieu и di dieu.

Sareng docker dina waktos anu sami, ayeuna aya pilihan ngan ukur nginx di jero bisi:

docker run -d --restart=always -e host=localhost -e root=/var/storage 
-v /var/storage:/var/storage --name wzd -p 80:80 eltaline/wzd

salajengna:

Upami aya seueur file, peryogi sumber daya anu penting, sareng anu paling parah nyaéta sababaraha di antarana dibuang. Contona, nalika ngagunakeun sistem file clustered (dina hal ieu, MooseFS), file, paduli ukuran sabenerna, salawasna nyokot sahenteuna 64 KB. Nyaéta, pikeun file anu ukuranana 3, 10 atanapi 30 KB, 64 KB diperyogikeun dina disk. Upami aya saparapat milyar file, urang leungit tina 2 dugi ka 10 terabyte. Teu mungkin nyieun file anyar salamina, saprak MooseFS boga watesan: teu leuwih ti 1 milyar kalawan hiji réplika unggal file.

Salaku jumlah file naek, loba RAM diperlukeun pikeun metadata. Sering dumps metadata badag ogé nyumbang kana maké jeung cimata drive SSD.

server wZD. Urang nempatkeun hal dina urutan dina disk.

Server ditulis dina Go. Anu mimiti, kuring kedah ngirangan jumlah file. Kumaha cara ngalakukeunana? Alatan archiving, tapi dina hal ieu tanpa komprési, saprak file abdi ngan gambar dikomprés. BoltDB sumping ka nyalametkeun, nu masih kudu ngaleungitkeun tina shortcomings na, ieu reflected dina dokuméntasi.

Dina total, tinimbang saparapat miliar file, bisi kuring ngan aya 10 juta arsip Bolt ditinggalkeun. Upami kuring ngagaduhan kasempetan pikeun ngarobih struktur file diréktori ayeuna, éta bakal tiasa diréduksi janten kirang langkung 1 juta file.

Sadaya file alit dipak kana arsip Bolt, anu otomatis nampi nami diréktori tempatna, sareng sadaya file ageung tetep aya di gigireun arsip; teu aya gunana pikeun ngabungkus aranjeunna, ieu tiasa disaluyukeun. Anu leutik diarsipkeun, anu ageung diantep. server jalan transparan kalawan duanana.

Arsitéktur sareng fitur tina server wZD.

Éfisién nyimpen ratusan juta file leutik. Leyuran Self-Hosted

Server beroperasi dina sistem operasi Linux, BSD, Solaris sareng OSX. Kuring ukur diuji pikeun arsitéktur AMD64 dina Linux, tapi kedah dianggo pikeun ARM64, PPC64, MIPS64.

Fitur utama:

  • Multithreading;
  • Multiserver, nyadiakeun kasabaran sesar jeung beban balancing;
  • Transparansi maksimal pikeun pangguna atanapi pamekar;
  • Métode HTTP anu dirojong: GET, HEAD, PUT sareng DELETE;
  • Kontrol paripolah maca sareng nyerat ngalangkungan lulugu klien;
  • Rojongan pikeun host virtual fléksibel;
  • Ngarojong integritas data CRC nalika nulis / maca;
  • panyangga semi-dinamis pikeun konsumsi memori minimal sareng tuning kinerja jaringan optimal;
  • compaction data nunggak;
  • Salaku tambahan, wZA archiver multi-threaded ditawarkeun pikeun migrasi file tanpa ngeureunkeun jasa.

Pangalaman Nyata:

Kuring geus ngembang sarta nguji server na archiver on data hirup keur rada lila, ayeuna geus hasil operasi dina klaster nu ngawengku 250,000,000 file leutik (gambar) lokasina di 15,000,000 directories on misah drive Kang Tata. Kluster 10 server mangrupikeun server Asal anu dipasang di tukangeun jaringan CDN. Pikeun ngalayanan éta, 2 server Nginx + 2 server wZD dianggo.

Pikeun anu mutuskeun pikeun ngagunakeun server ieu, langkung sae pikeun ngarencanakeun struktur diréktori, upami tiasa dianggo, sateuacan dianggo. Hayu atuh nyieun reservasi katuhu jauh yén server teu dimaksudkeun pikeun cram sagalana kana arsip 1 Bolt.

Uji kinerja:

Ukuran file anu langkung alit, langkung gancang GET sareng PUT operasi dilaksanakeun di dinya. Hayu urang ngabandingkeun total waktu nulis klien HTTP kana file biasa na arsip Bolt, kitu ogé maca. Gawé sareng file ukuranana 32 KB, 256 KB, 1024 KB, 4096 KB sareng 32768 KB dibandingkeun.

Nalika damel sareng arsip Bolt, integritas data unggal file dipariksa (CRC dianggo), sateuacan ngarékam sareng ogé saatos ngarékam, bacaan sareng recalculation on-the-fly lumangsung, ieu sacara alami ngenalkeun telat, tapi hal utama nyaéta kaamanan data.

Kuring ngalaksanakeun tés kinerja dina drive SSD, sabab tés dina drive SATA henteu nunjukkeun bédana anu jelas.

Grafik dumasar kana hasil tés:

Éfisién nyimpen ratusan juta file leutik. Leyuran Self-Hosted
Éfisién nyimpen ratusan juta file leutik. Leyuran Self-Hosted

Sakumaha anjeun tiasa tingali, pikeun file leutik bédana waktos maca sareng nyerat antara file anu diarsipkeun sareng anu henteu diarsipkeun.

Kami kéngingkeun gambar anu béda-béda nalika nguji maca sareng nyerat file ukuranana 32 MB:

Éfisién nyimpen ratusan juta file leutik. Leyuran Self-Hosted

Beda waktos antara maca file dina 5-25 mdet. Kalayan ngarékam, hal-hal langkung parah, bédana sakitar 150 ms. Tapi dina hal ieu, teu kedah unggah file ageung; teu aya gunana pikeun ngalakukeunana; aranjeunna tiasa hirup misah ti arsip.

* Sacara téknis, anjeun tiasa nganggo pangladén ieu pikeun tugas anu ngabutuhkeun NoSQL.

Métode dasar pikeun damel sareng server wZD:

Ngamuat file biasa:

curl -X PUT --data-binary @test.jpg http://localhost/test/test.jpg

Unggah file kana arsip Bolt (upami parameter server fmaxsize, anu nangtukeun ukuran file maksimal anu tiasa dilebetkeun kana arsip, henteu ngaleuwihan; upami ngaleuwihan, file bakal diunggah sapertos biasa di gigireun arsip):

curl -X PUT -H "Archive: 1" --data-binary @test.jpg http://localhost/test/test.jpg

Ngundeur file (upami aya file sareng nami anu sami dina disk sareng dina arsip, teras nalika diunduh, prioritas dipasihkeun sacara standar kana file anu henteu diarsipkeun):

curl -o test.jpg http://localhost/test/test.jpg

Ngundeur file tina arsip Bolt (dipaksa):

curl -o test.jpg -H "FromArchive: 1" http://localhost/test/test.jpg

Katerangan ngeunaan métode séjénna aya dina dokuméntasi.

wZD Dokuméntasi
wZA Dokuméntasi

Pangladén ayeuna ngan ukur ngadukung protokol HTTP; éta henteu acan tiasa dianggo sareng HTTPS. Metodeu POST ogé henteu didukung (teu acan diputuskeun naha diperyogikeun atanapi henteu).

Saha waé anu ngagali kodeu sumber bakal mendakan butterscotch di dinya, henteu sadayana resep, tapi kuring henteu ngaitkeun kodeu utama kana fungsi kerangka wéb, kecuali panangan interupsi, janten ka hareup kuring tiasa gancang nyerat deui pikeun ampir sadayana. mesin.

ToDo:

  • Ngembangkeun réplikator sareng distributor anjeun sorangan + geo pikeun kamungkinan dianggo dina sistem ageung tanpa sistem file klaster (Sadayana pikeun déwasa)
  • Kamungkinan pamulihan balik lengkep metadata upami éta leungit lengkep (upami nganggo distributor)
  • Protokol asli pikeun kamampuan ngagunakeun sambungan jaringan sareng supir anu tetep pikeun basa program anu béda
  • Kamungkinan canggih pikeun ngagunakeun komponén NoSQL
  • Komprési tina sababaraha jinis (gzip, zstd, snappy) pikeun file atanapi nilai di jero arsip Bolt sareng file biasa
  • Enkripsi tina sababaraha jinis pikeun file atanapi nilai di jero arsip Bolt sareng file biasa
  • Konversi pidéo sisi server ditunda, kalebet dina GPU

Kuring boga sagalana, Kuring miharep server ieu bakal mangpaat keur batur, lisénsi BSD-3, hak cipta ganda, saprak lamun aya euweuh parusahaan tempat kuring gawe, server moal bakal geus ditulis. Kami hiji-hijina pamekar. Abdi nganuhunkeun pikeun sagala bug sareng pamundut fitur anu anjeun mendakan.

sumber: www.habr.com

Tambahkeun komentar