Nuodugnus įvadas į paskirstytas sistemas

Kas yra paskirstytoji sistema ir kodėl ji tokia sudėtinga?

Pasaulyje vis didėjant technologinei plėtrai, paskirstytos sistemos tampa vis plačiau paplitusios. Tai didžiulė ir sudėtinga informatikos studijų sritis.

Šiuo straipsniu siekiama supažindinti jus su paskirstytomis sistemomis pagrindiniu būdu, parodant žvilgsnį į skirtingų kategorijų tokias sistemas, tačiau nesigilinant į detales.

Kas yra paskirstyta sistema?

Paprasčiausia apibrėžta paskirstytoji sistema yra kompiuterių grupė, dirbanti kartu, kad galutiniam vartotojui pasirodytų kaip vienas kompiuteris.

Šios mašinos turi bendrą būseną, veikia vienu metu ir gali sugesti nepriklausomai, nepaveikdamos visos sistemos veikimo laiko.

Siūlau palaipsniui naudoti sistemos paskirstymo pavyzdį, kad galėtumėte geriau suprasti visa tai:

Eikime su duomenų baze! Tradicinės duomenų bazės saugomos vieno kompiuterio failų sistemoje, kai tik norite į ją įkelti / įterpti informaciją - jūs kalbate tiesiogiai su ta mašina.

Kad galėtume platinti šią duomenų bazių sistemą, mums reikia, kad ši duomenų bazė būtų paleista keliose mašinose vienu metu. Vartotojas turi mokėti kalbėtis su bet kuria pasirinkta mašina ir neturėtų turėti galimybės pasakyti, kad jis nekalba su viena mašina - jei jis įterpia įrašą į mazgą Nr. 1, mazgas Nr. 3 turi sugebėti grąžinti tą įrašą.

Kodėl verta platinti sistemą?

Sistemos visada paskirstomos pagal būtinybę. Tiesa yra ta, kad paskirstytų sistemų valdymas yra sudėtinga tema, kurioje pilna spąstų ir minų. Diegti, prižiūrėti ir derinti paskirstytas sistemas yra galvos skausmas, tad kam ten apskritai eiti?

Tai, ką jums leidžia paskirstyta sistema, yra mastelis horizontaliai . Grįžtant prie ankstesnio vieno duomenų bazės serverio pavyzdžio, vienintelis būdas tvarkyti didesnį srautą būtų atnaujinti aparatinę įrangą, kurioje veikia duomenų bazė. Tai vadinama vertikaliu masteliu .

Vertikaliai keisti mastelį yra gerai, o jūs galite, tačiau po tam tikro momento pamatysite, kad net geriausios aparatūros nepakanka pakankamam srautui, jau nekalbant apie tai, kad nepraktiška priimti.

Mastelio keitimas horizontaliai reiškia tiesiog pridėti daugiau kompiuterių, o ne atnaujinti vieno kompiuterio aparatinę įrangą.

Tai yra žymiai pigiau nei vertikalus mastelis po tam tikros ribos, tačiau tai nėra pagrindinis jo pasirinkimas.

Vertikalus mastelis gali pagerinti jūsų našumą tik atsižvelgiant į naujausias aparatinės įrangos galimybes. Šios galimybės yra nepakankamos technologinėms įmonėms, turinčioms vidutinį ar didelį darbo krūvį.

Geriausias dalykas, susijęs su horizontaliu masteliu, yra tai, kad jūs neturite dangtelio, pagal kurį galite keisti mastelį - kai prastėja našumas, paprasčiausiai pridedate kitą mašiną, potencialiai iki begalybės.

Lengvas mastelio keitimas nėra vienintelė nauda, ​​kurią gaunate iš paskirstytų sistemų. Gedimų tolerancija ir mažas delsimas taip pat yra vienodai svarbūs.

Gedimų tolerancija - dešimties mašinų grupė dviejuose duomenų centruose iš esmės yra atsparesnė trikdžiams nei viena mašina. Net jei vienas duomenų centras užsidegtų, jūsų programa vis tiek veiks.

Maža vėlavimo trukmė - laikas, kai tinklo paketas keliauja po pasaulį, fiziškai ribojamas šviesos greičio. Pvz., Trumpiausias įmanomas prašymo kelionės į abi puses laikas (tai yra pirmyn ir atgal) šviesolaidžio kabeliu tarp Niujorko ir Sidnėjaus yra 160 ms. Paskirstytos sistemos leidžia turėti mazgą abiejuose miestuose, leidžiant srautui patekti į arčiausiai jo esantį mazgą.

Tačiau norint, kad paskirstyta sistema veiktų, reikia, kad tose mašinose veikianti programinė įranga būtų specialiai sukurta veikti keliuose kompiuteriuose vienu metu ir spręsti su ja susijusias problemas. Pasirodo, tai nėra lengvas žygdarbis.

Mūsų duomenų bazės mastelio keitimas

Įsivaizduokite, kad mūsų žiniatinklio programa tapo beprotiškai populiari. Taip pat įsivaizduokite, kad mūsų duomenų bazė pradėjo gauti dvigubai daugiau užklausų per sekundę, nei ji gali patenkinti. Programos našumas tuoj pat pradės mažėti ir tai pastebės jūsų vartotojai.

Dirbkime kartu ir sukurkime savo duomenų bazės mastą, kad atitiktų mūsų aukštus reikalavimus.

Įprastoje žiniatinklio programoje informaciją skaitote daug dažniau, nei įterpiate naują ar modifikuojate seną.

Yra būdas padidinti skaitymo efektyvumą, tai yra vadinamoji pirminės replikos replikacijos strategija. Čia sukuriate du naujus duomenų bazių serverius, kurie sinchronizuojami su pagrindiniu. Svarbiausia yra tai, kad galite skaityti tik iš šių naujų atvejų.

Kai įterpiate ar keičiate informaciją, kalbate su pagrindine duomenų baze. Savo ruožtu jis asinchroniškai informuoja pakeitimo kopijas ir jos taip pat išsaugo.

