Ефикасно чувајте стотине милиона малих датотека. Само-хостовано решење

Ефикасно чувајте стотине милиона малих датотека. Само-хостовано решење

Драга заједница, Овај чланак ће се фокусирати на ефикасно складиштење и преузимање стотина милиона малих датотека. У овој фази, коначно решење је предложено за ПОСИКС-компатибилне системе датотека са пуном подршком за браве, укључујући и кластер браве, и наизглед чак и без штака.

Зато сам написао свој прилагођени сервер за ову сврху.
У реализацији овог задатка успели смо да решимо главни проблем, а да истовремено постигнемо уштеду на диску и РАМ-у, који је наш кластер фајл систем немилосрдно трошио. Заправо, толики број датотека је штетан за било који кластеризовани систем датотека.

Идеја је следећа:

Једноставним речима, мале датотеке се учитавају преко сервера, спремају се директно у архиву, а такође се читају из ње, а велике датотеке се постављају једна поред друге. Шема: 1 фасцикла = 1 архива, укупно имамо неколико милиона архива са малим датотекама, а не неколико стотина милиона датотека. И све ово је имплементирано у потпуности, без икаквих скрипти или стављања фајлова у тар/зип архиве.

Покушаћу да буде кратак, унапред се извињавам ако је пост дугачак.

Све је почело чињеницом да нисам могао да пронађем одговарајући сервер на свету који би могао да сачува податке примљене преко ХТТП протокола директно у архиве, без недостатака својствених конвенционалним архивама и складиштењу објеката. А разлог за претрагу је био Оригин кластер од 10 сервера који је нарастао до великих размера, у којем се већ накупило 250,000,000 малих фајлова, а тренд раста неће престати.

За оне који не воле да читају чланке, мало документације је лакше:

овде и овде.

И доцкер у исто време, сада постоји опција само са нгинк-ом унутра за сваки случај:

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

Следеће:

Ако има много фајлова, потребни су значајни ресурси, а најгоре је што се неки од њих троше. На пример, када се користи кластеризовани систем датотека (у овом случају МоосеФС), датотека, без обзира на њену стварну величину, увек заузима најмање 64 КБ. То јест, за датотеке величине 3, 10 или 30 КБ потребно је 64 КБ на диску. Ако постоји четврт милијарде датотека, губимо од 2 до 10 терабајта. Неће бити могуће креирати нове датотеке на неодређено време, пошто МоосеФС има ограничење: не више од 1 милијарде са једном репликом сваке датотеке.

Како се број датотека повећава, потребно је много РАМ-а за метаподатке. Честе велике депоније метаподатака такође доприносе трошењу ССД дискова.

вЗД сервер. Стављамо ред на дискове.

Сервер је написан у Го. Пре свега, требало је да смањим број датотека. Како се то ради? Због архивирања, али у овом случају без компресије, пошто су моји фајлови само компримоване слике. У помоћ је притекао БолтДБ, који је ипак морао да се елиминише из својих недостатака, то се огледа у документацији.

Укупно, уместо четврт милијарде фајлова, у мом случају је остало само 10 милиона Болтових архива. Када бих имао прилику да променим тренутну структуру датотека директоријума, било би могуће да је смањим на отприлике 1 милион датотека.

Сви мали фајлови се пакују у Болт архиве, које аутоматски добијају називе директоријума у ​​којима се налазе, а сви велики фајлови остају поред архива; нема смисла да их пакујете, ово је прилагодљиво. Мали се архивирају, велики остају непромењени. Сервер ради транспарентно са оба.

Архитектура и карактеристике вЗД сервера.

Ефикасно чувајте стотине милиона малих датотека. Само-хостовано решење

Сервер ради под оперативним системима Линук, БСД, Соларис и ОСКС. Тестирао сам само за АМД64 архитектуру под Линуком, али би требало да ради за АРМ64, ППЦ64, МИПС64.

Главне карактеристике:

  • Мултитхреадинг;
  • Мултисервер, који обезбеђује толеранцију грешака и балансирање оптерећења;
  • Максимална транспарентност за корисника или програмера;
  • Подржане ХТТП методе: ГЕТ, ХЕАД, ПУТ и ДЕЛЕТЕ;
  • Контрола понашања читања и писања преко заглавља клијента;
  • Подршка за флексибилне виртуелне хостове;
  • Подржава ЦРЦ интегритет података приликом писања/читања;
  • Полудинамички бафери за минималну потрошњу меморије и оптимално подешавање мрежних перформанси;
  • Одложено сажимање података;
  • Поред тога, нуди се вишенитни архиватор вЗА за миграцију датотека без заустављања услуге.

