Садҳо миллион файлҳои хурдро самаранок захира кунед. Ҳалли худидоракунӣ

Садҳо миллион файлҳои хурдро самаранок захира кунед. Ҳалли худидоракунӣ

Ҷамъияти мӯҳтарам, Ин мақола ба самаранок нигоҳдорӣ ва дарёфт кардани садҳо миллион файлҳои хурд тамаркуз хоҳад кард. Дар ин марҳила, ҳалли ниҳоӣ барои системаҳои файлии бо POSIX мувофиқ бо дастгирии пурраи қулфҳо, аз ҷумла қулфҳои кластерӣ ва зоҳиран ҳатто бе асобағол пешниҳод карда мешавад.

Ҳамин тавр, ман сервери фармоишии худро барои ин мақсад навиштам.
Дар рафти ичрои ин вазифа ба мо муяссар шуд, ки масъалаи асосиро хал кунем ва дар айни замон ба сарфаи фазои диск ва хотираи оперативӣ ноил гардем, ки системаи файлии кластерии мо онҳоро бераҳмона истеъмол мекард. Дарвоқеъ, чунин миқдори файлҳо барои ҳама гуна системаи файлии кластерӣ зарароваранд.

Идея ин аст:

Бо ибораи оддӣ, файлҳои хурд тавассути сервер бор карда мешаванд, онҳо бевосита дар архив захира карда мешаванд ва инчунин аз он хонда мешаванд ва файлҳои калон паҳлӯ ба паҳлӯ ҷойгир карда мешаванд. Схема: 1 папка = 1 бойгонӣ, дар маҷмӯъ мо якчанд миллион бойгонии дорои файлҳои хурд дорем, на чандсад миллион файл. Ва ҳамаи ин бе ягон скрипт ё гузоштани файлҳо ба бойгонии tar/zip пурра амалӣ карда мешавад.

Ман кӯшиш мекунам, ки онро кӯтоҳ нигоҳ дорам, агар навиштаҷот тӯлонӣ бошад, пешакӣ бахшиш мепурсам.

Ҳамааш аз он сар шуд, ки ман дар ҷаҳон сервери мувофиқеро пайдо карда натавонистам, ки маълумоти тавассути протоколи HTTP гирифташударо мустақиман дар бойгонӣ нигоҳ дорад, бидуни нуқсонҳои хоси бойгониҳои анъанавӣ ва нигаҳдории объект. Ва сабаби ҷустуҷӯ кластери Origin аз 10 сервер буд, ки ба миқёси калон расидаанд, ки дар он аллакай 250,000,000 XNUMX XNUMX файлҳои хурд ҷамъ шуда буданд ва тамоюли афзоиш қатъ намешуд.

Барои онҳое, ки хондани мақолаҳоро дӯст намедоранд, ҳуҷҷатгузории каме осонтар аст:

дар ин ҷо и дар ин ҷо.

Ва дар айни замон докер, ҳоло як вариант танҳо бо 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

Next:

Агар файлҳо зиёд бошанд, захираҳои назаррас лозиманд ва қисми бадтаринаш он аст, ки баъзеи онҳо беҳуда сарф мешаванд. Масалан, ҳангоми истифодаи системаи файлии кластерӣ (дар ин ҳолат MooseFS), файл, новобаста аз андозаи воқеии он, ҳамеша ҳадди аққал 64 КБ-ро мегирад. Яъне барои файлҳои андозаи 3, 10 ё 30 КБ дар диск 64 КБ лозим аст. Агар чоряки як миллиард файл мавҷуд бошад, мо аз 2 то 10 терабайт гум мекунем. Эҷоди файлҳои нав ба муддати номуайян имконнопазир аст, зеро MooseFS маҳдудият дорад: на бештар аз 1 миллиард бо як нусхаи ҳар як файл.

Бо афзоиши шумораи файлҳо, барои метамаълумотҳо миқдори зиёди RAM лозим аст. Партовҳои зиёди метамаълумотҳо инчунин ба фарсудашавӣ ва фарсудашавии дискҳои SSD мусоидат мекунанд.

