Գրեթե յուրաքանչյուր հաջողված բիզնես հավելված վաղ թե ուշ մտնում է մի փուլ, որտեղ հորիզոնական մասշտաբավորում է պահանջվում: Շատ դեպքերում դուք կարող եք պարզապես սկսել նոր օրինակ և նվազեցնել բեռի միջինը: Բայց կան նաև ավելի քիչ տրիվիալ դեպքեր, երբ մենք պետք է ապահովենք, որ տարբեր հանգույցները իմանան միմյանց մասին և ուշադիր բաշխեն ծանրաբեռնվածությունը:
Այնքան բախտավոր է ստացվել, որ էրլանգ, որը մենք ընտրել ենք իր հաճելի շարահյուսության և դրա շուրջ աղմուկի համար, ունի առաջին կարգի
Տարբեր հանգույցների վրա պրոցեսների, ինչպես նաև հղումների և մոնիտորների միջև փոխանցվող հաղորդագրությունը թափանցիկ է […]
Գործնականում ամեն ինչ մի փոքր ավելի բարդ է: Բաշխված էրլանգ մշակվել է այն ժամանակ, երբ «կոնտեյներ» նշանակում է երկաթե մեծ տուփ՝ բեռնափոխադրման համար, իսկ «նավատորմը» պարզապես երկարափնյա մարդի հոմանիշն էր: IN IP4 կային բազմաթիվ չօգտագործված հասցեներ, ցանցի խափանումները սովորաբար առաջանում էին մալուխների միջով ծամող առնետների պատճառով, և արտադրական համակարգի միջին գործունակությունը չափվում էր տասնամյակներով:
Այժմ մենք բոլորս աներևակայելի ինքնաբավ ենք, փաթեթավորված և վազում ենք բաշխված էրլանգ մի միջավայրում, որտեղ դինամիկ IP հասցեները բաժանվում են մեծ պատահականության սկզբունքով, և հանգույցները կարող են հայտնվել և անհետանալ ժամանակացույցի ձախ գարշապարի քմահաճույքով: Խուսափելու համար կաթսայատան կոդի կուտակումներից յուրաքանչյուր նախագծում, որն աշխատում է բաշխված էրլանգ, թշնամական միջավայրի դեմ պայքարելու համար անհրաժեշտ է օգնություն։
ՆշումԵս տեղյակ եմ, որ կա libcluster
Պահանջներ
Ինձ անձամբ անհրաժեշտ էր գրադարանը, որը կստանձներ կլաստերի կառավարումը և կունենար հետևյալ հատկությունները.
- թափանցիկ աշխատանք ինչպես հանգույցների կոշտ կոդավորված ցանկի, այնպես էլ ծառայությունների միջոցով դինամիկ հայտնաբերման հետ էրլանգ;
- լիովին ֆունկցիոնալ հետադարձ զանգ յուրաքանչյուր տոպոլոգիայի փոփոխության համար (հանգույց այնտեղ, հանգույց այստեղ, ցանցի անկայունություն, պառակտումներ);
- թափանցիկ ինտերֆեյս՝ երկար և կարճ անուններով կլաստերի գործարկման համար, ինչպես
:nonode@nohost
; - Docker աջակցություն տուփից դուրս՝ առանց ենթակառուցվածքի կոդ գրելու:
Վերջինս նշանակում է, որ այն բանից հետո, երբ ես փորձարկեցի հավելվածը տեղական տարածքում :nonode@nohost
, կամ արհեստականորեն բաշխված միջավայրում՝ օգտագործելով test_cluster_task
docker-compose up --scale my_app=3
և տեսեք, թե ինչպես է այն կատարում երեք օրինակ docker-ում՝ առանց կոդի որևէ փոփոխության: Ես նաև ուզում եմ կախյալ հավելվածներ, ինչպիսիք են mnesia
- երբ տոպոլոգիան փոխվում է, կուլիսների հետևում նրանք վերակառուցում են կլաստերը՝ առանց հավելվածի որևէ լրացուցիչ հարվածի:
Վան Նախատեսված չէր լինել գրադարան, որն ի վիճակի է ամեն ինչի` կլաստերից մինչև սուրճ պատրաստելը: Դա արծաթե փամփուշտ չէ, որը նպատակ ունի լուսաբանել բոլոր հնարավոր դեպքերը կամ լինել ակադեմիական ամբողջական լուծում այն առումով, որ տեսաբանները CS դնել այս տերմինի մեջ: Այս գրադարանը նախագծված է ծառայելու շատ հստակ նպատակի, բայց իր ոչ այնքան մեծ գործը կատարելապես կատարի: Այս նպատակն է լինելու ապահովել ամբողջական թափանցիկություն տեղական զարգացման միջավայրի և բաշխված առաձգական միջավայրի միջև, որը լի է թշնամական տարաներով:
Ընտրված մոտեցում
Վան նախատեսված է գործարկել որպես հավելված, չնայած առաջադեմ օգտվողները կարող են ձեռքով աշխատել կլաստերի հավաքման և սպասարկման հետ՝ ուղղակիորեն գործարկելով Cloister.Manager
թիրախային հավելվածի վերահսկիչ ծառում:
Երբ աշխատում է որպես հավելված, գրադարանը հենվում է config
, որտեղից կարդում է հետևյալ հիմնական արժեքները.
config :cloister,
otp_app: :my_app,
sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
consensus: 3, # number of nodes to consider
# the cluster is up
listener: MyApp.Listener # listener to be called when
# the ring has changed
Վերոնշյալ պարամետրերը բառացիորեն նշանակում են հետևյալը. Վան օգտագործվում է OTP հավելվածի համար :my_app
, օգտագործում erlang ծառայության բացահայտում հանգույցներ միացնելու համար, առնվազն երեք, և MyApp.Listener
մոդուլ (իրականացում @behaviour Cloister.Listener
Այս կոնֆիգուրացիայով հավելվածը Վան կամք MyApp.Listener.on_state_change/2
%Cloister.Monitor{status: :up}
, ինչը նշանակում է. «Բարև, կլաստերը հավաքված է»:
Շատ դեպքերում տեղադրումը consensus: 3
օպտիմալ է, քանի որ նույնիսկ եթե մենք ակնկալում ենք, որ ավելի շատ հանգույցներ միանան, հետ կանչը կանցնի status: :rehashing
→ status: :up
ցանկացած նոր ավելացված կամ հեռացված հանգույցի վրա:
Մշակման ռեժիմում սկսելիս պարզապես անհրաժեշտ է սահմանել consensus: 1
и Վան ուրախությամբ բաց կթողնի կլաստերի հավաքման սպասումը, երբ տեսնի :nonode@nohost
Կամ :node@host
Կամ :[email protected]
- կախված նրանից, թե ինչպես է կազմաձևվել հանգույցը (:none | :shortnames | :longnames
).
Բաշխված հավելվածների կառավարում
Բաշխված հավելվածները, որոնք վակուումում չեն, սովորաբար ներառում են բաշխված կախվածություններ, ինչպիսիք են mnesia
. Մեզ համար հեշտ է կարգավորել դրանց վերակազմավորումը նույն հետադարձ զանգից on_state_change/2
. Ահա, օրինակ, մանրամասն նկարագրություն, թե ինչպես կարելի է վերակազմավորել mnesia
թռչելիս ներս
Օգտագործման հիմնական առավելությունը Վան այն է, որ այն կատարում է բոլոր անհրաժեշտ գործողությունները տոպոլոգիայի փոփոխությունից հետո կլաստերը վերակառուցելու համար կափարիչի տակ. Հավելվածը պարզապես աշխատում է արդեն պատրաստված բաշխված միջավայրում, բոլոր հանգույցները միացված են՝ անկախ նրանից՝ մենք նախապես գիտենք IP հասցեները և հետևաբար հանգույցների անունները, թե դրանք դինամիկ կերպով նշանակվել/փոխվել են: Սա բացարձակապես չի պահանջում դոկերի կոնֆիգուրացիայի հատուկ կարգավորումներ, և հավելվածի մշակողի տեսանկյունից տարբերություն չկա բաշխված միջավայրում աշխատելու կամ տեղականում աշխատելու միջև: :nonode@nohost
. Այս մասին ավելին կարող եք կարդալ այստեղ
Չնայած տոպոլոգիայի փոփոխությունների բարդ կառավարումը հնարավոր է մաքսային իրականացման միջոցով MyApp.Listener
, միշտ կարող են լինել եզրային դեպքեր, երբ գրադարանի այս սահմանափակումները և կազմաձևման կողմնակալությունները ապացուցում են որպես իրականացման հիմնաքար: Դա լավ է, պարզապես վերցրեք վերը նշվածը libcluster
, որն ավելի ընդհանուր նշանակության է, կամ նույնիսկ ինքներդ կարգավորեք ցածր մակարդակի կլաստերը: Այս կոդերի գրադարանի նպատակն է ոչ թե լուսաբանել բոլոր հնարավոր սցենարները, այլ օգտագործել ամենատարածված սցենարը առանց ավելորդ ցավի և ծանր պատճենահանման:
Նշում: Բնօրինակում այս պահին կար «Happy clustering» արտահայտությունը, և Yandex-ը, որով ես թարգմանում եմ (ես ստիպված չեմ ինքս բառարաններով անցնել), ինձ առաջարկեց «Happy clustering» տարբերակը: Ավելի լավ թարգմանություն, հատկապես ներկայիս աշխարհաքաղաքական իրավիճակի լույսի ներքո, թերեւս անհնար է պատկերացնել:
Source: www.habr.com