Ҷустуҷӯ бо суръати 1 ТБ/с

TL; DR: Чаҳор сол пеш ман Google-ро бо идеяи асбоби нави мониторинги сервер тарк кардам. Идеяи он буд, ки функсияҳои одатан ҷудошуда дар як хидмат муттаҳид карда шаванд ҷамъоварӣ ва таҳлили гузоришҳо, ҷамъоварии ченакҳо, огоҳиҳо ва панелҳои идоракунӣ. Яке аз принсипҳо ин аст, ки хидмат бояд воқеан бошад зуд, таъмин кардани devops бо таҷрибаи осон, интерактивӣ ва ҷолиб. Ин коркарди маҷмӯи маълумотҳои бисёр гигабайтиро дар як сония ҳангоми мондан дар доираи буҷет талаб мекунад. Воситаҳои мавҷудаи идоракунии гузоришҳо аксар вақт суст ва душвор мебошанд, аз ин рӯ мо бо як мушкили хуб рӯ ба рӯ шудем: оқилона тарҳрезии асбобе барои ба корбарон додани таҷрибаи нав.

Ин мақола тасвир мекунад, ки чӣ тавр мо дар Скалир ин мушкилотро тавассути истифодаи усулҳои мактаби кӯҳна, равиши қувваи бераҳмона, аз байн бурдани қабатҳои нолозим ва канорагирӣ аз сохторҳои мураккаби додаҳо ҳал кардем. Шумо метавонед ин дарсҳоро ба мушкилоти муҳандисии худ истифода баред.

Қудрати мактаби кӯҳна

Таҳлили гузориш одатан аз ҷустуҷӯ оғоз мешавад: ҳама паёмҳоро, ки ба намунаи муайян мувофиқат мекунанд, пайдо кунед. Дар Scalyr, инҳо даҳҳо ё садҳо гигабайтҳо аз серверҳои сершумор мебошанд. Муносибатҳои муосир, чун қоида, сохтани баъзе сохторҳои мураккаби маълумотро дар бар мегиранд, ки барои ҷустуҷӯ оптимизатсия шудаанд. Ман албатта инро дар Google дидаам, ки онҳо дар ин гуна корҳо хеле хубанд. Аммо мо ба як равиши хеле дағалона қарор додем: сканкунии хаттии гузоришҳо. Ва он кор кард - мо интерфейси ҷустуҷӯшавандаро таъмин мекунем, ки нисбат ба рақибони мо тезтар аст (ба аниматсия дар охир нигаред).

Фаҳмиши калидӣ ин буд, ки протсессорҳои муосир воқеан дар амалиётҳои оддӣ ва оддӣ хеле зуданд. Инро дар системаҳои мураккаби бисёрқабата, ки ба суръати вуруд/чор ва амалиёти шабака такя мекунанд, осон нест ва чунин системаҳо имрӯз хеле маъмуланд. Ҳамин тавр, мо тарҳеро таҳия кардем, ки қабатҳо ва хошокҳои зиёдатиро кам мекунад. Бо протсессори сершумор ва серверҳои мувозӣ, суръати ҷустуҷӯ дар як сония ба 1 ТБ мерасад.

Баррасиҳои асосӣ аз ин мақола:

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

(Ин мақола ҷустуҷӯи маълумотро дар хотира тавсиф мекунад. Дар аксари мавридҳо, вақте ки корбар ҷустуҷӯи гузоришро анҷом медиҳад, серверҳои Scalyr онро аллакай кэш кардаанд. Дар мақолаи навбатӣ ҷустуҷӯи гузоришҳои кэшнашуда баррасӣ мешавад. Ҳамин принсипҳо татбиқ мешаванд: рамзи муассир, қувваи бераҳмона. бо захираҳои калони ҳисоббарорӣ).

Усули қувваи бераҳмона

Одатан, маҷмӯи маълумоти калон бо истифода аз индекси калимаи калидӣ ҷустуҷӯ карда мешавад. Вақте ки ба гузоришҳои сервер истифода мешавад, ин маънои ҷустуҷӯи ҳар як калимаи беназир дар гузоришро дорад. Барои ҳар як калима, шумо бояд рӯйхати ҳама дохилкуниро тартиб диҳед. Ин пайдо кардани ҳама паёмҳоро бо ин калима осон мекунад, масалан 'error', 'firefox' ё "transaction_16851951" - танҳо ба индекс нигаред.

