Дълбоко въведение в разпределените системи

Какво е разпределена система и защо е толкова сложна?

Мечка, обмисляща разпределени системи

Съдържание

Въведение

  1. Какво е разпределена система?
  2. Защо да разпространявате система?
  3. Пример за мащабиране на база данни
  4. Децентрализирана срещу разпределена

Категории на разпределената система

  1. Разпределени хранилища на данни
  2. Разпределено изчисление
  3. Разпределени файлови системи
  4. Разпространени съобщения
  5. Разпространени приложения
  6. Разпределени книги

резюме

Въведение

С непрекъснато нарастващото технологично разширяване на света, разпределените системи стават все по-широко разпространени. Те са обширна и сложна област на изучаване в компютърните науки.

Тази статия има за цел да ви запознае с разпределените системи по основен начин, като ви показва поглед върху различните категории такива системи, като същевременно не се гмурнете дълбоко в детайлите.

Какво е разпределена система?

Разпределената система в най-простата си дефиниция е група от компютри, които работят заедно, за да изглеждат като един компютър пред крайния потребител.

Тези машини имат общо състояние, работят едновременно и могат да се провалят независимо, без да засягат времето на работа на цялата система.

Предлагам да работим постепенно чрез пример за разпространение на система, за да можете да разберете по-добре всичко това:

Традиционен стек

Да вървим с база данни! Традиционните бази данни се съхраняват във файловата система на една машина, винаги когато искате да получите / вмъкнете информация в нея - говорите директно с тази машина.

За да можем да разпространяваме тази система от бази данни, трябва да я поддържаме на няколко машини едновременно. Потребителят трябва да може да разговаря с която и машина да е избрал и не трябва да може да каже, че не говори с една машина - ако вмъкне запис в възел № 1, възел № 3 трябва да може да върне този запис.

Архитектура, която може да се счита за разпределена

Защо да разпространявате система?

Системите винаги се разпространяват по необходимост. Истината на въпроса е - управлението на разпределените системи е сложна тема, пълна с клопки и наземни мини. Главоболие е разгръщането, поддържането и отстраняването на грешки в разпределените системи, така че защо въобще да отидете там?

Това, което разпределената система ви позволява да правите, е мащабиране хоризонтално. Връщайки се към предишния ни пример за единствения сървър на база данни, единственият начин да се справите с повече трафик би бил обновяването на хардуера, на който работи базата данни. Това се нарича мащабиране вертикално.

Вертикалното мащабиране е всичко добре и добре, докато можете, но след определен момент ще видите, че дори най-добрият хардуер не е достатъчен за достатъчно трафик, да не говорим за непрактично да хоствате.

Мащабирането на хоризонтала просто означава добавяне на повече компютри, а не надграждане на хардуера на един.

Хоризонталното мащабиране става много по-евтино след определен праг

Той е значително по-евтин от вертикалното мащабиране след определен праг, но това не е основният му случай за предпочитане.

Вертикалното мащабиране може да подобри ефективността ви само до възможностите на най-новия хардуер. Тези възможности се оказват недостатъчни за технологичните компании с умерена до голяма натовареност.

Най-хубавото при хоризонталното мащабиране е, че нямате ограничение за размера на мащаба - винаги, когато производителността намалява, просто добавяте друга машина, до потенциално безкрайност.

Лесното мащабиране не е единственото предимство, което получавате от разпределените системи. Относимостта и ниската латентност също са толкова важни.

Толерантност на грешките - клъстер от десет машини в два центъра за данни по своята същност е по-устойчив на повреди от една машина. Дори ако един център за данни се запали, приложението ви пак ще работи.

Ниска латентност - Времето на мрежовия пакет да обиколи света е физически ограничено от скоростта на светлината. Например, най-краткото време за време за обратна връзка на заявката (тоест върнете се напред и назад) в оптичен кабел между Ню Йорк до Сидни е 160 мс. Разпределените системи ви позволяват да имате възел в двата града, което позволява на трафика да удари възела, който е най-близо до него.

За да работи разпределената система обаче, трябва софтуерът, работещ на тези машини, да бъде специално проектиран за работа на няколко компютъра едновременно и за справяне с проблемите, които идват заедно с него. Това се оказва не лесен подвиг.

Мащабиране на нашата база данни

Представете си, че нашето уеб приложение стана безумно популярно. Представете си също, че нашата база данни започна да получава два пъти повече заявки в секунда, колкото може да се справи. Приложението ви веднага ще започне да намалява в производителността и това ще бъде забелязано от вашите потребители.

Нека работим заедно и направим нашата база данни мащаб, за да отговорим на нашите високи изисквания.

В обикновено уеб приложение обикновено четете информация много по-често, отколкото вмъквате нова информация или модифицирате стара.