сервери wZD. Мо корро дар дискхо ба тартиб меандозем.

Сервер дар Go навишта шудааст. Пеш аз ҳама, ба ман лозим буд, ки шумораи файлҳоро кам кунам. Чӣ тавр бояд кард? Бо сабаби бойгонӣ, аммо дар ин ҳолат бидуни фишурда, зеро файлҳои ман танҳо тасвирҳои фишурдашуда мебошанд. BoltDB ба наҷот омад, ки онро ҳанӯз аз камбудиҳои худ бартараф кардан лозим буд, ин дар ҳуҷҷатҳо инъикос ёфтааст.

Дар маҷмӯъ, ба ҷои чоряки миллиард файл, дар ҳолати ман ҳамагӣ 10 миллион архиви Болт боқӣ мондааст. Агар ман имкони тағир додани сохтори файли феҳристи ҷориро доштам, онро ба тақрибан 1 миллион файл кам кардан мумкин буд.

Ҳама файлҳои хурд дар бойгониҳои Bolt ҷойгир карда мешаванд, ки онҳо ба таври худкор номи директорияҳоеро, ки дар онҳо ҷойгиранд, қабул мекунанд ва ҳама файлҳои калон дар паҳлӯи бойгонӣ мемонанд; бастабандии онҳо маъно надорад, ин танзимшаванда аст. Хурдҳо архив мешаванд, калонҳо бетағйир мемонанд. Сервер бо ҳарду шаффоф кор мекунад.

Архитектура ва хусусиятҳои сервери wZD.

Садҳо миллион файлҳои хурдро самаранок захира кунед. Ҳалли худидоракунӣ

Сервер дар зери системаҳои оператсионии Linux, BSD, Solaris ва OSX кор мекунад. Ман танҳо меъмории AMD64-ро зери Linux санҷидам, аммо он бояд барои ARM64, PPC64, MIPS64 кор кунад.

Хусусиятҳои асосӣ:

  • Мултиседагӣ;
  • Мултсервер, ки таҳаммулпазирии хатогиҳо ва мувозинати сарбориро таъмин мекунад;
  • Шаффофияти максималӣ барои корбар ё таҳиякунанда;
  • Усулҳои пуштибонии HTTP: GET, HEAD, PUT ва DELETE;
  • Назорати рафтори хондан ва навиштан тавассути сарлавҳаҳои муштарӣ;
  • Дастгирии ҳостҳои виртуалии тағйирпазир;
  • Дастгирии якпорчагии маълумоти CRC ҳангоми навиштан/хондан;
  • Буферҳои нимдинамикӣ барои истеъмоли ҳадди ақали хотира ва танзими оптималии кори шабака;
  • Фишурдани маълумотҳои таъхиршуда;
  • Илова бар ин, бойгонии бисёрсоҳавӣ wZA барои интиқоли файлҳо бидуни қатъи хидмат пешниҳод карда мешавад.

Таҷрибаи воқеӣ:

Ман муддати тӯлонӣ сервер ва бойгониро дар маълумотҳои зинда таҳия ва озмоиш мекардам, ҳоло он дар кластер бомуваффақият кор мекунад, ки 250,000,000 15,000,000 10 файлҳои хурд (тасвир) дар 2 2 XNUMX феҳристҳо дар дискҳои алоҳидаи SATA ҷойгиранд. Кластери аз XNUMX сервер сервери Origin мебошад, ки дар паси шабакаи CDN насб шудааст. Барои хидматрасонии он, XNUMX сервери Nginx + XNUMX серверҳои wZD истифода мешаванд.

Барои онҳое, ки тасмим гирифтанд, ки ин серверро истифода баранд, аз рӯи хирад мебуд, ки сохтори директорияро, агар имконпазир бошад, пеш аз истифода ба нақша гирифтаанд. Иҷозат диҳед фавран фармоиш диҳам, ки сервер ният надорад ҳама чизро ба бойгонии 1 Bolt гузорад.