Sveikiname, dabar galite atlikti 3 kartus daugiau skaitytų užklausų! Argi ne puiku?

Spąstai

Gotcha! Mes iš karto praradome C reliacinės duomenų bazės ACID garantijose, kurios reiškia nuoseklumą.

Matote, dabar egzistuoja galimybė, kai į duomenų bazę įterpiame naują įrašą, iškart po to pateikiame jo skaitymo užklausą ir nieko negrąžiname, tarsi jo nebūtų!

Naujos informacijos platinimas iš pirminės į repliką vyksta ne iš karto. Iš tikrųjų egzistuoja laiko langas, kuriame galite gauti pasenusią informaciją. Jei taip nebūtų, nukentėtų jūsų rašymo našumas, nes jis turėtų sinchroniškai laukti, kol duomenys bus platinami.

Paskirstytose sistemose yra keletas kompromisų. Šiuo konkrečiu klausimu turėsite gyventi, jei norite tinkamai išplėsti mastelį.

Tęsiant mastelį

Naudodamiesi replikų duomenų bazės metodu, mes galime tam tikru mastu horizontaliai keisti skaitymo srautą. Tai puiku, bet mes pasiekėme sieną dėl mūsų rašymo srauto - vis tiek viskas viename serveryje!

Mums čia nėra daug galimybių. Mes tiesiog turime suskirstyti savo rašymo srautą į kelis serverius, nes vienas negali jo valdyti.

Vienas iš būdų yra rinktis daugiasluoksnę replikacijos strategiją. Ten vietoj kopijų, iš kurių galite skaityti, turite kelis pagrindinius mazgus, kurie palaiko skaitymą ir rašymą. Deja, tai greitai tampa sudėtinga, nes dabar jūs galite sukurti konfliktus (pvz., Įterpti du įrašus su tuo pačiu ID).

Eikime su kita technika, vadinama skaldymu(dar vadinamas skaidymu ).

Su dalijimu jūs padalijate savo serverį į kelis mažesnius serverius, vadinamus skeveldromis. Visi šie skeveldros turi skirtingus įrašus - jūs sukuriate taisyklę, kokie įrašai į kokią skaldą patenka. Labai svarbu sukurti tokią taisyklę, kad duomenys būtų paskleisti vienodai .

Galimas būdas tai apibrėžti diapazonus pagal tam tikrą informaciją apie įrašą (pvz., Vartotojai, kurių vardas AD).

Šį skaldymo raktą reikėtų rinktis labai atsargiai, nes apkrova ne visada yra vienoda, atsižvelgiant į savavališkus stulpelius. (pvz., daugiau žmonių turi vardą, prasidedantį raide C, o ne Z ). Viena skeveldra, gaunanti daugiau užklausų nei kiti, vadinama karšta vieta ir jos reikia vengti. Išskaidžius duomenis, duomenų skaidymas tampa nepaprastai brangus ir gali sukelti didelę prastovą, kaip buvo nutikęs liūdnai pagarsėjęs „FourSquare“ 11 valandų darbo laikas.

Kad pavyzdys būtų paprastas, tarkime, kad mūsų klientas (programa „Rails“) žino, kurią duomenų bazę naudoti kiekvienam įrašui. Taip pat verta paminėti, kad yra daug skaldymo strategijų, ir tai yra paprastas pavyzdys, kuris iliustruoja koncepciją.

Šiuo metu mes laimėjome gana daug - mes galime padidinti savo rašymo srautą N kartus, kur N yra šukių skaičius. Tai praktiškai nesuteikia mums beveik jokios ribos - įsivaizduokite, kaip smulkiai suplanuoti galime gauti šį skaidymą.

Spąstai

Viskas programinės įrangos inžinerijos srityje yra daugiau ar mažiau kompromisas ir tai nėra išimtis. Dalijimasis nėra paprastas žygdarbis, jo geriausia vengti, kol to tikrai nereikia.

Dabar pateikėme užklausas raktaisišskyrus skaidytą raktą, neįtikėtinai neefektyvus (jiems reikia pereiti visas skeveldras). SQL JOINužklausos yra dar blogesnės, o sudėtingos tampa praktiškai nenaudojamos.

Decentralizuotas ir paskirstytas

Prieš eidami toliau, norėčiau atskirti abu terminus.

Nors žodžiai skamba panašiai ir galima daryti išvadą, kad logiškai reiškia tą patį, jų skirtumas daro reikšmingą technologinį ir politinį poveikį.

Decentralizuotas principas vis dar yra paskirstytas technine prasme, tačiau visos decentralizuotos sistemos nepriklauso vienam veikėjui. Nė viena įmonė negali turėti decentralizuotos sistemos, kitaip ji nebebūtų decentralizuota.

Tai reiškia, kad dauguma sistemų, kuriomis mes šiandien pereisime, gali būti laikomos paskirstytomis centralizuotomis sistemomis - būtent tuo jos ir yra sukurtos.

Jei gerai pagalvoji - decentralizuotą sistemą sukurti yra sunkiau, nes tada reikia spręsti atvejį, kai kai kurie dalyviai yra piktybiški. Tai nėra įprastu paskirstytųjų sistemų atvejis, nes žinote, kad jums priklauso visi mazgai.

Pastaba: Šis apibrėžimas buvo daug diskutuojamas ir jį galima supainioti su kitais (bendraamžiais, federaciniais). Ankstyvojoje literatūroje tai taip pat apibrėžta kitaip. Nepaisant to, ką aš jums daviau kaip apibrėžimą, manau, kad yra plačiausiai naudojama dabar, kai „blockchain“ ir kriptovaliutos išpopuliarino šį terminą.

Paskirstytos sistemos kategorijos

Dabar mes eisime per keletą paskirstytų sistemų kategorijų ir surašysime jų didžiausią viešai žinomą gamybos paskirtį. Turėkite omenyje, kad dauguma pateiktų skaičių yra pasenę ir tikriausiai yra žymiai didesni, kai skaitote.

Paskirstytų duomenų parduotuvės