Има начин да увеличите производителността на четене и това е чрез така наречената стратегия за главно-подчинена репликация. Тук създавате два нови сървъра на бази данни, които се синхронизират с основния. Уловката е, че можете да четете само от тези нови екземпляри.

Всеки път, когато вмъквате или променяте информация - разговаряте с основната база данни. Той, от своя страна, асинхронно информира робите за промяната и те го запазват също.

Поздравления, сега можете да изпълнявате 3x колкото много прочетени заявки! Не е ли това страхотно?

капан

Хванах те! Веднага загубихме C в гаранционните гаранции за ACID на нашата релационна база данни, което означава последователност.

Виждате ли, сега съществува възможност, в която ние вмъкваме нов запис в базата данни, веднага след това издаваме заявка за четене за нея и не получаваме нищо обратно, сякаш не съществува!

Разпространяването на новата информация от господаря на роба не се случва мигновено. Всъщност съществува времеви прозорец, в който можете да получите застояла информация. Ако това не беше така, вашето записване ще пострада, тъй като ще трябва синхронно да изчака да се разпространят данните.

Разпределените системи идват с шепа компромиси. Този конкретен проблем е въпросът, с който ще трябва да живеете, ако искате да постигнете адекватен мащаб.

Продължаване към мащаба

Използвайки подхода на базата данни на подчинените, можем до известна степен да мащабираме хоризонтално четения си трафик. Това е чудесно, но ние се ударихме в стената по отношение на нашия трафик за запис - той все още е всичко на един сървър!

Тук не ни остават много възможности. Просто трябва да разделим трафика си за запис на няколко сървъра, тъй като човек не е в състояние да се справи.

Един от начините е да се постигне стратегия за мулти-мастер репликация. Там вместо роби, от които можете да четете, имате множество главни възли, които поддържат четене и запис. За съжаление, това се усложнява много бързо, тъй като сега имате възможност да създавате конфликти (напр. Вмъкнете два записа със същия идентификатор).

Нека да преминем с друга техника, наречена заточване (също наречена разделяне).

С рязкостта разделяте вашия сървър на няколко по-малки сървъра, наречени шарки. Всички тези парчета притежават различни записи - създавате правило за това кои записи влизат в кой фрагмент. Много е важно да се създаде правилото, така че данните да се разпространяват по еднакъв начин.

Възможен подход за това е да се определят диапазоните според някаква информация за даден запис (напр. Потребители с име A-D).

Този ключ за заточване трябва да бъде избран много внимателно, тъй като натоварването не винаги е равно на базата на произволни колони. (напр. повече хора имат име, започващо с C, а не Z). Една единица, която получава повече заявки от другите, се нарича гореща точка и трябва да се избягва. След като се разделят, повторното разширяване на данните става невероятно скъпо и може да доведе до значителни прекъсвания, както беше при скандалния 11 часов прекъсване на FourSquare.

За да запазим нашия пример прост, приемете, че клиентът ни (приложението Rails) знае коя база данни да използва за всеки запис. Също така си струва да се отбележи, че има много стратегии за изостряне и това е прост пример за илюстриране на концепцията.

В момента сме спечелили доста - можем да увеличим трафика на запис N пъти, където N е броят на парчетата. Това практически не ни дава почти никаква граница - представете си колко фино зърнести можем да постигнем с това разделяне.

капан

Всичко в софтуерното инженерство е повече или по-малко компромис и това не е изключение. Нарязването не е прост подвиг и е най-добре да се избягва, докато наистина е необходимо.

Вече направихме заявки чрез ключове, различни от разделителния ключ, изключително неефективни (те трябва да преминат през всички частици). SQL JOIN заявките са още по-лоши и сложните стават практически неизползваеми.

Децентрализирана срещу разпределена

Преди да продължим, бих искал да направя разлика между двата термина.

Въпреки че думите звучат сходно и може да се заключи, че означават същото логично, разликата им оказва значително технологично и политическо въздействие.

Децентрализираната все още се разпространява в технически смисъл, но цялата децентрализирана система не е собственост на един участник. Никоя компания не може да притежава децентрализирана система, в противен случай тя вече не би била децентрализирана.

Това означава, че повечето системи, които ще преминем днес, могат да се смятат за разпределени централизирани системи - и това е, което са създадени.

Ако се замислите - по-трудно е да създадете децентрализирана система, защото тогава трябва да се справите със случая, в който някои от участниците са злонамерени. Това не е така с нормалните разпределени системи, тъй като знаете, че притежавате всички възли.

Забележка: Тази дефиниция е обсъждана много и може да бъде объркана с други (peer-to-peer, federated). В ранната литература също е дефинирано различно. Независимо от това, което ви дадох като определение е това, което смятам, че е най-широко използваното сега, когато blockchain и cryptocurrencies популяризираха термина.