Право искуство:

Доста дуго сам развијао и тестирао сервер и архивер на живим подацима, сада успешно ради на кластеру који укључује 250,000,000 малих фајлова (слика) смештених у 15,000,000 директоријума на одвојеним САТА дисковима. Група од 10 сервера је Оригин сервер инсталиран иза ЦДН мреже. За сервисирање се користе 2 Нгинк сервера + 2 вЗД сервера.

За оне који одлуче да користе овај сервер, било би мудро да испланирају структуру директоријума, ако је применљиво, пре употребе. Дозволите ми да одмах резервишем да сервер није намењен да све стрпа у 1 Болт архиву.

Тестирање перформанси:

Што је мања величина компримоване датотеке, брже се извршавају ГЕТ и ПУТ операције на њој. Хајде да упоредимо укупно време за писање ХТТП клијента са редовним датотекама и Болт архивама, као и читање. Упоређује се рад са датотекама величине 32 КБ, 256 КБ, 1024 КБ, 4096 КБ и 32768 КБ.

Када радите са Болт архивама, проверава се интегритет података сваке датотеке (користи се ЦРЦ), пре снимања, а такође и након снимања, долази до читања и поновног израчунавања у ходу, што природно доводи до кашњења, али главна ствар је безбедност података.

Спровео сам тестове перформанси на ССД дисковима, пошто тестови на САТА дисковима не показују јасну разлику.

Графикони засновани на резултатима тестирања:

Ефикасно чувајте стотине милиона малих датотека. Само-хостовано решење
Ефикасно чувајте стотине милиона малих датотека. Само-хостовано решење

Као што видите, за мале датотеке разлика у времену читања и писања између архивираних и неархивираних датотека је мала.

Добијамо потпуно другачију слику када тестирамо читање и писање датотека величине 32 МБ:

Ефикасно чувајте стотине милиона малих датотека. Само-хостовано решење

Временска разлика између читања датотека је унутар 5-25 мс. Са снимањем ствари стоје горе, разлика је око 150 мс. Али у овом случају нема потребе да отпремате велике датотеке, једноставно нема смисла то чинити; они могу да живе одвојено од архива.

*Технички, овај сервер можете користити за задатке који захтевају НоСКЛ.

Основне методе рада са вЗД сервером:

Учитавање обичне датотеке:

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

Отпремање датотеке у Болт архиву (ако није прекорачен серверски параметар фмаксизе, који одређује максималну величину датотеке која се може укључити у архиву; ако је прекорачена, датотека ће бити отпремљена као и обично поред архиве):

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

Описи осталих метода су у документацији.

вЗД Доцументатион
вЗА Доцументатион

Сервер тренутно подржава само ХТТП протокол; он још увек не ради са ХТТПС-ом. ПОСТ метод такође није подржан (још није одлучено да ли је потребан или не).

Ко копа по изворном коду, тамо ће пронаћи буттерсцотцх, не свиђа се свима, али главни код нисам везао за функције веб оквира, осим за руковалац прекида, тако да у будућности могу брзо да га препишем за скоро све мотор.

Урадити:

  • Развој сопственог репликатора и дистрибутера + гео за могућност коришћења у великим системима без кластер фајл система (Све за одрасле)
  • Могућност потпуног повратног опоравка метаподатака ако су потпуно изгубљени (ако користите дистрибутера)
  • Изворни протокол за могућност коришћења трајних мрежних веза и драјвера за различите програмске језике
  • Напредне могућности за коришћење НоСКЛ компоненте
  • Компресије различитих типова (гзип, зстд, снаппи) за датотеке или вредности унутар Болт архива и за обичне датотеке
  • Шифровање различитих типова за датотеке или вредности унутар Болт архива и за обичне датотеке
  • Одложена видео конверзија на страни сервера, укључујући ГПУ

Имам све, надам се да ће овај сервер некоме бити од користи, БСД-3 лиценца, дупла ауторска права, пошто да нема фирме у којој радим сервер не би био написан. Ја сам једини програмер. Био бих вам захвалан за све грешке и захтеве за функције које пронађете.

Извор: ввв.хабр.цом

Додај коментар