Paskirstytų duomenų parduotuvės yra plačiausiai naudojamos ir pripažįstamos kaip paskirstytos duomenų bazės. Dauguma paskirstytų duomenų bazių yra „NoSQL“ nesusijusios su duomenų bazėmis, apsiribojančios pagrindinės vertės semantika. Jie užtikrina neįtikėtiną našumą ir mastelį nuoseklumo ar prieinamumo kaina.

Žinoma skalė - žinoma, kad „Apple“ naudoja 75 000 „Apache Cassandra“ mazgų, saugančių daugiau nei 10 petabaitų duomenų, dar 2015 m.

Negalime pradėti diskusijų apie paskirstytas duomenų saugyklas, prieš tai nepateikdami BŽŪP teoremos.

BŽŪP teorema

Įrodyta dar 2002 m., BŽŪP teoremoje teigiama, kad paskirstyta duomenų saugykla vienu metu negali būti nuosekli, prieinama ir tolerantiška skaidiniams.

Keli greiti apibrėžimai:

  • Nuoseklumas - tai, ko jūs skaitote ir rašote nuosekliai, yra tai, ko tikimasi (prisiminkite „getcha“ su duomenų bazės replikacija prieš kelias pastraipas?)
  • Prieinamumas - visa sistema nemiršta - kiekvienas nesugedęs mazgas visada pateikia atsakymą.
  • Tolerantiškas skaidiniams - nepaisant tinklo skaidinių, sistema ir toliau veikia ir palaiko savo nuoseklumo / prieinamumo garantijas

Tiesą sakant, bet kokiam paskirstytam duomenų saugyklai turi būti nustatyta skaidymo tolerancija. Kaip minėta daugelyje vietų, iš kurių vienas yra puikus straipsnis, jūs negalite turėti nuoseklumo ir prieinamumo be tolerancijos pertvaroms.

Pagalvokite apie tai: jei turite du mazgus, kurie priima informaciją ir jų ryšys nutrūksta - kaip jie abu bus pasiekiami ir tuo pačiu užtikrins nuoseklumą? Jie negali žinoti, ką daro kitas mazgas, todėl jie gali tapti neprisijungę (nepasiekiami) arba dirbti su pasenusia informacija (nenuosekli) .

Galų gale jums belieka pasirinkti, ar norite, kad jūsų sistema būtų labai nuosekli ar labai prieinama tinklo skaidinyje .

Praktika rodo, kad dauguma programų labiau vertina prieinamumą. Nebūtinai visada reikia tvirto nuoseklumo. Net tada tas kompromisas nebūtinai atliekamas dėl to, kad jums reikia 100% prieinamumo garantijos, o dėl to, kad tinklo vėlavimas gali būti problema, kai reikia sinchronizuoti mašinas, kad būtų pasiektas tvirtas nuoseklumas. Dėl šių ir daugiau veiksnių programos dažniausiai renkasi sprendimus, kurie yra labai prieinami.

Tokios duomenų bazės atsiskaito su silpniausiu nuoseklumo modeliu - galimu nuoseklumu (stipraus ir galimo nuoseklumo paaiškinimu) . Šis modelis užtikrina, kad, jeigu nėra naujų atnaujinimų yra pagaminti tam tikrą elementą, galiausiai visi prieina prie to elemento grįš naujausią atnaujintą vertę.

Šios sistemos suteikia BASE savybes (skirtingai nuo tradicinių duomenų bazių ACID)

  • B asically vailable - Sistema visada grąžina atsakymą
  • S dažnai būklė - Sistema gali keistis, kai, net laikais joks įvesties (dėl galimo nuoseklumo)
  • E ventualinis nuoseklumas - jei nebus įvesties, duomenys anksčiau ar vėliau pasklis į visus mazgus, taigi taps nuoseklūs

Tokių prieinamų paskirstytų duomenų bazių pavyzdžiai - „Cassandra“, „Riak“, „Voldemort“

Žinoma, yra ir kitų duomenų saugyklų, kurios teikia pirmenybę tvirtesniam nuoseklumui - „HBase“, „Couchbase“, „Redis“, „Zookeeper“

BŽŪP teorema yra verta kelių straipsnių atskirai - kai kurie yra susiję su tuo, kaip galite patobulinti sistemos BŽŪP ypatybes, priklausomai nuo to, kaip klientas elgiasi, o kiti, kaip ji nėra tinkamai suprantama.

Kasandra

„Cassandra“, kaip minėta pirmiau, yra paskirstyta „No-SQL“ duomenų bazė, teikianti pirmenybę AP savybėms iš BŽŪP, atsiskaitant galimai nuosekliai. Turiu pripažinti, kad tai gali būti šiek tiek klaidinantis, nes „Cassandra“ yra labai konfigūruojama - galite priversti ją suteikti tvirtą nuoseklumą ir prieinamumo sąskaita, tačiau tai nėra jo įprastas naudojimo atvejis.

„Cassandra“ naudoja nuoseklų maišymą, kad nustatytų, kurie mazgai iš jūsų klasterio turi tvarkyti duomenis, kuriuos perduodate. Jūs nustatote replikacijos koeficientą , kuris iš esmės nurodo, kiek mazgų norite pakartoti savo duomenis.

Skaitydami skaitysite tik iš tų mazgų.

„Cassandra“ yra masiškai keičiama, suteikianti absurdiškai aukštą rašymo pralaidumą.

Nors ši schema gali būti neobjektyvi ir panašu, kad ji palygina „Cassandra“ su duomenų bazėmis, nustatytomis siekiant užtikrinti tvirtą nuoseklumą (kitaip aš nesuprantu, kodėl „MongoDB“ sumažintų našumą atnaujinus nuo 4 iki 8 mazgų), tai vis tiek turėtų parodyti, kas tinkamai nustatyta „Cassandra“ klasteris sugeba.

Nepaisant to, paskirstytųjų sistemų kompromise, kuris leidžia horizontaliai keisti mastą ir neįtikėtinai didelį pralaidumą, „Cassandra“ nepateikia kai kurių pagrindinių ACID duomenų bazių ypatybių, būtent operacijų.

Sutarimas

Duomenų bazių operacijas sudėtinga įgyvendinti paskirstytose sistemose, nes kiekvienam mazgui reikia susitarti dėl teisingų veiksmų (nutraukti ar atlikti). Tai vadinama sutarimu ir tai yra pagrindinė problema paskirstytose sistemose.

Pasiekti tokio tipo susitarimą, kuris reikalingas problemai „įvykdyti operaciją“ yra paprasta, jei dalyvaujantys procesai ir tinklas yra visiškai patikimi. Tačiau tikrose sistemose yra daugybė galimų gedimų, tokių kaip proceso strigtis, tinklo skaidymas ir pamesti, iškraipyti ar pasikartojantys pranešimai.

Tai kelia problemą - įrodyta, kad neįmanoma garantuoti, kad per patikimą tinkamo laiko tarpą nepasiekiamas tinkamas sutarimas.

Tačiau praktiškai yra algoritmų, kurie gana greitai pasiekia sutarimą dėl nepatikimo tinklo. „Cassandra“ iš tikrųjų teikia lengvus sandorius naudodama „Paxos“ algoritmą paskirstytam sutarimui.

Paskirstyta kompiuterija

Paskirstytasis skaičiavimas yra raktas į didelių duomenų apdorojimo antplūdį, kurį matėme pastaraisiais metais. Tai yra milžiniškos užduoties (pvz., Sujungti 100 milijardų įrašų), kurią praktiškai vienas atskiras kompiuteris negali atlikti pats, padalijimo į daugelį mažesnių užduočių, kurių kiekviena gali tilpti į vieną prekių mašiną, technika. Jūs padalijote savo didžiulę užduotį į daugybę mažesnių, nurodėte jas atlikti daugelyje mašinų lygiagrečiai, tinkamai apibendrinkite duomenis ir išsprendėte savo pradinę problemą. Šis metodas vėl leidžia jums keisti mastelį horizontaliai - kai turite didesnę užduotį, tiesiog įtraukite daugiau mazgų į skaičiavimą.

Žinoma skalė - „Folding @ Home“ 2012 m. Turėjo 160 tūkst. Aktyvių mašinų

Ankstyvas šios erdvės novatorius buvo „Google“, kuri dėl didelio duomenų kiekio turėjo sugalvoti naują paskirstyto skaičiavimo paradigmą - „MapReduce“. Apie tai jie paskelbė 2004 m., O atvirojo kodo bendruomenė vėliau pagal tai sukūrė „Apache Hadoop“.

„MapReduce“

„MapReduce“ galima paprasčiausiai apibrėžti kaip du žingsnius - duomenų susiejimą ir sumažinimą iki kažko prasmingo.

Pažvelkime į tai dar kartą su pavyzdžiu:

Tarkime, kad esame vidutiniai ir didžiulę informaciją sandėliavimo tikslais saugojome antrinėje paskirstytoje duomenų bazėje. Norime gauti duomenis apie kiekvieną dieną išleistų spustelėjimų skaičių per 2017 m. Balandžio mėn. (Prieš metus).

Šis pavyzdys yra kuo trumpesnis, aiškesnis ir paprastesnis, tačiau įsivaizduokite, kad dirbame su daugybe duomenų (pvz., Analizuojame milijardus plojimų). Mes akivaizdžiai nesaugosime visos šios informacijos vienoje mašinoje ir neanalizuosime viso to tik su viena mašina. Mes taip pat neklausime gamybos duomenų bazės, o kai kurios „sandėlio“ duomenų bazės, sukurtos specialiai žemo prioriteto darbo neprisijungus darbams.

Kiekviena žemėlapio užduotis yra atskiras mazgas, transformuojantis kuo daugiau duomenų. Kiekviena užduotis pereina visus nurodytame saugojimo mazge esančius duomenis ir susieja juos su paprasta datos ir pirmojo skaičiaus kartele. Tada atliekami trys tarpiniai veiksmai (apie kuriuos niekas nekalba) - Maišyti, Rūšiuoti ir Skirstyti. Jie iš esmės toliau tvarko duomenis ir ištrina juos atitinkamam sumažintam darbui. Kalbant apie didelius duomenis, kiekvienas „Reduce“ darbas yra atskirtas, kad dirbtų tik vieną dieną.

Tai yra gera paradigma ir stebėtinai suteikia galimybę su ja daug nuveikti - galite susieti kelis „MapReduce“ darbus, pavyzdžiui.

Geresnės technikos

„MapReduce“ šiais laikais yra šiek tiek palikta ir kelia tam tikrų problemų. Kadangi tai veikia paketais (darbais), iškyla problema, jei nepavykus darbui - reikia iš naujo paleisti viską. Nesėkmingas 2 valandų darbas gali sulėtinti visą duomenų apdorojimo procesą ir to nenorite bent jau, ypač piko metu.

Kitas klausimas yra laikas, kai laukiate, kol gausite rezultatus. Realaus laiko analitinėse sistemose (kurios visos turi didelius duomenis ir todėl naudoja paskirstytą skaičiavimą) svarbu, kad jūsų naujausi sugadinti duomenys būtų kuo naujesni ir tikrai ne prieš kelias valandas.

Taigi atsirado kitų architektūrų, kurios sprendžia šias problemas. Būtent „Lambda Architecture“ (paketinio apdorojimo ir srauto apdorojimo mišinys) ir „Kappa Architecture“ (tik srauto apdorojimas). Šie laimėjimai šioje srityje atnešė naujų įrankių, leidžiančių juos įgalinti - „Kafka Streams“, „Apache Spark“, „Apache Storm“, „Apache Samza“.

Paskirstytos failų sistemos

Paskirstytos failų sistemos gali būti laikomos paskirstytomis duomenų saugyklomis. Jie yra tas pats, kas sąvoka - saugoti ir prieiti prie didelio duomenų kiekio mašinų grupėje, kuri atrodo viena. Paprastai jie eina kartu su paskirstytuoju kompiuteriu.

