Takriban kila ombi la biashara lililofaulu mapema au baadaye huingia katika hatua ambapo kuongeza mlalo kunahitajika. Katika hali nyingi, unaweza tu kuanza mfano mpya na kupunguza wastani wa mzigo. Lakini pia kuna kesi zisizo na maana ambapo tunahitaji kuhakikisha kwamba nodes tofauti zinajua kuhusu kila mmoja na kusambaza kwa makini mzigo wa kazi.
Iligeuka kuwa bahati sana erlang, ambayo tulichagua kwa syntax yake ya kupendeza na hype karibu nayo, ina daraja la kwanza
Ujumbe unaopita kati ya michakato kwenye nodi tofauti, na vile vile kati ya viunganishi na vidhibiti, ni wazi [β¦]
Katika mazoezi, kila kitu ni ngumu zaidi. Imesambazwa erlang ilitengenezwa wakati "chombo" kilimaanisha sanduku kubwa la chuma kwa usafirishaji, na "docker" ilikuwa ni kisawe tu cha mtu wa pwani. KATIKA IP4 kulikuwa na anwani nyingi ambazo hazijachukuliwa, mapumziko ya mtandao yalisababishwa na panya kutafuna kupitia cable, na muda wa wastani wa mfumo wa uzalishaji ulipimwa kwa miongo kadhaa.
Sasa sote tunajitosheleza sana, tumepakia, na tunasambazwa erlang katika mazingira ambapo anwani za IP zenye nguvu hutolewa kwa kanuni ya ubahatishaji mkubwa, na nodi zinaweza kuonekana na kutoweka kwa kisigino cha kushoto cha kipanga ratiba. Ili kuzuia milundo ya nambari za boilerplate katika kila mradi unaoendesha iliyosambazwa erlang, ili kupambana na mazingira ya uhasama, msaada unahitajika.
Kumbuka: Ninajua kuwa kuna libcluster
Mahitaji
Nilichohitaji kibinafsi ni maktaba ambayo ingechukua usimamizi wa nguzo na ingekuwa na mali zifuatazo:
- kazi ya uwazi na orodha zote mbili zenye msimbo ngumu wa nodi na ugunduzi unaobadilika kupitia huduma erlang;
- simu inayofanya kazi kikamilifu kwa kila mabadiliko ya topolojia (nodi hapo, nodi hapa, kutokuwa na utulivu wa mtandao, mgawanyiko);
- kiolesura cha uwazi cha kuzindua nguzo yenye majina marefu na mafupi, kama ilivyo
:nonode@nohost
; - Msaada wa Docker nje ya boksi, bila kulazimika kuandika nambari ya miundombinu.
Mwisho unamaanisha kuwa baada ya kujaribu programu ndani :nonode@nohost
, au katika mazingira yaliyosambazwa kwa kutumia test_cluster_task
docker-compose up --scale my_app=3
na uone jinsi inavyofanya matukio matatu kwenye docker bila mabadiliko yoyote ya nambari. Ninataka pia programu tegemezi kama mnesia
- wakati topolojia inabadilika, nyuma ya pazia wanaunda upya nguzo moja kwa moja bila teke la ziada kutoka kwa programu.
chumbani haikukusudiwa kuwa maktaba yenye uwezo wa kila kitu kutoka kwa kuunga mkono nguzo hadi kutengeneza kahawa. Sio risasi ya fedha ambayo inalenga kufunika kesi zote zinazowezekana, au kuwa suluhisho kamili la kitaaluma kwa maana ya wanadharia kutoka. CS kuweka katika muda huu. Maktaba hii imeundwa kutumikia kusudi lililo wazi kabisa, lakini fanya kazi yake isiyo kubwa sana kikamilifu. Lengo hili litakuwa kutoa uwazi kamili kati ya mazingira ya maendeleo ya ndani na mazingira ya elastic yaliyosambazwa yaliyojaa vyombo vyenye uadui.
Mbinu iliyochaguliwa
chumbani imekusudiwa kuendeshwa kama programu, ingawa watumiaji wa hali ya juu wanaweza kufanya kazi na kusanyiko na matengenezo ya nguzo kwa kuendesha moja kwa moja. Cloister.Manager
katika mti wa msimamizi wa programu inayolengwa.
Inapoendeshwa kama programu, maktaba hutegemea config
, ambayo inasoma maadili ya msingi yafuatayo:
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
Vigezo hapo juu vinamaanisha yafuatayo: chumbani inatumika kwa programu ya OTP :my_app
, matumizi ugunduzi wa huduma ya erlang kuunganisha nodes, angalau tatu, na MyApp.Listener
moduli (utekelezaji @behaviour Cloister.Listener
Na usanidi huu, programu chumbani mapenzi MyApp.Listener.on_state_change/2
%Cloister.Monitor{status: :up}
, ambayo inamaanisha: "Habari, kikundi kimekusanyika."
Katika hali nyingi, ufungaji consensus: 3
ni sawa kwa sababu hata ikiwa tunatarajia nodi zaidi kuunganishwa, urejeshaji simu utapitia status: :rehashing
β status: :up
kwenye nodi yoyote mpya iliyoongezwa au kuondolewa.
Unapoanza katika hali ya maendeleo, unahitaji tu kuweka consensus: 1
ΠΈ chumbani ataruka kwa furaha kusubiri kwa mkusanyiko wa nguzo atakapoona :nonode@nohost
Au :node@host
Au :[email protected]
- kulingana na jinsi nodi iliundwa (:none | :shortnames | :longnames
).
Usimamizi wa Maombi Uliosambazwa
Programu zinazosambazwa zisizo katika ombwe kawaida hujumuisha vitegemezi vilivyosambazwa, kama vile mnesia
. Ni rahisi kwetu kushughulikia urekebishaji wao kutoka kwa upigaji simu sawa on_state_change/2
. Hapa, kwa mfano, ni maelezo ya kina ya jinsi ya kusanidi upya mnesia
kwenye kuruka ndani
Faida kuu ya kutumia chumbani ni kwamba hufanya shughuli zote muhimu ili kujenga upya nguzo baada ya mabadiliko ya topolojia chini ya kofia. Programu inaendeshwa tu katika mazingira ambayo tayari yamesambazwa, na nodi zote zimeunganishwa, bila kujali kama tunajua anwani za IP na kwa hivyo majina ya nodi mapema, au yamepewa/kubadilishwa kwa nguvu. Hii haitaji mipangilio maalum ya usanidi wa docker na kutoka kwa mtazamo wa msanidi programu, hakuna tofauti kati ya kukimbia katika mazingira yaliyosambazwa au kukimbia katika eneo la karibu. :nonode@nohost
. Unaweza kusoma zaidi kuhusu hili katika
Ingawa utunzaji mgumu wa mabadiliko ya topolojia unawezekana kupitia utekelezaji maalum MyApp.Listener
, kunaweza kuwa na visa vikali kila wakati ambapo mapungufu haya ya maktaba na upendeleo wa usanidi huthibitisha kuwa msingi wa utekelezaji. Ni sawa, chukua tu hapo juu libcluster
, ambayo ni madhumuni ya jumla zaidi, au hata shughulikia nguzo ya kiwango cha chini wewe mwenyewe. Lengo la maktaba hii ya msimbo sio kufunika kila hali inayowezekana, lakini kutumia hali ya kawaida bila maumivu yasiyo ya lazima na kubandika kwa nakala ngumu.
Kumbuka: katika hatua hii katika asili kulikuwa na maneno "Furaha nguzo!", Na Yandex, ambayo mimi kutafsiri (sio lazima kupitia kamusi mwenyewe), alinipa chaguo "Furaha nguzo!" Labda haiwezekani kufikiria tafsiri bora, haswa kwa kuzingatia hali ya sasa ya kisiasa ya kijiografia.
Chanzo: mapenzi.com