Категории на разпределената система

Сега ще преминем през няколко разпределени системни категории и ще изброим най-голямата им обществено известна производствена употреба. Имайте предвид, че повечето показани числа са остарели и най-вероятно са значително по-големи от момента, в който четете това.

Разпределени хранилища на данни

Разпространените хранилища на данни са най-широко използвани и разпознати като разпределени бази данни. Повечето разпределени бази данни са NoSQL нерелационни бази данни, ограничени до семантика на ключови стойности. Те осигуряват невероятна производителност и мащабируемост с цената на консистенция или наличност.

Известна скала - Известно е, че Apple използва 75 000 възли Apache Cassandra, съхраняващи над 10 петабайта данни, още през 2015 г.

Не можем да влезем в дискусии за разпространените хранилища на данни, без първо да въведем теоремата на ОСП.

Теорема на ОСП

Доказано още през 2002 г., теоремата на ОСП заявява, че разпределеното хранилище на данни не може едновременно да бъде последователно, налично и да има толерантност към дяловете.

Изберете 2 от 3 (но не последователност и наличност)

Някои бързи определения:

  • Последователност - Това, което четете и пишете последователно, е това, което се очаква (спомняте ли си gotcha с репликацията на базата данни преди няколко абзаца?)
  • Наличност - цялата система не умира - всеки неуспешен възел винаги връща отговор.
  • Толерантен дял - Системата продължава да функционира и поддържа своите гаранции за съответствие / наличност, въпреки мрежовите дялове

В действителност трябва да бъде даден толеранс на дяла за всеки разпространен информационен магазин. Както беше споменато на много места, едно от които е тази страхотна статия, не можете да имате последователност и достъпност без толерантност към дяловете.

Помислете за това: ако имате два възела, които приемат информация и връзката им умира - как двамата ще бъдат достъпни и едновременно ще ви осигурят последователност? Те нямат начин да знаят какво прави другият възел и като такъв могат или да станат офлайн (недостъпни), или да работят с застояла информация (непоследователна).

И какво ще правим?

В крайна сметка ще оставите да изберете дали искате вашата система да е силно последователна или силно достъпна под мрежов дял.

Практиката показва, че повечето приложения ценят наличността повече. Не е задължително винаги да имате нужда от силна консистенция. Дори и тогава този компромис не е задължително да се прави, защото се нуждаете от 100% гаранция за достъпност, а по-скоро поради това, че латентността в мрежата може да бъде проблем, когато се налага да синхронизирате машини, за да постигнете силна съгласуваност. Тези и още фактори карат приложенията да избират решения, които предлагат висока достъпност.

Такива бази данни се уреждат с най-слабия модел на последователност - евентуална последователност (силно срещу евентуално обяснение за последователност). Този модел гарантира, че ако не бъдат направени нови актуализации на даден елемент, в крайна сметка всички достъпи до този елемент ще върнат последната актуализирана стойност.

Тези системи предоставят BASE свойства (за разлика от традиционните ACID на бази данни)

  • По принцип на разположение - Системата винаги връща отговор
  • Меко състояние - Системата може да се променя с течение на времето, дори по време на липса на вход (поради евентуална последователност)
  • Евентуална съгласуваност - При липса на въвеждане данните рано или късно ще се разпространяват във всеки възел - като по този начин стават последователни

Примери за такива налични разпределени бази данни - Cassandra, Riak, Voldemort

Разбира се, има и други хранилища с данни, които предпочитат по-голяма последователност - HBase, Couchbase, Redis, Zookeeper

Теоремата за CAP е достойна за множество статии самостоятелно - някои относно това как можете да настроите свойствата на CAP на системата в зависимост от това как се държи клиентът, а други от това как не се разбира правилно.

Касандра

Касандра, както бе споменато по-горе, е разпределена No-SQL база данни, която предпочита свойствата на AP извън CAP, като се урежда с евентуална последователност. Трябва да призная, че това може да е малко подвеждащо, тъй като Касандра е много конфигурируема - можете да я накарате да осигури силна консистенция и за сметка на наличността, но това не е често срещаната й употреба.

Cassandra използва последователно хеширане, за да определи кои възли от вашия клъстер трябва да управляват данните, които предавате. Задавате фактор на репликация, който в основата посочва колко възли искате да репликирате.

Примерно писане

Когато четете, ще четете само от тези възли.

Касандра е мащабируем, което осигурява абсурдно висока пропускателна способност за запис.

Възможно предубедена диаграма, показваща показатели на секунда показатели. Взета от тук.

Въпреки че тази диаграма може да е предубедена и изглежда, че сравнява Касандра с базите данни, настроени да осигуряват силна съгласуваност (в противен случай не мога да разбера защо MongoDB ще намали производителността при надстройка от 4 до 8 възла), това все пак трябва да показва какво правилно е зададено нагоре клъстерът Касандра е способен.