Žinoma skalė - „Yahoo“ yra žinoma, kad veikia HDFS daugiau nei 42 000 mazgų, kad būtų galima saugoti 600 petabaitų duomenis, dar 201

„Wikipedia“ apibrėžia skirtumą, nes paskirstytos failų sistemos leidžia pasiekti failus naudojant tas pačias sąsajas ir semantiką kaip ir vietiniai failai, o ne per pasirinktinę API, pvz., „Cassandra Query Language“ (CQL).

HDFS

„Hadoop Distributed File System“ (HDFS) yra paskirstytoji failų sistema, naudojama paskirstytam skaičiavimui per „Hadoop“ sistemą. Puikiai pritaikytas, jis naudojamas dideliems failams (GB arba TB dydžio) saugoti ir dauginti daugelyje mašinų.

Jos architektūrą daugiausia sudaro „ NameNodes“ ir „ DataNodes“ . „NameNodes“ yra atsakingi už metaduomenų apie klasterį saugojimą, pvz., Kuriame mazge yra kokie failų blokai. Jie veikia kaip tinklo koordinatoriai, išsiaiškindami, kur geriausiai saugoti ir pakartoti failus, stebėdami sistemos būklę. „DataNodes“ paprasčiausiai saugo failus ir vykdo komandas, pvz., Atkartojant failą, parašant naują ir kitus.

Nenuostabu, kad HDFS geriausiai naudoti su „Hadoop“ skaičiavimams, nes tai suteikia duomenų supratimą apie skaičiavimo darbus. Minėti darbai bus paleisti ant mazgų, kuriuose saugomi duomenys. Tai pasitelkia duomenų lokalumą - optimizuoja skaičiavimus ir sumažina srauto kiekį tinkle.

IPFS

Tarpplanetinė failų sistema (IPFS) yra naujas įdomus „peer-to-peer“ protokolas / tinklas paskirstytai failų sistemai. Pasinaudodamas „Blockchain“ technologija, jis gali pasigirti visiškai decentralizuota architektūra, kurioje nėra nei vieno savininko, nei gedimo taško.

IPFS siūlo pavadinimų sistemą (panašią į DNS), vadinamą IPNS, ir leidžia vartotojams lengvai pasiekti informaciją. Jis saugo failą naudodamas istorinę versiją, panašiai kaip tai daro „Git“. Tai leidžia pasiekti visas ankstesnes failo būsenas.

Jis vis dar stipriai tobulinamas (rašymo metu - v4.4), tačiau jau matė projektus, norinčius jį kurti („FileCoin“).

Paskirstytasis pranešimas

Pranešimų sistemos suteikia centrinę vietą pranešimų / įvykių saugojimui ir skleidimui jūsų sistemoje. Jie leidžia atsieti savo programų logiką nuo tiesioginio pokalbio su kitomis sistemomis.

Žinomas mastas - „LinkedIn“ „Kafka“ klasteris apdorojo 1 trilijoną pranešimų per dieną, o didžiausias - 4,5 milijono pranešimų per sekundę.

Paprasčiau tariant, susirašinėjimo platforma veikia taip:

Pranešimas transliuojamas iš programos, kuri ją gali sukurti (vadinama gamintoju ), patenka į platformą ir ją perskaito potencialiai kelios programos, kurios ja domisi (vadinamos vartotojais ).

Jei jums reikia išsaugoti tam tikrą įvykį keliose vietose (pvz., Vartotojo kūrimas duomenų bazėje, sandėlyje, el. Pašto siuntimo paslauga ir visa kita, ką galite sugalvoti), pranešimų platforma yra pats švariausias būdas paskleisti tą pranešimą.

Vartotojai gali išsitraukti informaciją iš brokerių („pull model“) arba priversti brokerius perduoti informaciją tiesiai į vartotojus („push model“).

Yra keletas populiarių aukščiausio lygio pranešimų platformų:

„RabbitMQ“ - pranešimų tarpininkas, leidžiantis smulkiau valdyti pranešimų trajektorijas naudojant maršruto parinkimo taisykles ir kitus lengvai konfigūruojamus nustatymus. Galima vadinti išmaniuoju brokeriu, nes jis turi daug logikos ir griežtai seka per jį einančius pranešimus. Pateikia AP ir CPBŽŪP nustatymus . Pranešimams vartotojams naudoja „push“ modelį.

„Kafka“ - pranešimų tarpininkas (ir visa platforma), kuris yra šiek tiek žemesnis, nes jame neseka, kurie pranešimai buvo perskaityti, ir neleidžia atlikti sudėtingos maršrutų logikos. Tai padeda pasiekti nuostabų našumą. Mano nuomone, tai yra didžiausia perspektyva šioje erdvėje, aktyviai vystant atvirojo kodo bendruomenei ir palaikant „Confluent“ komandai. „Kafka“, be abejo, yra plačiausiai naudojama iš aukščiausių technologijų bendrovių. Parašiau išsamų įvadą į tai, kur išsamiai aprašau visus jo gerus dalykus.

„Apache ActiveMQ“ - seniausia iš grupės, sukurta 2004 m.. Naudoja JMS API, tai reiškia, kad ji skirta Java EE programoms. Jis buvo perrašytas kaip „ActiveMQ Artemis“, kuris užtikrina puikų našumą, lygiavertį su Kafka.

„Amazon SQS“ - AWS teikiama pranešimų paslauga. Leidžia greitai ją integruoti su esamomis programomis ir nebereikia tvarkyti savo infrastruktūros, o tai gali būti didelė nauda, ​​nes tokias sistemas kaip „Kafka“ yra labai sudėtinga nustatyti. „Amazon“ taip pat siūlo dvi panašias paslaugas - SNS ir MQ, pastarasis iš esmės yra „ActiveMQ“, tačiau valdomas „Amazon“.

Paskirstytos programos

Jei sukursite 5 „Rails“ serverius už vieno apkrovos balansatoriaus, visus sujungtus su viena duomenų baze, ar galėtumėte tai pavadinti paskirstyta programa? Prisiminkite mano apibrėžimą iš viršaus:

