Cloister β†’ usimamizi rahisi wa nguzo za OTP

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.

Cloister β†’ usimamizi rahisi wa nguzo za OTP

Iligeuka kuwa bahati sana erlang, ambayo tulichagua kwa syntax yake ya kupendeza na hype karibu nayo, ina daraja la kwanza msaada kwa mifumo iliyosambazwa. Kwa nadharia, hii inasikika kuwa ndogo kabisa:

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. Ni poa sana, ina nyota zaidi ya elfu moja, mwandishi ni maarufu katika jamii, na hayo yote. Ikiwa njia zinazotolewa na kifurushi hiki za kuunda na kudumisha nguzo zinatosha kwako, ninafurahi kwako. Kwa bahati mbaya, ninahitaji mengi zaidi. Ninataka kudhibiti usanidi kwa undani na nisiwe mtazamaji wa nje katika ukumbi wa upangaji upya wa nguzo.

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, nataka kukimbia tu 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) imesanidiwa kupokea arifa kuhusu mabadiliko ya topolojia. Maelezo ya kina ya usanidi kamili yanaweza kupatikana katika nyaraka.

Na usanidi huu, programu chumbani mapenzi uzinduzi kwa hatua, kuchelewesha mchakato wa kuanza maombi kuu hadi makubaliano yamefikiwa (nodi tatu zimeunganishwa na zimeunganishwa, kama ilivyo kwenye mfano hapo juu.) Hii inatoa maombi kuu fursa ya kudhani kwamba wakati inapoanza, nguzo tayari inapatikana. Wakati wowote topolojia inabadilika (kutakuwa na nyingi, kwa sababu nodi hazianza kwa usawa), kidhibiti kitaitwa. MyApp.Listener.on_state_change/2. Mara nyingi tunafanya kitendo tunapopokea ujumbe wa hali %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@nohostAu :node@hostAu :[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 nyaraka chumbani.

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 nyaraka.

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

Kuongeza maoni