Ман ин равишро дар Google истифода кардам ва он хуб кор кард. Аммо дар Scalyr мо гузоришҳоро байт ба байт ҷустуҷӯ мекунем.

Чаро? Аз нуқтаи назари алгоритмии абстрактӣ, индексҳои калимаҳои калидӣ нисбат ба ҷустуҷӯи қувваи бераҳмона хеле самараноктаранд. Аммо, мо алгоритмҳоро намефурӯшем, мо иҷроишро мефурӯшем. Ва иҷрои он на танҳо дар бораи алгоритмҳо, балки дар бораи муҳандисии системаҳо низ мебошад. Мо бояд ҳама чизро ба назар гирем: ҳаҷми маълумот, намуди ҷустуҷӯ, контексти сахтафзор ва нармафзори дастрас. Мо қарор додем, ки барои мушкилоти мушаххаси мо чизе монанди "grep" нисбат ба индекс беҳтар мувофиқ аст.

Индексҳо бузурганд, аммо онҳо маҳдудият доранд. Як калимаро ёфтан осон аст. Аммо ҷустуҷӯи паёмҳо бо калимаҳои гуногун, аз қабили 'googlebot' ва '404', хеле мушкилтар аст. Ҷустуҷӯи иборае ба мисли "истиснои дастгирнашуда" индекси душвортареро талаб мекунад, ки на танҳо ҳама паёмҳоро бо ин калима, балки макони мушаххаси калимаро низ сабт мекунад.

Мушкилии воқеӣ вақте ба миён меояд, ки шумо калимаҳоро намеҷӯед. Фарз мекунем, ки шумо мехоҳед бубинед, ки чӣ қадар трафик аз ботҳо меояд. Аввалин фикр ин ҷустуҷӯи гузоришҳо барои калимаи "бот" аст. Ҳамин тавр шумо баъзе ботҳоро пайдо мекунед: Googlebot, Bingbot ва бисёр дигарон. Аммо дар ин ҷо «бот» калима нест, балки як ҷузъи он аст. Агар мо дар индекс 'bot'-ро ҷустуҷӯ кунем, мо ягон паёмро бо калимаи 'Googlebot' намеёбем. Агар шумо ҳар як калимаи индексро тафтиш кунед ва сипас индексро барои калимаҳои калидии ёфтшуда скан кунед, ҷустуҷӯ хеле суст мешавад. Дар натиҷа, баъзе барномаҳои гузориш ба ҷустуҷӯи қисман-калима иҷозат намедиҳанд ё (беҳтарин) синтаксиси махсусро бо иҷрои камтар иҷозат медиҳанд. Мо мехоҳем аз ин пешгирӣ кунем.

Мушкилоти дигар аломати пунктуатсия аст. Оё шумо мехоҳед, ки ҳамаи дархостҳоро аз 50.168.29.7? Дар бораи ислоҳи гузоришҳои дорои [error]? Зернависҳо одатан аломатҳои пунктуатсияро мегузаранд.

Ниҳоят, муҳандисон асбобҳои пурқувватро дӯст медоранд ва баъзан мушкилотро танҳо бо ифодаи муқаррарӣ ҳал кардан мумкин аст. Индекси калидӣ барои ин чандон мувофиқ нест.

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

Индексҳои калимаҳои калидӣ низ фазои зиёдеро ишғол мекунанд ва нигоҳдорӣ дар системаи идоракунии гузоришҳо хароҷоти калон аст.

Аз тарафи дигар, ҳар як ҷустуҷӯ метавонад қувваи зиёди ҳисоббарориро истеъмол кунад. Корбарони мо ҷустуҷӯҳои баландсуръатро барои дархостҳои беназир қадр мекунанд, аммо чунин дархостҳо нисбатан кам сурат мегиранд. Барои дархостҳои маъмулии ҷустуҷӯ, масалан, барои панели идоракунӣ, мо усулҳои махсусро истифода мебарем (мо онҳоро дар мақолаи оянда тавсиф хоҳем кард). Дархостҳои дигар ба қадри кофӣ кам нестанд, ки ба шумо лозим меояд, ки дар як вақт зиёда аз як маротиба коркард кунед. Аммо ин маънои онро надорад, ки серверҳои мо банд нестанд: онҳо бо кори қабул, таҳлил ва фишурдани паёмҳои нав, баҳодиҳии огоҳиҳо, фишурдани маълумоти кӯҳна ва ғайра банд мебошанд. Ҳамин тариқ, мо протсессори хеле назаррас дорем, ки онҳоро барои иҷрои дархостҳо истифода бурдан мумкин аст.

Қувваи бераҳмона кор мекунад, агар шумо мушкилоти бераҳмона дошта бошед (ва қувваи зиёд)

Қувваи бераҳмона дар масъалаҳои оддӣ бо ҳалқаҳои хурди дохилӣ беҳтарин кор мекунад. Аксар вақт шумо метавонед ҳалқаи дохилиро барои кор бо суръати хеле баланд оптимизатсия кунед. Агар код мураккаб бошад, оптимизатсияи он хеле мушкилтар аст.

Рамзи ҷустуҷӯии мо дар ибтидо як ҳалқаи хеле калони дохилӣ дошт. Мо паёмҳоро дар саҳифаҳои 4K нигоҳ медорем; ҳар як саҳифа дорои баъзе паёмҳо (дар UTF-8) ва метамаълумот барои ҳар як паём. Метамаълумот сохторест, ки дарозии арзиш, ID паёми дохилӣ ва дигар майдонҳоро рамзгузорӣ мекунад. Давраи ҷустуҷӯ чунин менамуд:

Ҷустуҷӯ бо суръати 1 ТБ/с

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

(Шумо метавонед бипурсед, ки чаро мо паёмҳоро дар ин формат бо саҳифаҳои 4K, матн ва метамаълумот нигоҳ медорем, ба ҷои кор бо гузоришҳо. Сабабҳои зиёде вуҷуд доранд, ки дар дохили он муҳаррики Scalyr бештар ба пойгоҳи додаҳои тақсимшуда монанд аст. системаи файлӣ. Ҷустуҷӯи матн аксар вақт бо филтрҳои услуби DBMS дар ҳошияҳо пас аз таҳлили гузориш омехта мешавад.

Дар аввал чунин менамуд, ки чунин код барои оптимизатсияи қувваи бераҳмона чандон мувофиқ нест. «Кори ҳақиқӣ» дар String.indexOf() ҳатто дар профили CPU бартарӣ надошт. Яъне танҳо оптимизатсияи ин усул натиҷаи назаррас намеовард.

Чунин мешавад, ки мо метамаълумотро дар аввали ҳар як саҳифа нигоҳ медорем ва матни ҳама паёмҳо дар UTF-8 дар охири дигар ҷойгир карда мешавад. Бо истифода аз ин, мо давраро аз нав навиштем, то якбора тамоми саҳифаро ҷустуҷӯ кунем:

Ҷустуҷӯ бо суръати 1 ТБ/с

Ин версия бевосита дар намоиш кор мекунад raw byte[] ва ҳама паёмҳоро якбора дар тамоми саҳифаи 4K ҷустуҷӯ мекунад.

Ин оптимизатсия барои усули қувваи бераҳмона хеле осонтар аст. Доираи ҷустуҷӯи дохилӣ ҳамзамон барои тамоми саҳифаи 4K даъват карда мешавад, на дар ҳар як паём. Нусхабардории маълумот, тақсимоти объектҳо вуҷуд надорад. Ва амалиётҳои мураккабтари метамаълумот танҳо вақте даъват карда мешаванд, ки натиҷа мусбат бошад, на дар ҳар паём. Бо ин роҳ мо як тонна сарбориро аз байн бурдем ва қисми боқимондаи сарбор дар як ҳалқаи хурди ҷустуҷӯии дохилӣ мутамарказ шудааст, ки барои оптимизатсияи минбаъда мувофиқ аст.

Алгоритми ҷустуҷӯи воқеии мо ба он асос ёфтааст идеяи бузурги Леонид Вольницкий. Он ба алгоритми Бойер-Мур шабоҳат дорад, ки дар ҳар як қадам тақрибан дарозии сатри ҷустуҷӯро сарфи назар мекунад. Фарқияти асосӣ дар он аст, ки он ду байтро дар як вақт тафтиш мекунад, то мувофиқати бардурӯғро ба ҳадди ақалл кам кунад.

Татбиқи мо барои ҳар як ҷустуҷӯ ҷадвали ҷустуҷӯи 64К-ро талаб мекунад, аммо ин дар муқоиса бо гигабайтҳои маълумоте, ки мо тавассути ҷустуҷӯ мекунем, ҳеҷ чиз нест. Доираи дохилӣ якчанд гигабайт дар як сонияро дар як ядро ​​​​кор мекунад. Дар амал, иҷрои мӯътадил дар ҳар як ядро ​​тақрибан 1,25 ГБ дар як сонияро ташкил медиҳад ва ҷой барои такмил вуҷуд дорад. Мумкин аст, ки як қисми болоиро берун аз ҳалқаи ботинӣ нест кунем ва мо нақша дорем, ки ба ҷои Java як ҳалқаи ботиниро дар C озмоиш кунем.

Мо қувваро истифода мебарем

Мо муҳокима кардем, ки ҷустуҷӯи гузоришҳоро "тақрибан" амалӣ кардан мумкин аст, аммо мо чӣ қадар "қудрат" дорем? Хеле зиёд.

1 ядро: Вақте ки дуруст истифода мешавад, як ядрои як протсессори муосир ба таври худ хеле пурқувват аст.

8 ядро: Мо дар айни замон дар серверҳои Amazon hi1.4xlarge ва i2.4xlarge SSD кор карда истодаем, ки ҳар кадом дорои 8 ядро ​​(16 ришта). Тавре ки дар боло зикр гардид, ин ядроҳо одатан бо амалиёти замина банд мебошанд. Вақте ки корбар ҷустуҷӯро анҷом медиҳад, амалиёти пасзамина боздошта мешавад ва ҳамаи 8 ядроро барои ҷустуҷӯ озод мекунад. Ҷустуҷӯ одатан дар як сония ба анҷом мерасад ва пас аз он кори пасзамина дубора оғоз мешавад (барномаи таҳрикдиҳӣ кафолат медиҳад, ки пурсуҷӯи дархостҳои ҷустуҷӯ ба кори муҳими пасзамина халал нарасонад).

16 ядро: барои эътимоднокӣ, мо серверҳоро ба гурӯҳҳои усто/ғулом ташкил мекунем. Ҳар як усто дорои як SSD ва як сервери EBS таҳти фармони ӯ мебошад. Агар сервери асосӣ суқут кунад, сервери SSD фавран ҷои худро мегирад. Қариб ҳама вақт, устод ва ғулом хуб кор мекунанд, то ки ҳар як блоки додаҳо дар ду сервери гуногун ҷустуҷӯ шавад (сервери ғуломи EBS протсессори заиф дорад, бинобар ин мо онро ба назар намегирем). Мо вазифаро байни онҳо тақсим мекунем, то ки дар маҷмӯъ 16 ядро ​​мавҷуд бошад.

Бисёр ядроҳо: Дар ояндаи наздик, мо маълумотро дар байни серверҳо тавре тақсим хоҳем кард, ки ҳамаи онҳо дар коркарди ҳар як дархости ночиз иштирок кунанд. Ҳар як ядро ​​​​кор хоҳад кард. [Шарҳ: мо планро ичро карда, суръати чустучуро ба 1 ТБ/с расондем, ба ёддошт дар охири макола нигаред].

Соддаӣ эътимодро таъмин мекунад

Бартарии дигари усули қувваи бераҳмона иҷрои хеле пайвастаи он мебошад. Одатан, ҷустуҷӯ ба ҷузъиёти мушкилот ва маҷмӯи додаҳо чандон ҳассос нест (ман гумон мекунам, ки чаро онро "дағал" меноманд).

Индекси калидӣ баъзан натиҷаҳои бениҳоят зуд медиҳад, ва баъзан ин тавр нест. Фарз мекунем, ки шумо 50 ГБ гузориш доред, ки дар онҳо истилоҳи "customer_5987235982" маҳз се маротиба пайдо мешавад. Ҷустуҷӯи ин истилоҳ се маконро мустақиман аз индекс ҳисоб мекунад ва фавран ба анҷом мерасад. Аммо ҷустуҷӯҳои мураккаби ваҳшӣ метавонанд ҳазорҳо калимаҳои калидиро скан кунанд ва вақти зиёдро талаб кунанд.

Аз тарафи дигар, ҷустуҷӯҳои қувваи бераҳмона барои ҳама гуна дархостҳо камтар ё камтар ҳамон суръатро иҷро мекунанд. Ҷустуҷӯи калимаҳои дароз беҳтар аст, аммо ҳатто ҷустуҷӯи як аломат хеле зуд аст.

Содда будани усули қувваи бераҳмона маънои онро дорад, ки иҷрои он ба ҳадди назариявии он наздик аст. Имкониятҳо барои изофабориҳои ғайричашмдошти диск, ихтилофи қулф, таъқиби нишондодҳо ва ҳазорҳо сабабҳои дигари нокомӣ вуҷуд доранд. Ман танҳо ба дархостҳои корбарони Scalyr ҳафтаи гузашта дар серкортарин сервери мо назар кардам. 14 дархост ворид шуд. Дақиқ ҳашттои онҳо бештар аз як сония вақт сарф карданд; 000% дар давоми 99 миллисония анҷом ёфт (агар шумо асбобҳои таҳлили гузоришҳоро истифода накарда бошед, ба ман бовар кунед: зуд аст).

Иҷрои устувор ва боэътимод барои осонии истифодаи хидмат муҳим аст. Агар он давра ба давра ақиб монад, корбарон онро беэътимод меҳисобанд ва аз истифодаи он худдорӣ мекунанд.

Ҷустуҷӯро дар амал сабт кунед

Ин як аниматсияи кӯтоҳест, ки ҷустуҷӯи Scalyr-ро дар амал нишон медиҳад. Мо ҳисоби намоишӣ дорем, ки дар он мо ҳар як ҳодисаро дар ҳар як анбори оммавии Github ворид мекунем. Дар ин намоиш, ман маълумоти як ҳафтаро тафтиш мекунам: тақрибан 600 МБ гузоришҳои хом.

Видео мустақиман бидуни омодагии махсус дар мизи кории ман (тақрибан 5000 километр дуртар аз сервер) сабт шудааст. Намоише, ки шумо мебинед, асосан ба он вобаста аст оптимизатсияи муштарии веб, инчунин пуштибони зуд ва боэътимод. Ҳар вақте ки таваққуф бидуни нишондиҳандаи "боркунӣ" вуҷуд дорад, ман таваққуф мекунам, то шумо метавонед он чизеро, ки ман пахш карданӣ ҳастам, хонед.

Ҷустуҷӯ бо суръати 1 ТБ/с

Дар охир

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

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

Бо истифода аз усули қувваи бераҳмона, мо ҷустуҷӯи зуд, боэътимод ва чандирро дар як қатор гузоришҳо амалӣ кардем. Мо умедворем, ки ин ғояҳо барои лоиҳаҳои шумо муфиданд.

Таҳрир: Сарлавҳа ва матн аз "Ҷустуҷӯ дар 20 ГБ дар як сония" ба "Ҷустуҷӯ дар 1 ТБ дар як сония" иваз карда шуданд, то ин ки афзоиши кор дар тӯли чанд соли охир инъикос ёбад. Ин афзоиши суръат пеш аз ҳама бо тағирот дар намуд ва шумораи серверҳои EC2, ки мо имрӯз барои хидмат ба пойгоҳи муштариёни афзояндаи худ гузошта истодаем, вобаста аст. Тағйироте ба зудӣ меоянд, ки боз як афзоиши назарраси самаранокии амалиётро таъмин хоҳанд кард ва мо интизори мубодилаи онҳо нестем.

Манбаъ: will.com

Илова Эзоҳ