Paskirstyta sistema yra kompiuterių grupė, dirbanti kartu, kad galutiniam vartotojui pasirodytų kaip vienas kompiuteris. Šios mašinos turi bendrą būseną, veikia vienu metu ir gali sugesti nepriklausomai, nepaveikdamos visos sistemos veikimo laiko.

Jei skaičiuosite duomenų bazę kaip bendrą būseną, galite teigti, kad tai gali būti klasifikuojama kaip paskirstyta sistema, bet klystate, nes praleidote apibrėžimo dalį „ dirbti kartu “.

Sistema paskirstoma tik tuo atveju, jei mazgai bendrauja tarpusavyje ir koordinuoja savo veiksmus.

Todėl kažką panašaus į programą, valdančią savo vidinį kodą „peer-to-peer“ tinkle, galima geriau klasifikuoti kaip paskirstytą programą. Nepaisant to, visa tai yra nereikalinga klasifikacija, neturinti tikslo, bet iliustruojanti, kaip nerimaujame dėl dalykų grupavimo.

Žinoma skalė - „BitTorrent“ 193 000 mazgų, esančių „Sostų žaidimo“ serijoje, 2014 m. Balandžio mėn.

„Erlang“ virtuali mašina

„Erlang“ yra funkcinė kalba, turinti puikią lygiagretumo, paskirstymo ir tolerancijos gedimams semantiką. „Erlang“ virtuali mašina pati tvarko „Erlang“ programos platinimą.

Jo modelis veikia turėdamas daug izoliuotų lengvų procesų, kurie visi gali kalbėtis tarpusavyje per įmontuotą pranešimų perdavimo sistemą. Tai vadinama aktoriaus modeliu„Erlang“ OTP bibliotekos gali būti laikomos paskirstytu veikėjų pagrindu (pagal „Akka“ pavyzdį JVM).

Modelis yra tai, kas padeda pasiekti paprastą sutapimą - procesai yra paskirstyti po visus juos paleidžiančios sistemos branduolius. Kadangi tai neatskiriama nuo tinklo nustatymo (išskyrus galimybę mesti pranešimus), „Erlang“ VM gali prisijungti prie kitų „Erlang“ VM, veikiančių tame pačiame duomenų centre ar net kitame žemyne. Šis virtualių mašinų būrys valdo vieną programą ir tvarko mašinos gedimus perimdamas (planuojama, kad kitas mazgas veiks).

Iš tikrųjų paskirstytas kalbos sluoksnis buvo pridėtas, kad būtų užtikrinta gedimų tolerancija. Vienoje mašinoje veikiančiai programinei įrangai visada gresia pavojus, kad viena mašina mirs ir jūsų programa bus atjungta. Daugelyje mazgų veikianti programinė įranga leidžia lengviau tvarkyti aparatūros gedimus, jei programa buvo sukurta atsižvelgiant į tai.

„BitTorrent“

„BitTorrent“ yra vienas iš plačiausiai naudojamų protokolų dideliems failams perkelti per internetą per torrentus. Pagrindinė idėja yra palengvinti failų perdavimą tarp skirtingų tinklo bendraamžių, nereikia eiti per pagrindinį serverį.

Naudodami „BitTorrent“ klientą, jūs prisijungiate prie kelių kompiuterių visame pasaulyje ir atsisiųsite failą. Atidarę .torrent failą, prisijungiate prie vadinamojo sekimo įrenginio , kuris yra mašina, veikianti kaip koordinatorius. Tai padeda atrasti bendraamžius, rodant tinklo mazgus, kuriuose yra norimas failas.

Turite dviejų tipų vartotojo, dėlės ir sėjamosios, sąvokas . Leecher yra vartotojas, kuris atsisiunčia failą, o sėklos yra vartotojas, kuris įkelia failą.

Juokingiausia bendraamžių tinkluose yra tai, kad jūs, kaip paprastas vartotojas, turite galimybę prisijungti ir prisidėti prie tinklo.

„BitTorrent“ ir jo pirmtakai („Gnutella“, „Napster“) leidžia jums savanoriškai talpinti failus ir įkelti juos kitiems norintiems vartotojams. Priežastis, kodėl „BitTorrent“ yra tokia populiari, yra ta, kad ji buvo pirmoji tokio pobūdžio paskata prisidėti prie tinklo. Ankstesnių failų bendrinimo protokolų problema buvo nemokama kelionė , kai vartotojas atsisiųsdavo tik failus.

„BitTorrent“ tam tikru mastu išsprendė nemokamą perėjimą, privertęs sėjamuosius daugiau įkelti tiems, kurie teikia geriausius atsisiuntimo rodiklius. Tai veikia skatinant jus įkelti atsisiųsdami failą. Deja, po to, kai baigsite, niekas neprivers jūsų likti aktyviu tinkle. Dėl to trūksta tinklų, turinčių visą failą, ir kadangi protokolas labai priklauso nuo tokių vartotojų, atsirado tokių sprendimų kaip privatūs sekimo įrenginiai. Privatūs stebėtojai reikalauja, kad būtumėte bendruomenės narys (dažnai tik su kvietimu), kad galėtumėte dalyvauti paskirstytame tinkle.

Po pažangos šioje srityje buvo išrasti torrentai be stebėjimo. Tai buvo „BitTorrent“ protokolo patobulinimas, kuris metaduomenims rinkti ir bendraamžiams rasti nesirėmė centralizuotais stebėjimo prietaisais, o naudojo naujus algoritmus. Vienas tokių pavyzdžių yra „Kademlia“ („Mainline DHT“), paskirstyta maišos lentelė (DHT), leidžianti rasti bendraamžius per kitus bendraamžius. Iš tikrųjų kiekvienas vartotojas atlieka sekimo pareigas.

Išplatintos knygos

Paskirstytą knygą galima laikyti nekintama, tik priedų duomenų baze, kuri yra atkartojama, sinchronizuojama ir bendrinama visuose paskirstyto tinklo mazguose.

