Олон зуун сая жижиг файлуудыг үр дүнтэй хадгал. Өөрөө байршуулсан шийдэл

Олон зуун сая жижиг файлуудыг үр дүнтэй хадгал. Өөрөө байршуулсан шийдэл

Эрхэм хамт олон, Энэ нийтлэл нь олон зуун сая жижиг файлуудыг үр дүнтэй хадгалах, сэргээхэд чиглэнэ. Энэ үе шатанд түгжээг бүрэн дэмждэг, тэр дундаа кластер түгжээтэй, суга таяггүй ч юм шиг POSIX-тэй нийцтэй файлын системд зориулсан эцсийн шийдлийг санал болгож байна.

Тиймээс би энэ зорилгоор өөрийн хувийн серверийг бичсэн.
Энэ даалгаврыг хэрэгжүүлэх явцад бид үндсэн асуудлыг шийдэж чадсан бөгөөд үүний зэрэгцээ манай кластер файлын систем хайр найргүй зарцуулж байсан дискний зай болон RAM-ыг хэмнэж чадсан. Үнэн хэрэгтээ ийм тооны файлууд нь ямар ч кластер файлын системд хортой байдаг.

Энэ санаа нь:

Энгийнээр хэлбэл, жижиг файлуудыг серверээр дамжуулан байршуулж, архивт шууд хадгалахаас гадна тэндээс уншиж, том файлуудыг зэрэгцүүлэн байрлуулдаг. Схем: 1 хавтас = 1 архив, нийтдээ бид хэдэн зуун сая файл биш хэдэн сая жижиг файлтай архивтай. Энэ бүхэн нь ямар ч скрипт, файлуудыг tar/zip архивт оруулахгүйгээр бүрэн хэрэгждэг.

Би товчхон бичихийг хичээх болно, хэрэв бичлэг урт болвол уучлаарай.

Ердийн архив, объектын хадгалалтад байдаг сул талгүйгээр HTTP протоколоор хүлээн авсан өгөгдлийг архивт шууд хадгалах тохиромжтой серверийг би дэлхий дээр олж чадаагүйгээс бүх зүйл эхэлсэн. Хайлтын шалтгаан нь 10 жижиг файлууд аль хэдийн хуримтлагдсан 250,000,000 серверийн Origin кластер байсан бөгөөд энэ нь өргөн цар хүрээтэй болсон бөгөөд өсөлтийн хандлага зогсохгүй байв.

Нийтлэл унших дургүй хүмүүст бага зэрэг баримтжуулах нь илүү хялбар байдаг:

энд и энд.

Үүний зэрэгцээ докер, одоо зөвхөн дотор нь nginx-тэй байх сонголт байна:

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

Дараа нь:

Хэрэв олон файл байгаа бол ихээхэн хэмжээний нөөц шаардлагатай бөгөөд хамгийн муу нь заримыг нь дэмий үрэх явдал юм. Жишээлбэл, кластер файлын системийг (энэ тохиолдолд MooseFS) ашиглах үед файл нь бодит хэмжээнээс үл хамааран дор хаяж 64 KB эзэлдэг. Өөрөөр хэлбэл, 3, 10 эсвэл 30 КБ хэмжээтэй файлуудын хувьд диск дээр 64 КБ шаардлагатай. Хэрэв дөрөвний нэг тэрбум файл байгаа бол бид 2-10 терабайт алддаг. MooseFS нь хязгаарлалттай тул тодорхойгүй хугацаагаар шинэ файл үүсгэх боломжгүй: файл бүрийн нэг хуулбартай 1 тэрбумаас илүүгүй.

Файлын тоо нэмэгдэхийн хэрээр мета өгөгдөлд маш их хэмжээний RAM шаардлагатай болдог. Тогтмол их хэмжээний мета өгөгдлийн хаягдал нь SSD хөтчүүдийн элэгдэлд нөлөөлдөг.

wZD сервер. Бид дискэн дээрх зүйлсийг эмх цэгцтэй болгодог.