Независимо от това, в компромиса на разпределените системи, който позволява хоризонтално мащабиране и невероятно висока пропускателна способност, Касандра не предоставя някои основни характеристики на базата данни на ACID - а именно транзакциите.

консенсус

Транзакциите в база данни са трудни за изпълнение в разпределените системи, тъй като изискват всеки възел да се споразумее за правилните действия, които да предприеме (прекъсне или извърши). Това е известно като консенсус и е основен проблем в разпределените системи.

Достигането на типа споразумение, необходимо за проблема „ангажиране на транзакция“, е ясно, ако участващите процеси и мрежата са напълно надеждни. Реалните системи обаче са обект на редица възможни неизправности, като сривове на процеса, разделяне на мрежата и загубени, изкривени или дублирани съобщения.

Това създава проблем - доказано е невъзможно да се гарантира, че се постига правилен консенсус в ограничени срокове в ненадеждна мрежа.

На практика обаче има алгоритми, които постигат консенсус в ненадеждна мрежа доста бързо. Касандра всъщност осигурява леки транзакции чрез използването на алгоритъма Paxos за разпределен консенсус.

Разпределено изчисление

Разпределените изчисления са ключът към притока на обработка на големи данни, който наблюдаваме през последните години. Това е техниката за разделяне на огромна задача (напр. Съвкупност от 100 милиарда записа), от която нито един компютър не е в състояние да изпълни практически самостоятелно, в много по-малки задачи, всяка от които може да се побере в една стока машина. Разделяте огромната си задача на много по-малки, карате ги да се изпълняват паралелно на много машини, агрегирайте данните по подходящ начин и сте решили първоначалния си проблем. Този подход отново ви позволява да мащабирате хоризонтално - когато имате по-голяма задача, просто включете повече възли в изчислението.

Известна скала - Folding @ Home имаше 160 000 активни машини през 2012 г.

Ранен новатор в това пространство беше Google, който поради необходимостта от своите големи количества данни трябваше да измисли нова парадигма за разпределени изчисления - MapReduce. Те публикуват документ за него през 2004 г., а общността с отворен код по-късно създава Apache Hadoop въз основа на нея.

MapReduce

MapReduce може просто да се определи като две стъпки - картографиране на данните и свеждането им до нещо смислено.

Нека да го разберем отново с пример:

Кажете, че сме средни и съхранихме огромната си информация във вторична разпределена база данни за целите на складирането. Искаме да извлечем данни, представляващи броя на клаупите, издадени всеки ден през април 2017 г. (преди година).

Този пример се поддържа възможно най-кратък, ясен и прост, но представете си, че работим с множество данни (напр. Анализирайки милиарди хлопи). Няма да съхраняваме цялата тази информация на една машина очевидно и няма да анализираме всичко това само с една машина. Ние също няма да запитваме производствената база данни, а по-скоро някаква база данни „склад“, създадена специално за офлайн задачи с нисък приоритет.

Всяка задача на Map е отделен възел, трансформиращ колкото се може повече данни. Всяка задача преминава през всички данни в дадения възел за съхранение и ги преобразува в обикновен набор от дата и номер едно. След това се правят три посреднически стъпки (за които никой не говори) - разбъркване, сортиране и разделяне. Те основно подреждат данните и ги изтриват до съответното намаление. Тъй като имаме работа с големи данни, всяка работа на Намаляване е разделена, за да работи само на една дата.

Това е добра парадигма и изненадващо ви позволява да правите много с нея - можете да свържете множество задачи на MapReduce, например.

По-добри техники

MapReduce е донякъде наследство в наши дни и носи някои проблеми с него. Тъй като работи на партиди (работни места), възниква проблем къде, ако работата ви се провали - трябва да рестартирате цялата работа. Неуспехът на двучасова работа наистина може да забави целия ви тръбопровод за обработка на данни и най-малкото не искате това, особено в часовете в пик.

Друг проблем е времето, в което чакате, докато получите резултати. В аналитичните системи в реално време (които разполагат с големи данни и по този начин използват разпределени изчисления) е важно най-новите ви смачкани данни да са възможно най-свежи и със сигурност не от преди няколко часа.

Като такива се появиха други архитектури, които се занимават с тези проблеми. А именно Lambda Architecture (комбинация от пакетна обработка и поточна обработка) и Kappa Architecture (само поточна обработка). Този напредък в областта донесе нови инструменти, които им позволяват - Kafka Streams, Apache Spark, Apache Storm, Apache Samza.

Разпределени файлови системи

Разпределените файлови системи могат да се разглеждат като разпределени хранилища на данни. Те са едно и също нещо като концепция - съхраняване и достъп до голямо количество данни в клъстер от машини, всичките се появяват като едно цяло. Те обикновено вървят ръка за ръка с разпределените изчисления.