Žinomas mastas - „Ethereum Network“ turėjo daugiausia 1,3 mln. Operacijų per dieną 2018 m. Sausio 4 d.

Jie naudoja „Event Sourcing“ modelį, leidžiantį jums atkurti knygos knygą bet kuriuo metu jos istorijoje.

„Blockchain“

„Blockchain“ yra dabartinė pagrindinė technologija, naudojama paskirstytoms knygoms ir iš tikrųjų pažymėjo jų pradžią. Ši naujausia ir didžiausia naujovė paskirstytoje erdvėje leido sukurti pirmąjį iš tikrųjų paskirstytą mokėjimo protokolą - „Bitcoin“.

„Blockchain“ yra paskirstyta knyga, kurioje yra visų jos tinkle įvykusių operacijų užsakytas sąrašas. Operacijos grupuojamos ir saugomos blokais. Visa blokų grandinė iš esmės yra susietasis blokų sąrašas (taigi ir pavadinimas) . Minėtų blokų kūrimas yra skaičiavimo požiūriu brangus ir yra glaudžiai tarpusavyje susijęs per kriptografiją.

Paprasčiau tariant, kiekviename bloke yra specialus dabartinio bloko turinio maišas (kuris prasideda X nuliu) ir ankstesnio bloko maišos. Šiam maišui reikia pagaminti daug procesoriaus galios, nes vienintelis būdas jį sugalvoti yra grubus jėga.

Kalnakasiai yra mazgai, kurie bando apskaičiuoti maišos (per bruteforce). Kalnakasiai visi konkuruoja tarpusavyje dėl to, kas gali sugalvoti atsitiktinę eilutę (vadinamą nonce ), kurią sujungus su turiniu, susidaro minėtas maišas. Kai kas nors randa teisingą nepastebėjimą - jis jį perduoda visam tinklui. Tada kiekvienas mazgas atskirai patikrina minėtą eilutę ir priima į savo grandinę.

Tai paverčiama sistema, kurioje absurdiškai brangu modifikuoti „blockchain“ ir absurdiškai lengva patikrinti, ar ji nėra pažeista.

Brangu pakeisti bloko turinį, nes taip būtų sukurta kitokia maiša. Atminkite, kad kiekvieno kito bloko maišos priklauso nuo jo. Jei pakeistumėte operaciją pirmame paveikslėlio bloke - pakeistumėte Merkle šaknį. Tai savo ruožtu pakeistų bloko maišos (greičiausiai be reikalingų pirmaujančių nulių) - tai pakeistų bloko Nr. 2 maišos ir pan., Ir pan. Tai reiškia, kad jums reikės grubiai priversti naują bloką kiekvienam blokui po to, kurį ką tik modifikavote.

Tinklas visada pasitiki ir atkartoja ilgiausią galiojančią grandinę. Norint apgauti sistemą ir galų gale sukurti ilgesnę grandinę, jums reikia daugiau nei 50% visos procesoriaus galios, kurią naudoja visi mazgai.

„Blockchain“ gali būti laikomas paskirstytu bendro sutarimo mechanizmu . Sutarimas nėra pasiektas aiškiai - nėra rinkimų ar nustatyto momento, kai įvyksta sutarimas. Vietoj to, sutariama yra besiformuojanti produktas asinchroninio bendravimo tūkstančių nepriklausomų mazgų, visi po protokolo taisykles.

Ši precedento neturinti naujovė neseniai tapo technologijų erdvės bumu, kai žmonės spėjo, kad tai žymės „Web 3.0“ sukūrimą. Tai neabejotinai pati įdomiausia erdvė programinės įrangos inžinerijos pasaulyje šiuo metu, užpildyta itin sudėtingomis ir įdomiomis problemomis, kurios laukia sprendimo.

Bitcoin

Trūko ankstesnių paskirstytų mokėjimų protokolų - tai būdas praktiškai užkirsti kelią dvigubo išlaidų problemai realiu laiku, paskirstytu būdu. Tyrimai pateikė įdomių pasiūlymų [1], tačiau „Bitcoin“ pirmasis įdiegė praktinį sprendimą, turintį aiškių pranašumų prieš kitus.

Dviguba išlaidų problema teigia, kad aktorius (pvz., Bobas) negali išleisti savo vieno ištekliaus dviejose vietose. Jei Bobas turi 1 USD, jis neturėtų galėti jo atiduoti tiek Alice, tiek Zackui - tai tik vienas turtas, jo negalima dubliuoti. Pasirodo, tikrai sunku iš tikrųjų pasiekti šią garantiją paskirstytoje sistemoje. Yra keletas įdomių sušvelninimo būdų, egzistavusių prieš blokinę grandinę, tačiau jie praktiškai neišsprendžia problemos.

Dvigubas išlaidas lengvai išsprendžia „Bitcoin“, nes vienu metu grandinėje pridedamas tik vienas blokas. Dvigubo išleidimo neįmanoma per vieną bloką, todėl net jei tuo pačiu metu bus sukurti du blokai - galiausiai ilgiausioje grandinėje bus tik vienas.

„Bitcoin“ remiasi sunkumais kaupti procesoriaus galią.

Nors balsavimo sistemoje užpuolikui reikia tik pridėti mazgų prie tinklo (tai lengva, nes nemokama prieiga prie tinklo yra dizaino tikslas), procesoriaus galia pagrįstoje schemoje užpuolikui kyla fizinis apribojimas: prieiga prie vis daugiau galinga aparatūra.

Tai taip pat yra priežastis, dėl kurios kenkėjiškos mazgų grupės turi valdyti 50% tinklo skaičiavimo galios, kad iš tikrųjų galėtų įvykdyti bet kokią sėkmingą ataką. Mažiau nei tai, o likęs tinklas greičiau sukurs ilgesnį „blockchain“.

Ethereum

„Ethereum“ gali būti laikomas programuojama „blockchain“ pagrindu sukurta programinės įrangos platforma. Ji turi savo kriptovaliutą (eterį), kuri skatina diegti pažangias sutartis savo blokų grandinėje.

Protingos sutartys yra kodo dalis, saugoma kaip viena operacija „Ethereum“ blokų grandinėje. Norėdami paleisti kodą, jums tereikia išduoti operaciją su išmaniąja sutartimi kaip paskirties vietą. Tai savo ruožtu verčia kalnakasių mazgus vykdyti kodą ir bet kokius jo atliktus pakeitimus. Kodas vykdomas „Ethereum“ virtualiosios mašinos viduje.

„Solidity“ , „ Ethereum “ gimtoji programavimo kalba, yra tai, kas naudojama norint sudaryti išmanias sutartis. Tai visiškai užbaigta programavimo kalba, kuri tiesiogiai sąveikauja su „Ethereum“ blokine grandine, leidžianti jums pateikti užklausą apie būseną, pvz., Likučius ar kitus protingus sutarčių rezultatus. Norint išvengti begalinių kilpų, norint paleisti kodą reikia šiek tiek eterio.

Kadangi blokų grandinę galima interpretuoti kaip būsenos pokyčių seriją , ant Ethereum ir panašių platformų buvo pastatyta daugybė paskirstytų programų (DApps).

Tolesnis paskirstytų knygų naudojimas

Egzistavimo įrodymas - paslauga, skirta anonimiškai ir saugiai saugoti įrodymą, kad tam tikru metu egzistavo tam tikras skaitmeninis dokumentas. Naudinga užtikrinti dokumento vientisumą, nuosavybę ir laiko žymėjimą.

Decentralizuotos autonominės organizacijos (DAO) - organizacijos, kurios naudoja blokų grandinę kaip priemonę pasiekti sutarimą dėl organizacijos tobulinimo pasiūlymų. Pavyzdžiui, „Dash“ valdymo sistema, „SmartCash“ projektas

Decentralizuotas autentifikavimas - išsaugokite savo tapatybę „blockchain“, kad galėtumėte visur naudoti vienkartinį prisijungimą (SSO). Sovrinas, pilietis

Ir daug, daug daugiau. Išplatinta knygos knyga tikrai atvėrė begales galimybių. Kai kurie greičiausiai yra išrasti, kai kalbame!

Santrauka

Trumpame šio straipsnio ruože mums pavyko apibrėžti, kas yra paskirstyta sistema, kodėl jūs norėtumėte ją naudoti ir šiek tiek pereiti per kiekvieną kategoriją. Keletas svarbių dalykų, kuriuos reikia atsiminti:

  • Paskirstytos sistemos yra sudėtingos
  • Jie pasirenkami atsižvelgiant į mastą ir kainą
  • Su jais sunkiau dirbti
  • BŽŪP teorema - nuoseklumo / prieinamumo kompromisas
  • Jie turi 6 kategorijas - duomenų saugyklos, kompiuterija, failų sistemos, pranešimų sistemos, knygos, programos

Jei atvirai, mes vos palietėme paskirstytų sistemų paviršių. Neturėjau galimybės nuodugniai išspręsti ir paaiškinti pagrindinių problemų, tokių kaip sutarimas, replikacijos strategijos, renginių užsakymas ir laikas, tolerancija gedimams, pranešimo perdavimas tinkle ir kt.

Atsargiai

Leisk man palikti jus perskyrimo perspėjimu:

Turite kuo labiau nutolti nuo paskirstytų sistemų. Sunkumo, kurį jie patiria patys su savimi, neverta stengtis, jei galite išvengti problemos išspręskite ją kitaip arba naudodamiesi kitu „of-the-box“ sprendimu.

[1]

Kova su dvigubomis išlaidomis, naudojant kooperatyvines P2P sistemas, 2007 m. Birželio 25–27 d. - siūlomas sprendimas, kurio metu gali pasibaigti kiekvienos „monetos“ galiojimo laikas ir jai paskiriamas liudytojas (patvirtintojas).

„Bitgold“ , 2005 m. Gruodžio mėn. - Aukšto lygio protokolo apžvalga, labai panaši į „Bitcoin“. Sakoma, kad tai yra Bitcoin pirmtakas.

Tolesnis paskirstytų sistemų skaitymas:

Projektuodamas daug duomenų reikalaujančias programas, Martinas Kleppmannas - puiki knyga, apžvelgianti viską paskirstytose sistemose ir dar daugiau.

Debesų kompiuterijos specializacija, Ilinojaus universitetas, Coursera - ilga kursų serija (6) , apimanti paskirstytos sistemos koncepcijas, programas

„Jepsen“ - tinklaraštis, kuriame paaiškinta daugybė platinamų technologijų („ElasticSearch“, „Redis“, „MongoDB“ ir kt.)

Dėkojame, kad skyrėte laiko perskaityti šį ilgą (~ 5600 žodžių) straipsnį!

Jei atsitiktinai radote šį informacinį pranešimą ar manėte, kad jis teikia jums vertę, įsitikinkite, kad pateikėte jam kuo daugiau plojimų, kaip manote, kad jis nusipelno, ir apsvarstykite galimybę pasidalinti su draugu, kuris galėtų naudoti šios nuostabios studijų srities įvadą.

~ Stanislavas Kozlovskis

Atnaujinti

Šiuo metu dirbu „Confluent“. „Confluent“ yra „Big Data“ kompanija, kurią įkūrė patys „Apache Kafka“ kūrėjai! Esu be galo dėkinga už suteiktą galimybę - šiuo metu dirbu prie pačios „Kafka“, kas yra be galo nuostabu! Mes, „Confluent“, padedame formuoti visą atvirojo šaltinio „Kafka“ ekosistemą, įskaitant naują valdomą „Kafka-as-a-service“ debesies pasiūlymą.

Mes samdome daugybę pareigybių (ypač SRE / programinės įrangos inžinierių) Europoje ir JAV! Jei jus domina darbas su pačia „Kafka“, naujų galimybių ieškojimas ar tiesiog įdomu - būtinai atsiųskite man žinutę „Twitter“ ir aš pasidalinsiu visomis puikiomis privilegijomis, kurios kyla dirbant įlankos regiono įmonėje.