Санҷиши иҷроиш:

Чӣ қадаре ки андозаи файли zip хурдтар бошад, дар он амалҳои GET ва PUT ҳамон қадар тезтар иҷро мешаванд. Биёед вақти умумии навиштани муштарии HTTP-ро бо файлҳои муқаррарӣ ва бойгонии Болт ва инчунин хондан муқоиса кунем. Кор бо файлҳои андозаашон 32 КБ, 256 КБ, 1024 КБ, 4096 КБ ва 32768 КБ муқоиса карда мешавад.

Ҳангоми кор бо архивҳои Bolt, тамомияти додаҳои ҳар як файл тафтиш карда мешавад (CRC истифода мешавад), пеш аз сабт ва инчунин пас аз сабт, хондан ва ҳисобкунии дубора ба амал меояд, ин табиист, ки таъхирҳоро ба вуҷуд меорад, аммо чизи асосӣ амнияти додаҳост.

Ман санҷишҳои иҷроишро дар дискҳои SSD гузаронидам, зеро санҷишҳо дар дискҳои SATA фарқияти возеҳ нишон намедиҳанд.

Графикҳо дар асоси натиҷаҳои санҷиш:

Садҳо миллион файлҳои хурдро самаранок захира кунед. Ҳалли худидоракунӣ
Садҳо миллион файлҳои хурдро самаранок захира кунед. Ҳалли худидоракунӣ

Тавре ки шумо мебинед, барои файлҳои хурд фарқияти вақти хондан ва навиштан байни файлҳои бойгонӣ ва ғайриархившуда хурд аст.

Ҳангоми санҷиши хондан ва навиштани файлҳои ҳаҷмаш 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 низ дастгирӣ намешавад (ҳанӯз тасмим гирифта нашудааст, ки оё он лозим аст ё не).

Ҳар касе, ки рамзи сарчашмаро кобед, дар он ҷо равғани зайтун пайдо мекунад, на ҳама онро дӯст медоранд, аммо ман коди асосиро ба функсияҳои чаҳорчӯбаи веб пайваст накардаам, ба истиснои коркарди халал, аз ин рӯ дар оянда ман метавонам онро барои қариб ҳама чиз зуд аз нав нависам. муҳаррик.

Кардан:

  • Таҳияи репликатор ва дистрибютори худ + гео барои имкони истифода дар системаҳои калон бе системаҳои файлии кластерӣ (Ҳама чиз барои калонсолон)
  • Имконияти барқарорсозии пурраи баръакси метамаълумотҳо, агар он пурра гум шавад (агар истифода аз дистрибютор)
  • Протоколи аслӣ барои қобилияти истифодаи пайвастагиҳои шабакавии доимӣ ва драйверҳо барои забонҳои гуногуни барномасозӣ
  • Имкониятҳои пешрафта барои истифодаи ҷузъи NoSQL
  • Фишурдани намудҳои гуногун (gzip, zstd, snappy) барои файлҳо ё арзишҳо дар архивҳои Bolt ва файлҳои муқаррарӣ
  • Рамзгузории намудҳои гуногун барои файлҳо ё арзишҳо дар архивҳои Bolt ва файлҳои муқаррарӣ
  • Табдили видеоии таъхир дар сервер, аз ҷумла дар GPU

Ман ҳама чизро дорам, умедворам, ки ин сервер барои касе муфид хоҳад буд, иҷозатномаи BSD-3, ҳуқуқи муаллифии дукарата, зеро агар ягон ширкате дар он ҷое, ки ман кор мекунам, намебуд, сервер навишта намешуд. Ман ягона таҳиякунанда ҳастам. Ман барои ҳама хатогиҳо ва дархостҳои хусусиятҳое, ки шумо пайдо мекунед, миннатдор хоҳам буд.

Манбаъ: will.com

Илова Эзоҳ