Известна скала - Yahoo е известен с това, че работи с HDFS на над 42 000 възли за съхранение на 600 петабайта данни, още през 2011 г.

Уикипедия определя разликата в това, че разпределените файлови системи позволяват достъп до файлове, като се използват същите интерфейси и семантика като локални файлове, а не чрез персонализиран API, като Cassandra Query Language (CQL).

HDFS

Hadoop разпределена файлова система (HDFS) е разпределената файлова система, използвана за разпределени изчисления чрез рамката на Hadoop. Използвайки широко приложение, той се използва за съхранение и репликация на големи файлове (GB или TB в размер) на много машини.

Архитектурата му се състои главно от NameNodes и DataNodes. NameNodes са отговорни за запазването на метаданни за клъстера, като кой възел съдържа кои файлови блокове. Те действат като координатори на мрежата, като определят къде е най-добре да се съхраняват и копират файлове, проследявайки здравето на системата. DataNodes просто съхраняват файлове и изпълняват команди като репликиране на файл, писане на нов и други.

Не е изненадващо, че HDFS се използва най-добре с Hadoop за изчисляване, тъй като осигурява информираност на данните за изчислителните задания. Споменатите задачи след това се пускат по възлите, съхраняващи данните. Това използва локализацията на данните - оптимизира изчисленията и намалява обема на трафика по мрежата.

IPFS

Междупланетарната файлова система (IPFS) е вълнуващ нов партньорски протокол / мрежа за разпределена файлова система. Използвайки технологията Blockchain, тя може да се похвали с напълно децентрализирана архитектура без нито един собственик, нито точка на провал.

IPFS предлага система за именуване (подобна на DNS), наречена IPNS и позволява на потребителите лесно да получават информация. Той съхранява файл чрез историческа версия, подобно на Git. Това позволява достъп до всички предишни състояния на файл.

Той все още е в тежко развитие (v0.4 от времето на писане), но вече вижда проекти, заинтересовани да надгражда над него (FileCoin).

Разпространени съобщения

Системите за съобщения осигуряват централно място за съхранение и разпространение на съобщения / събития във вашата цялостна система. Те ви позволяват да отделите логиката на приложението си от директно разговор с другите ви системи.

Известна скала - Клъстерът Kafka на LinkedIn обработва 1 трилион съобщения на ден с пикове от 4,5 милиона съобщения в секунда.

Просто казано, платформа за съобщения работи по следния начин:

Съобщението се излъчва от приложението, което потенциално го създава (наричано производител), влиза в платформата и се чете от потенциално множество приложения, които се интересуват от него (наречени потребители).

Ако трябва да запазите определено събитие на няколко места (например създаване на потребител в база данни, склад, услуга за изпращане по имейл и каквото друго можете да излезете), платформата за съобщения е най-чистият начин за разпространение на това съобщение.

Потребителите могат или да изтеглят информация от брокерите (изтеглящ модел), или да накарат брокерите да избутват информация директно в потребителите (push модел).

Има няколко популярни най-добрите платформи за съобщения:

RabbitMQ - Брокер за съобщения, който ви позволява да контролирате траекториите на съобщенията чрез правилни правила за маршрутизиране и други лесно конфигурируеми настройки. Може да се нарече интелигентен брокер, тъй като има много логика в него и плътно следи съобщенията, които минават през него. Предоставя настройки за AP и CP от CAP. Използва push модел за уведомяване на потребителите.

Kafka - Брокер за съобщения (и цялата платформа), която е малко по-ниско ниво, тъй като в него не следи кои съобщения са прочетени и не позволява сложна логика на маршрутизиране. Това му помага да постигне невероятно представяне. Според мен това е най-голямата перспектива в това пространство с активно развитие от общността с отворен код и подкрепа от екипа на Confluent. Kafka може би има най-широко приложение от най-добрите технологични компании. Написах задълбочено въведение към това, където се впускам в подробности за цялата му доброта.

Apache ActiveMQ - Най-старият от групата, датиращ от 2004 г. Използва JMS API, което означава, че е насочен към Java EE приложения. Той е пренаписан като ActiveMQ Artemis, което осигурява изключителна производителност наравно с Kafka.

Amazon SQS - Услуга за съобщения, предоставяна от AWS. Позволява ви бързо да го интегрирате със съществуващите приложения и елиминира необходимостта да боравите със собствената си инфраструктура, което може да е от голяма полза, тъй като системи като Kafka са очевидно трудни за настройка. Amazon предлага и две подобни услуги - SNS и MQ, като последният от тях е в основата си ActiveMQ, но управляван от Amazon.

Разпространени приложения

Ако навиете 5 Rails сървъра зад един балансиращ товар, свързан към една база данни, бихте ли могли да наречете това разпределено приложение? Спомнете си моята дефиниция отгоре:

Разпределената система е група от компютри, които работят заедно, за да изглеждат като един компютър на крайния потребител. Тези машини имат общо състояние, работят едновременно и могат да се провалят независимо, без да засягат времето на работа на цялата система.

Ако преброите базата данни като споделено състояние, можете да твърдите, че това може да бъде класифицирано като разпределена система - но ще сбъркате, тъй като сте пропуснали частта от „съвместната работа“ на определението.

Системата се разпределя само ако възлите комуникират помежду си, за да координират своите действия.

Следователно нещо като приложение, изпълняващо своя бек-енд код в партньорска мрежа, може по-добре да бъде класифицирано като разпределено приложение. Независимо от това, всичко това е излишна класификация, която не служи за цел, а илюстрира колко суетливи сме да групираме нещата заедно.

Известна скала - рояк от BitTorrent от 193 000 възли за епизод на Game of Thrones, април 2014 г.

Erlang виртуална машина

Erlang е функционален език, който има страхотна семантика за едновременност, разпределение и отказоустойчивост. Самата виртуална машина Erlang обработва разпределението на приложението Erlang.

Моделът му работи, като има много изолирани леки процеси, всички с възможност за разговор помежду си чрез вградена система за предаване на съобщения. Това се нарича модел на актьора и библиотеките на OTP на Erlang могат да се разглеждат като разпределена актьорска рамка (по линия на Akka за JVM).

Моделът е това, което му помага да постигне голяма съвместимост, а не просто - процесите са разпределени в наличните ядра на системата, която ги управлява. Тъй като това не се различава от мрежова настройка (освен възможността за изпускане на съобщения), VM на Erlang може да се свърже с други виртуални виртуални файлове на Erlang, работещи в същия център за данни или дори на друг континент. Този рояк виртуални машини изпълняват едно единствено приложение и обработват повреди на машината чрез поглъщане (друг възел се планира да работи).

Всъщност разпределеният слой на езика беше добавен, за да се осигури поносимост на грешките. Софтуерът, работещ на една машина, винаги е застрашен от това, че тази машина ще умре и ще вземе приложението ви офлайн. Софтуерът, работещ на много възли, позволява по-лесно справяне с грешки в хардуера, при условие че приложението е създадено с това.

BitTorrent

BitTorrent е един от най-използваните протоколи за прехвърляне на големи файлове в мрежата чрез торенти. Основната идея е да се улесни прехвърлянето на файлове между различни връстници в мрежата, без да се налага да преминавате през основен сървър.

С помощта на клиент BitTorrent се свързвате към множество компютри по целия свят, за да изтеглите файл. Когато отворите .torrent файл, се свързвате с така наречения тракер, който е машина, която действа като координатор. Той помага при откриването на връстници, като ви показва възлите в мрежата, които имат желания файл.

примерна мрежа

Имате представите за два типа потребител, пиявица и сеялка. Лийчър е потребителят, който изтегля файл, а сеялката е потребителят, който качва споменатия файл.

Смешното при партньорските мрежи е, че вие ​​като обикновен потребител имате възможност да се присъедините и да допринесете за мрежата.

BitTorrent и неговите предшественици (Gnutella, Napster) ви позволяват доброволно да хоствате файлове и да качвате на други потребители, които ги искат. Причината BitTorrent е толкова популярна е, че тя беше първата по рода си, предоставяща стимули за участие в мрежата. Freeriding, при който потребителят ще изтегля само файлове, беше проблем с предишните протоколи за споделяне на файлове.

BitTorrent решава фрирайдинг до степен, като кара сеячите да качват повече за тези, които осигуряват най-добрите скорости на изтегляне. Той работи, като ви стимулира да качвате, докато изтегляте файл. За съжаление, след като сте готови, нищо не ви кара да останете активни в мрежата. Това причинява липса на сеялки в мрежата, които имат пълния файл и тъй като протоколът разчита много на такива потребители, решения като частни тракери се появиха в плода. Частните тракери изискват да сте член на общност (често само с покани), за да участвате в разпространената мрежа.

След напредък в полето бяха измислени проследяващи торенти. Това беше надграждане на протокола BitTorrent, който не разчиташе на централизирани тракери за събиране на метаданни и намиране на връстници, а вместо това използва нови алгоритми. Един такъв случай е Kademlia (Mainline DHT), разпределена хеш-таблица (DHT), която ви позволява да намерите връстници чрез други връстници. Всъщност всеки потребител изпълнява задълженията на тракера.

Разпределени книги

Разпределената книга може да се разглежда като неизменна, прикачена само база данни, която се репликира, синхронизира и споделя за всички възли в разпределената мрежа.

Известната скала - Ethereum Network имаше пик от 1,3 милиона транзакции на ден на 4 януари 2018 г.

Те се възползват от модела на търсене на събития, което ви позволява да възстановите състоянието на книгата по всяко време в нейната история.

Blockchain

Blockchain е настоящата основна технология, използвана за разпределени книги и всъщност бележи тяхното начало. Тази най-нова и най-добра иновация в разпределеното пространство даде възможност за създаването на първия в историята наистина разпределен протокол за плащане - Bitcoin.

Blockchain е разпределена книга, съдържаща подреден списък на всички транзакции, които някога са се случвали в нейната мрежа. Сделките се групират и съхраняват в блокове. Целият блокчейн по същество е свързан списък от блокове (оттук и името). Споменатите блокове са изчислително скъпи за създаване и са тясно свързани помежду си чрез криптография.

Казано по-просто, всеки блок съдържа специален хеш (който започва с X количество нули) от съдържанието на текущия блок (под формата на дърво Меркле) плюс хеш на предишния блок. Този хеш изисква много мощност на процесора, защото единственият начин да се измисли е чрез груба сила.

Опростен блокчейн

Миньорите са възлите, които се опитват да изчислят хеша (чрез bruteforce). Всички миньори се състезават помежду си за това кой може да измисли произволен низ (наречен nonce), който при комбиниране със съдържанието създава гореспоменатия хеш. След като някой намери правилното понятие - той го излъчва на цялата мрежа. След това споменатият низ се проверява от всеки възел самостоятелно и се приема в тяхната верига.

Това се превежда в система, в която е абсурдно скъпо да се модифицира blockchain и абсурдно лесно да се провери дали тя не е подправена.

Скъпо е да промените съдържанието на блока, защото това би създало различен хеш. Не забравяйте, че хешът на всеки следващ блок зависи от него. Ако трябваше да промените транзакция в първия блок на снимката по-горе - щяхте да промените Merkle Root. Това от своя страна би променило хеша на блока (най-вероятно без необходимите водещи нули) - това би променило хеша на блок 2 и така нататък и така нататък. Това означава, че ще трябва да добавите нова бележка за всеки блок след този, който току-що променихте.

Мрежата винаги се доверява и копира най-дългата валидна верига. За да измамите системата и евентуално да произведете по-дълга верига, ще ви трябват повече от 50% от общата мощност на процесора, използвана от всички възли.

Blockchain може да се разглежда като разпределен механизъм за възникване на консенсус. Консенсусът не се постига изрично - няма избор или фиксиран момент, когато консенсус се появява. Вместо това консенсусът е възникнал продукт на асинхронното взаимодействие на хиляди независими възли, всички следващи правила на протокола.

Тази безпрецедентна иновация наскоро стана бум в технологичното пространство, като хората прогнозират, че ще отбележат създаването на Web 3.0. Това определено е най-вълнуващото пространство в света на софтуерното инженерство в момента, изпълнено с изключително предизвикателни и интересни проблеми, които чакат да бъдат решени.

Bitcoin

Това, което липсваше предишните протоколи за разпределено плащане, беше начин за практическо предотвратяване на проблема с двойните разходи в реално време и по разпределен начин. Изследванията са дали интересни предложения [1], но биткойн е първият, който прилага практическо решение с ясни предимства пред останалите.

Проблемът с двойното харчене гласи, че актьор (напр. Боб) не може да похарчи единствения си ресурс на две места. Ако Боб има 1 долар, той не трябва да може да го даде както на Алиса, така и на Зак - това е само един актив, той не може да бъде дублиран. Оказва се, че наистина е трудно да се постигне тази гаранция в разпределена система. Има някои интересни подходи за смекчаване, предхождащи блокчейн, но те не решават напълно проблема по практически начин.

Двойното харчене се решава лесно от Bitcoin, тъй като само един блок се добавя към веригата наведнъж. Двойното харчене е невъзможно в рамките на един блок, следователно дори да се създадат два блока едновременно - само един ще бъде в евентуалната най-дълга верига.

Биткойн разчита на трудността при натрупване на мощност на процесора.

Докато в система за гласуване, нападателят трябва да добавя само възли в мрежата (което е лесно, тъй като безплатният достъп до мрежата е цел на проектиране), в схема, базирана на мощност на процесора, атакуващият се изправя пред физическо ограничение: получаване на достъп до повече и повече мощен хардуер.

Това е и причината злонамерените групи възли да трябва да контролират над 50% от изчислителната мощност на мрежата, за да извършат действително успешна атака. По-малко от това, а останалата част от мрежата ще създаде по-бърза блокчейн по-бързо.

Ethereum

Ethereum може да се мисли като програмируема блокчейн базирана софтуерна платформа. Той има собствена криптовалута (Ether), която подхранва внедряването на интелигентни договори в своята blockchain.

Интелигентните договори са парче код, съхраняван като единична транзакция в блокчейн Ethereum. За да стартирате кода, всичко, което трябва да направите, е да извършите транзакция със смарт договор като негова дестинация. Това от своя страна кара миньорските възли да изпълняват кода и каквито и промени да възникнат. Кодът се изпълнява във виртуалната машина Ethereum.

Solidity, родният език за програмиране на Ethereum, е това, което се използва за писане на интелигентни договори. Това е напълно завършващ програмиращ език, който директно взаимодейства с блокчейн Ethereum, като ви позволява да задавате заявки като състояние на баланси или други резултати от интелигентни договори. За да се предотврати безкрайните контури, за изпълнение на кода е необходимо известно количество етер.

Тъй като блокчейнът може да се интерпретира като поредица от промени в състоянието, много от разпределените приложения (DApps) са изградени върху Ethereum и подобни платформи.

По-нататъшно използване на разпределените книги

Доказателство за съществуване - Услуга за анонимно и сигурно съхраняване на доказателство, че определен цифров документ е съществувал в определен момент. Полезно за гарантиране на целостта на документа, собствеността и отпечатването на време.

Децентрализирани автономни организации (DAO) - организации, които използват blockchain като средство за постигане на консенсус относно предложенията за подобряване на организацията. Примери са системата за управление на Dash, проектът SmartCash

Децентрализирано удостоверяване - Съхранявайте самоличността си на blockchain, което ви позволява да използвате единичен вход (SSO) навсякъде. Соврин, Граждански

И много, много повече. Технологията на разпределената книга наистина отвори безкрайни възможности. Някои най-вероятно са измислени, докато говорим!

резюме

В кратката продължителност на тази статия успяхме да определим какво е разпределена система, защо да използвате такава и да преминете малко над всяка категория. Някои важни неща, които трябва да запомните са:

  • Разпределените системи са сложни
  • Те се избират от необходимостта от мащаба и цената
  • С тях е по-трудно да се работи
  • Теорема за ОСП - Съгласуваност / компромис за наличност
  • Те имат 6 категории - хранилища на данни, изчислителни файлове, файлови системи, системи за съобщения, книги, приложения

За да бъдем откровени, почти не сме докоснали повърхността на разпределените системи. Нямах възможността да се справя старателно и да обясня основните проблеми като консенсус, стратегии за репликация, подреждане и време за събития, нетолерантност, излъчване на съобщение в мрежата и други.

Внимание

Нека ви оставя с раздяла предупреждение:

Трябва да се отклоните от разпределените системи, колкото можете. Сложността, която те имат за себе си, не си струва усилията, ако можете да избегнете проблема, като го решите по различен начин, или някакво друго решение, което се предлага извън кутията.

[1]
Борба с двойно изразходване с помощта на кооперативни P2P системи, 25–27 юни 2007 г. - предложено решение, при което всяка „монета“ може да изтече и да бъде определен свидетел (валидатор) на нейната разходване.

Bitgold, декември 2005 г. - Преглед на високо ниво на протокол, изключително подобен на този на Bitcoin. Говори се, че това е предшественикът на биткойн.

По-нататъшно четене на разпределени системи:

Проектиране на интензивни приложения, Martin Kleppmann - Страхотна книга, която надхвърля всичко в разпределените системи и др.

Специализация в облачни компютри, Университет на Илинойс, Курсара - Дълга поредица от курсове (6), които преминават през разпределени системни концепции, приложения

Jepsen - Блог, обясняващ много разпространени технологии (ElasticSearch, Redis, MongoDB и т.н.)

Благодарим, че отделихте време да прочетете тази дълга (~ 5600 думи) статия!

Ако по някакъв случай сте намерили този информативен или смятате, че той ви предоставя стойност, моля, уверете се, че му дадете колкото се може повече класове, които смятате, че заслужава, и помислете за споделяне с приятел, който би могъл да използва въведение в тази прекрасна област на изучаване.

~ Станислав Козловски

Актуализация

В момента работя в Confluent. Confluent е компания с големи данни, основана от самите създатели на Apache Kafka! Безкрайно съм благодарен за възможността, която ми дадоха - в момента работя върху самата Кафка, която е отвъд страхотно! Ние от Confluent помагаме да оформим цялата екосистема с отворен код Kafka, включително нова управлявана оферта за облак Kafka-as-a-service.

Ние се наемаме за много позиции (особено SRE / Софтуерни инженери) в Европа и САЩ! Ако се интересувате от това да работите върху самата Кафка, да търсите нови възможности или просто любопитни - не забравяйте да ми изпратите съобщение в Twitter и аз ще споделя всички страхотни бонуси, които идват от работа в компания в района на залива.