Сервер нь Go дээр бичигдсэн. Юуны өмнө би файлын тоог багасгах хэрэгтэй болсон. Үүнийг хэрхэн хийх вэ? Архивын улмаас, гэхдээ энэ тохиолдолд шахалтгүй, учир нь миний файлууд зүгээр л шахсан зургууд юм. БолтДБ нь аврах ажилд ирсэн бөгөөд энэ нь дутагдалтай талуудыг арилгах шаардлагатай хэвээр байгаа бөгөөд үүнийг баримт бичигт тусгасан болно.

Нийтдээ дөрөвний нэг тэрбум файлын оронд миний хувьд ердөө 10 сая Болтын архив үлдсэн байв. Хэрэв надад одоогийн лавлах файлын бүтцийг өөрчлөх боломж байсан бол үүнийг ойролцоогоор 1 сая файл болгон багасгах боломжтой байсан.

Бүх жижиг файлуудыг Bolt архивт байрлуулсан бөгөөд тэдгээр нь байгаа сангуудын нэрийг автоматаар хүлээн авдаг бөгөөд бүх том файлууд архивын хажууд үлддэг; тэдгээрийг савлах нь утгагүй бөгөөд үүнийг өөрчлөх боломжтой. Жижиг нь архивлагдсан, том нь өөрчлөгдөөгүй. Сервер нь хоёуланд нь ил тод ажилладаг.

wZD серверийн архитектур ба онцлог.

Олон зуун сая жижиг файлуудыг үр дүнтэй хадгал. Өөрөө байршуулсан шийдэл

Сервер нь Linux, BSD, Solaris, OSX үйлдлийн системүүд дээр ажилладаг. Би зөвхөн Линукс дээр AMD64 архитектурыг туршиж үзсэн боловч ARM64, PPC64, MIPS64 дээр ажиллах ёстой.

Үндсэн онцлог:

  • Олон урсгалтай;
  • Олон сервер, алдааг тэсвэрлэх, ачааллыг тэнцвэржүүлэх;
  • Хэрэглэгч эсвэл хөгжүүлэгчийн хамгийн их ил тод байдал;
  • Дэмжигдсэн HTTP аргууд: GET, HEAD, PUT болон DELETE;
  • Үйлчлүүлэгчийн толгойгоор дамжуулан унших, бичих үйлдлийг хянах;
  • Уян хатан виртуал хостуудыг дэмжих;
  • Бичих/унших үед CRC мэдээллийн бүрэн бүтэн байдлыг дэмжих;
  • Хагас динамик буфер нь санах ойн хамгийн бага зарцуулалт, сүлжээний гүйцэтгэлийг оновчтой тохируулах;
  • Өгөгдлийн нягтаршлыг хойшлуулсан;
  • Нэмж дурдахад, үйлчилгээг зогсоохгүйгээр файлуудыг шилжүүлэхийн тулд олон урсгалтай архивлагч wZA-г санал болгож байна.

Бодит туршлага:

Би сервер болон архивлагчийг амьд өгөгдөл дээр удаан хугацаанд хөгжүүлж, туршиж үзсэн бөгөөд одоо тусдаа SATA диск дээр байрлах 250,000,000 жижиг файл (зураг) агуулсан кластер дээр амжилттай ажиллаж байна. 15,000,000 серверийн кластер нь CDN сүлжээний ард суулгасан Origin сервер юм. Үүнд үйлчлэхийн тулд 10 Nginx сервер + 2 wZD сервер ашигладаг.

Энэ серверийг ашиглахаар шийдсэн хүмүүсийн хувьд ашиглахаасаа өмнө лавлах бүтцийг төлөвлөх нь ухаалаг хэрэг болно. Сервер нь бүх зүйлийг 1 Болтын архивт чихэх зорилготой биш гэдгийг би даруй захиалъя.

Гүйцэтгэлийн туршилт:

Зиплэгдсэн файлын хэмжээ бага байх тусам түүн дээр GET болон PUT үйлдлүүд хурдан хийгддэг. HTTP клиентийг ердийн файлууд болон Болтын архивт бичих, унших зэрэг нийт хугацааг харьцуулж үзье. 32 KB, 256 KB, 1024 KB, 4096 KB, 32768 KB хэмжээтэй файлуудтай ажиллахыг харьцуулсан.

Болтын архивтай ажиллахдаа файл бүрийн өгөгдлийн бүрэн бүтэн байдлыг шалгадаг (CRC ашигладаг), бичлэг хийхээс өмнө, мөн бичлэг хийсний дараа шууд унших, дахин тооцоолол хийх үед энэ нь мэдээжийн хэрэг саатал үүсгэдэг боловч гол зүйл бол мэдээллийн аюулгүй байдал юм.

SATA хөтчүүд дээрх туршилтууд нь тодорхой ялгаа харуулаагүй тул би SSD хөтчүүд дээр гүйцэтгэлийн туршилт хийсэн.

Туршилтын үр дүнд суурилсан графикууд:

Олон зуун сая жижиг файлуудыг үр дүнтэй хадгал. Өөрөө байршуулсан шийдэл
Олон зуун сая жижиг файлуудыг үр дүнтэй хадгал. Өөрөө байршуулсан шийдэл

Таны харж байгаагаар жижиг файлуудын хувьд архивлагдсан болон архивлагдаагүй файлуудын унших, бичих хугацааны ялгаа бага байна.

32 МБ хэмжээтэй файлуудыг унших, бичих туршилт хийх үед бид огт өөр дүр зургийг олж авдаг.

Олон зуун сая жижиг файлуудыг үр дүнтэй хадгал. Өөрөө байршуулсан шийдэл

Унших файлуудын хоорондох цагийн зөрүү 5-25 мс байна. Бичлэг хийснээр байдал улам дордож, ялгаа нь 150 мс орчим байна. Гэхдээ энэ тохиолдолд том файл байршуулах шаардлагагүй, үүнийг хийх нь утгагүй бөгөөд тэд архиваас тусдаа амьдрах боломжтой.

*Техникийн хувьд та энэ серверийг NoSQL шаарддаг ажлуудад ашиглаж болно.

wZD сервертэй ажиллах үндсэн аргууд:

Энгийн файлыг ачаалж байна:

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

Болтын архивт файл байршуулж байна (архивт оруулах боломжтой файлын дээд хэмжээг тодорхойлдог 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 аргыг бас дэмждэггүй (хэрэгтэй эсэх нь хараахан шийдэгдээгүй байна).

Эх кодыг ухаж үзсэн хүн тэнд шарсан махыг олох болно, энэ нь хүн бүрт таалагддаггүй, гэхдээ би тасалдал зохицуулагчаас бусад үндсэн кодыг вэб фреймворкийн функцуудтай холбоногүй тул ирээдүйд би үүнийг бараг бүх зүйлд хурдан бичиж болно. хөдөлгүүр.

Хийх:

  • Кластер файлын системгүй том системд ашиглах боломжийн хувьд өөрийн хуулбарлагч, дистрибьютер + гео хөгжүүлэлт (Насанд хүрэгчдэд зориулсан бүх зүйл)
  • Мета өгөгдлийг бүрэн алдсан тохиолдолд бүрэн урвуу сэргээх боломж (хэрэв дистрибьютер ашиглаж байгаа бол)
  • Төрөл бүрийн програмчлалын хэлэнд зориулсан байнгын сүлжээний холболт, драйверуудыг ашиглах чадвартай төрөлх протокол
  • NoSQL бүрэлдэхүүнийг ашиглах дэвшилтэт боломжууд
  • Болтын архив доторх файлууд эсвэл утгууд болон ердийн файлуудад зориулсан өөр өөр төрлийн (gzip, zstd, snappy) шахалтууд
  • Болтын архив болон энгийн файлуудын доторх файл эсвэл утгын янз бүрийн төрлийн шифрлэлт
  • Сервер талын видео хөрвүүлэлт, түүний дотор GPU дээр саатсан

Надад бүх зүйл байгаа, энэ сервер хэн нэгэнд хэрэг болно гэж найдаж байна, BSD-3 лиценз, давхар зохиогчийн эрх, хэрэв миний ажилладаг компани байхгүй байсан бол сервер бичигдээгүй байх байсан. Би бол цорын ганц хөгжүүлэгч. Таны олсон аливаа алдаа болон онцлог шинж чанаруудын хүсэлтэд би талархах болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх