Analiza e detyrave nga konferenca Hydra — balancimi i ngarkesĂ«s dhe ruajtja nĂ« memorie

Disa ditë më parë ndodhi konferenca Hydra. Djemtë nga JUG.ru Group ftuan folës të ëndrrave (Leslie Lamport! Cliff Click! Martin Kleppmann!) dhe i kushtuan dy ditë sistemeve të shpërndara dhe llogaritjeve. Kontur ishte një nga tre partnerët e konferencës. Ne biseduam në stendë, treguam për ruajtësit tanë të shpërndarë, luajtëm bingo dhe zgjidhëm detyra.

Ky Ă«shtĂ« njĂ« postim me analizĂ«n e detyrave nĂ« stendĂ«n e Konturit nga autori i tekstit. Ata qĂ« ishin nĂ« Hydra — kjo Ă«shtĂ« arsye pĂ«r t'u rikujtuar pĂ«rvojat e kĂ«ndshme, ata qĂ« nuk ishin — njĂ« mundĂ«si pĂ«r tĂ« ushtruar mendjen. big O-notacionit.

Ishte edhe njĂ« pjesĂ«marrĂ«s qĂ« ndau flipchart nĂ« slida pĂ«r tĂ« shkruar zgjidhjen e tij. Nuk po shaka — ata dorĂ«zuan pĂ«r kontroll njĂ« paketĂ« tĂ« tillĂ« letre:

Analiza e detyrave nga konferenca Hydra — balancimi i ngarkesĂ«s dhe ruajtja nĂ« memorie

Ishin gjithsej tre detyra:

  • pĂ«r zgjedhjen e replikave sipas peshave pĂ«r balancimin e ngarkesĂ«s
  • pĂ«r renditjen e rezultateve tĂ« pyetjes nĂ« njĂ« bazĂ« tĂ« dhĂ«nash in-memory
  • pĂ«r trajtimin e gjendjes nĂ« njĂ« sistem tĂ« shpĂ«rndarĂ« me topologji rrethi

Detyra 1. ClusterClient

Duhej të ofronim një algoritëm efikas për zgjedhjen e K nga N replikave të peshkuara të një sistemi të shpërndarë:

Ekipa juaj ka detyrĂ«n tĂ« zhvillojĂ« njĂ« bibliotekĂ« klienti pĂ«r njĂ« grup masiv distribucioni me N nyje. Biblioteka do tĂ« mbajĂ« gjurmĂ«t e metadatatĂ« tĂ« ndryshme tĂ« lidhura me nyjet (p.sh., latencat e tyre, shkallĂ«t e pĂ«rgjigjeve 4xx/5xx, etj.) dhe do t'u japĂ« peshĂ« flotante W1..WN atyre. PĂ«r tĂ« mbĂ«shtetur strategjinĂ« e ekzekutimit njĂ«kohĂ«sisht, biblioteka duhet tĂ« jetĂ« nĂ« gjendje tĂ« zgjedhĂ« K nga N nyje rastĂ«sisht—njĂ« shans pĂ«r t'u zgjedhur duhet tĂ« jetĂ« proporcional me peshĂ«n e njĂ« nyjeje.

Propozoni një algoritëm për të seleksionuar nyje në mënyrë efikase. Vlerësoni kompleksitetin e tij kompjuterik duke përdorur notacionin e madh O.

Pse është gjithçka në anglisht?

Sepse në këtë formë u luftuan nga pjesëmarrësit e konferencës dhe sepse anglishtja ishte gjuha zyrtare e Hydra-s. Problemet dukej kështu:

Analiza e detyrave nga konferenca Hydra — balancimi i ngarkesĂ«s dhe ruajtja nĂ« memorie

Merrni njĂ« letĂ«r dhe njĂ« laps, mendoni, mos u nxehni pĂ«r tĂ« hapur menjĂ«herĂ« spoilerĂ«t 🙂

Analiza e zgjidhjes (video)

Fillimi në 5:53, gjithsej 4 minuta:

Luaj videon

Këtu si e pitchuan zgjidhjen e tyre ata të njëjtit tip me flipchart:

Luaj videon

Analiza e zgjidhjes (tekst)

NjĂ« zgjidhje qĂ« shfaqet Ă«shtĂ«: tĂ« pĂ«rmbledhim peshat e tĂ« gjitha replika, tĂ« gjenerojmĂ« njĂ« numĂ«r tĂ« rastĂ«sishĂ«m nga 0 deri nĂ« shumĂ«n e tĂ« gjitha peshave, pastaj tĂ« zgjedhim njĂ« replikĂ« i, nĂ« mĂ«nyrĂ« qĂ« shumĂ«n e peshave tĂ« replikave nga 0 deri nĂ« (i-1)-en tĂ« jetĂ« mĂ« pak se numri i rastĂ«sishĂ«m, ndĂ«rsa shumĂ«n e peshave tĂ« replikave nga 0 deri nĂ« i-tĂ« tĂ« jetĂ« mĂ« shumĂ« se ai. KĂ«shtu do tĂ« kemi zgjedhur njĂ« replikĂ«, dhe pĂ«r tĂ« zgjedhur tĂ« ardhshmen, duhet tĂ« pĂ«rsĂ«risim tĂ«rĂ« procedurĂ«n, pa marrĂ« parasysh replikĂ«n e zgjedhur. Me njĂ« algoritĂ«m tĂ« tillĂ«, kompleksiteti i zgjedhjes sĂ« njĂ« replike Ă«shtĂ« O(N), kompleksiteti i zgjedhjes sĂ« K replikave Ă«shtĂ« O(N·K) ~ O(NÂČ).

Analiza e detyrave nga konferenca Hydra — balancimi i ngarkesĂ«s dhe ruajtja nĂ« memorie

Kompleksiteti katror Ă«shtĂ« i keq, megjithatĂ« ai mund tĂ« pĂ«rmirĂ«sohet. PĂ«r kĂ«tĂ«, do tĂ« ndĂ«rtojmĂ« njĂ« pemĂ« segmentesh pĂ«r shumat e peshave. Do tĂ« rezultojĂ« njĂ« pemĂ« me thellĂ«si lg N, nĂ« gjethet e sĂ« cilĂ«s do tĂ« jenĂ« peshat e replikave, ndĂ«rsa nĂ« nodet e tjera — shumat pjesore, deri nĂ« shumĂ«n e tĂ« gjitha peshave nĂ« rrĂ«njĂ«n e pemĂ«s. MĂ« pas, gjenerojmĂ« njĂ« numĂ«r tĂ« rastĂ«sishĂ«m nga 0 deri nĂ« shumĂ«n e tĂ« gjitha peshave, gjejmĂ« replikĂ«n e i-tĂ«, e heqim atĂ« nga pema dhe pĂ«rsĂ«risim procedurĂ«n pĂ«r tĂ« kĂ«rkuar replikat e mbetura. Me njĂ« algoritĂ«m tĂ« tillĂ«, kompleksiteti i ndĂ«rtimit tĂ« pemĂ«s Ă«shtĂ« O(N), kompleksiteti i kĂ«rkimit tĂ« replikĂ«s sĂ« i-tĂ« dhe heqjes sĂ« saj nga pema Ă«shtĂ« O(lg N), kompleksiteti i zgjedhjes sĂ« K replikave Ă«shtĂ« O(N + K lg N) ~ O(N lg N).

Analiza e detyrave nga konferenca Hydra — balancimi i ngarkesĂ«s dhe ruajtja nĂ« memorie

Kompleksi linear-logarithmik është më i këndshëm se ai katror, veçanërisht për K të mëdha.

Ky algoritëm është implementuar në kodin të bibliotekës ClusterClient nga projekti "Vostok". (Atje nd Build tree në O(N lg N), por kjo nuk ndikon në kompleksitetin përfundimtar të algoritmit.)

Detyra 2. Zebra

Duhej propozuar një algoritëm efikas për renditjen e dokumenteve në memorie sipas një fushe të rastësishme të pa indeksuar:

Ekipi juaj është i ngarkuar me zhvillimin e një baze të dhënash dokumentesh të ndara në memorie. Një ngarkesë e zakonshme do të ishte të zgjidhni N dokumentet më të mira të renditura sipas një fushe numerike (jo-indeksuar) të rastësishme nga një koleksion me madhësi M (zakonisht N < 100 << M). Një ngarkesë pak më pak të zakonshme do të ishte të zgjidhni N dokumentet më të mira pas skipping S dokumenteve të parë (S ~ N).

Propozoni një algoritëm për të ekzekutuar këto kërkesa në mënyrë efikase. Vlerësoni kompleksitetin e tij kompjuterik duke përdorur notacionin e madh O në rastin mesatar dhe në skenarët më të keq.

Analiza e zgjidhjes (video)

Fillimi në 34:50, gjithsej 6 minuta:

Luaj videon

Analiza e zgjidhjes (tekst)

Zgjidhja është sipërfaqësore: renditni të gjithë dokumentet (për shembull, duke përdorur quicksort), pastaj merrni dokumentet N+S. Në këtë rast kompleksiteti i renditjes në mesatar është O(M lg M), në më të keqin është O(M2).

E qartĂ«, se renditja e tĂ« gjithĂ« M dokumenteve, pĂ«r tĂ« marrĂ« pastaj vetĂ«m njĂ« pjesĂ« tĂ« vogĂ«l prej tyre — Ă«shtĂ« joefikase. PĂ«r tĂ« mos renditur tĂ« gjithĂ« dokumentet, do tĂ« pranohej algoritmi quickselect, i cili do tĂ« zgjedhĂ« N+S dokumentet e nevojshme (ato mund tĂ« grumbullohen pĂ«rmes çdo algoritmi). NĂ« kĂ«tĂ« rast, kompleksiteti mesatar do tĂ« zvogĂ«lohet nĂ« O(M), ndĂ«rsa rasti mĂ« i keq do tĂ« mbetet i njĂ«jtĂ«.

MegjithatĂ«, Ă«shtĂ« e mundur ta bĂ«ni edhe mĂ« efikas — duke pĂ«rdorur algoritmin binary heap streaming. NĂ« kĂ«tĂ« rast, dokumentet e para N+S vendosen nĂ« min- ose max-heap (nĂ« varĂ«si tĂ« drejtimit tĂ« renditjes), dhe mĂ« pas çdo dokument tjetĂ«r krahasohet me rrĂ«njĂ«n e pemĂ«s, ku ndodhet dokumenti minimal ose maksimal pĂ«r momentin, dhe, nĂ«se Ă«shtĂ« e nevojshme, shtohet nĂ« pemĂ«. NĂ« kĂ«tĂ« rast, kompleksiteti nĂ« rastin mĂ« tĂ« keq, kur duhet tĂ« rindĂ«rtohet vazhdimisht pemĂ« — O(M lg M), kompleksiteti mesatar — O(M), ashtu siç ndodh me quickselect.

Megjithatë, heap streaming rezulton më efektiv për shkak se në praktikë shumicën e dokumenteve arrijmë t'i heqim dorë pa e rindërtuar grumbullin, pas një krahasimi të vetëm me elementin e saj rrënjësor. Kjo renditje është implementuar në bazën e të dhënave dokumentare in-memory Zebra, e cila është zhvilluar dhe përdorur në Kontur.

Detyra 3. Këmbimet e gjendjeve

Duhej të propozohej algoritmi më efikas për zhvendosjen e gjendjeve:

Ekipa juaj Ă«shtĂ« ngarkuar me zhvillimin e njĂ« mekanizmi tĂ« avancuar tĂ« shkĂ«mbimit tĂ« gjendjes pĂ«r njĂ« grup tĂ« shpĂ«rndarĂ« prej N nodesh. Gjendja e nodit tĂ« i-tĂ« duhet tĂ« transferohet te nodi (i+1)-tĂ«, gjendja e nodit N duhet tĂ« transferohet te nodi i parĂ«. Operacioni i vetĂ«m i mbĂ«shtetur Ă«shtĂ« shkĂ«mbimi i gjendjes kur dy node shkĂ«mbejnĂ« gjendjet e tyre nĂ« mĂ«nyrĂ« atomike. Dihet se njĂ« shkĂ«mbim gjendje zgjat M milisekonda. Çdo nod Ă«shtĂ« nĂ« gjendje tĂ« marrĂ« pjesĂ« nĂ« njĂ« shkĂ«mbim gjendjeje nĂ« çdo moment tĂ« caktuar.

Sa kohë duhet për të transferuar gjendjet e të gjitha nodeve në një grup?

Analiza e zgjidhjes (tekst)

Zgjidhja në sipërfaqe: shkëmbimi i gjendjeve të elementit të parë dhe të dytë, pastaj të parit dhe të tretë, pastaj të parit dhe të katërt, dhe kështu me radhë. Pas çdo shkëmbimi, gjendja e një elementi do të jetë në pozitat e duhura. Do të duhen O(N) radhitje dhe do të shpenzohen O(N·M) kohë.

Analiza e detyrave nga konferenca Hydra — balancimi i ngarkesĂ«s dhe ruajtja nĂ« memorie

Koha lineare është shumë e gjatë, prandaj mund të shkëmbejmë gjendjet e elementeve çift: të parin me të dytin, të tretin me të katërtin dhe kështu me radhë. Pas çdo shkëmbimi, gjendja e çdo elementi të dytë do të jetë në pozitat e duhura. Do të duhen O(lg N) radhitje dhe do të shpenzohen O(M lg N) kohë.

Analiza e detyrave nga konferenca Hydra — balancimi i ngarkesĂ«s dhe ruajtja nĂ« memorie

Megjithatë, mund të bëni një zhvendosje edhe më efikase - jo në kohë lineare, por në kohë konstante. Për këtë, në hapin e parë, duhet të këmbeni gjendjen e elementit të parë me atë të fundit, të dytin me të parafundin dhe kështu me radhë. Gjendja e elementit të fundit do të përfundojë në pozitat e duhura. Tani duhet të këmbeni gjendjen e elementit të dytë me atë të fundit, të tretë me atë të parafundit dhe kështu me radhë. Pas këtij raundi të këmbimeve, gjendjet e të gjithë elementeve do të jenë në pozitat e duhura. Në total, do të bëhen O(2M) ~ O(1) shkëmbime.

Analiza e detyrave nga konferenca Hydra — balancimi i ngarkesĂ«s dhe ruajtja nĂ« memorie

Kjo zgjidhje nuk do ta befasojë fare matematikun që ende e mban mend se rrotullimi është një kompozim i dy simetrive aksiale. Për më tepër, ajo përshtatet në mënyrë triviale për zhvendosjen jo për një, por për K < N pozita. (Shkruani në komentet se si ndodhi.)

Ju pëlqyen këto detyra? Dini zgjidhje të tjera? Ndani në komente.

Ja disa lidhje të dobishme përfundimisht:

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster