Толеранција на неправилности
----------------------------

Карактеристична особина на дистрибуираните системи според која се разликуваат од единичните машини е поимот на парцијални неправилности. Парцијална неправилност може да се случи кога една компонента на дистрибуираниот систем откаже. Оваа неправилност може да влијае врз правилното извршување на други компоненти, додека во исто време можат да постојат компоненти кој нема да бидат засегнати од оваа неправилност. За разлика од тоа, кај единичните системи доколку се појави неправилност, може да дојде до нестабилност на ниво на целиот систем.

Важна цел кај дизајнирањето на дистрибуираните системи е да се конструира таков систем што би можел автоматски да се оправи од парцијална неправилност без сериозни последици на вкупните перформанси. Кога ќе се случи некоја неправилност, добро дизајниранот дистрибуиран систем треба да продолжи со својата работа на некој прифатлив начин додека траат поправките, односно, треба да има толеранција на неправилности.

### Основни концепти

За еден дистрибуиран систем да биде толерантен кон неправилности потребно е да биде нешто што се нарекува „сигурен систем". Сигурноста е термин кој покрива голем број на корисни барања кај дистрибуираните системи вклучувајќи:  **достапност, постојаност, безбедност и одржливост.**

**Достапноста** се дефинира како особина која дозволува еден систем да може да се користи во било кое време. Исто така достапноста означува и дека еден систем функционира правилно во било кој момент и е во состојба да ги извршува барањата од страна на корисниците. Со други зборови, достапен систем е оној кој би бил во функција во дадено време.

**Постојаноста** е особина која му овозможува на системот да работи континуирано без неправилности. За разлика од достапноста, постојаноста е дефинирана во смисла на временски интервал наместо на момент во времето. Високо постојан систем е оној кој би продолжил да работи без прекин за време на релативно долг период. Ако системот е неупотреблив една милисекунда секој час, достапноста изнесува 99.9999 %, но сепак тој е непостојан. Спротивно на ова, еден систем кој никогаш не станува неупотреблив, но секој август се гаси на 2 недели поради одржување, има висок степен на постојаност, но само 96 % достапност.

**Безбедноста** се однесува на ситуација кога системот не работи правилно но сепак ништо катастрофално не се случува. На пример, кај системите со многу процеси, како системите во атомските централи или вселенските станици, се бара нивото на безбедност да биде високо. Доколку таквите системи престанат со правилна работа барем и на краток временски период, последиците можат да бидат катастрофални. Високото ниво на безбедност спречува, при пад на системот, последиците да бидат минимални.

**Одржливоста** се однесува на тоа колку лесно може да се поправи еден оштетен систем. Високо одржлив систем може да покаже висок степен на достапност, особено ако неправилностите можат да се дознаат и поправат автоматски. Сепак автоматското поправање на неправилностите е многу тешко.

За еден систем се вели дека е неупотреблив или паднат, кога не може да ги оствари своите должности. Поточно, кога еден систем е дизајниран да им овозможи голем број на услуги на корисниците, системот е неупотреблив или паднат кога нема да можат да се пружат една или повеќе услуги. Грешка претставува дел од состојбата на системот која може да води до неправилност на системот, односно негово откажување.

Градењето на сигурни системи е тесно поврзана со контролирањето на неправилностите. Постои разлика помеѓу *спречување*, *отстранување* и *прогнозирање* на грешки.

Грешките се класифицираат како **минливи**, **повремени** и **постојани**.

* **Минливите грешки** се случуваат еднаш а потоа исчезнуваат.
* **Повремените грешки** се случуваат па потоа исчезнуваат, па по некое време повторно ќе се случат.
* **Постојаните грешки** постојат сè додека неправилната компонента не се замени, пример е изгорен чип или софтверска грешка.

### Модели на неправилности

Системот којшто не функуцинора не ги овозможува услугите поради кои бил дизајниран, односно опслужувачите, комуникациските канали, или во некои случаи и двата, не ги извршуваат своите задачи. Во дистрибуираните системи, постојат таканаречени релации на зависност, односно функционирањето на една компонента зависи од функционирањето на друга. Постојат повеќе класификациски шеми за типовите на неправилности, меѓу кои и шемите опишани во „Cristian" (1991) и „Hadzilacos and Toueg" (1993):

* Пад на системот
* Изоставување
	+ При примање
	+ При испраќање
* Временска грешка
* Грешка при одговор
	+ Вредносна грешка
	+ Грешка во транзиција
* Арбитражна грешка

Нај сериозни се арбитражните неправилности, исто така познати и како *„Византиски неправилности"*. Пример, еден опслужувач може да дава излезни податоци што всушност никогаш не ни требал да ги даде, но истите не можат да се откријат дека се неточни. Во некој ситуации може да се наиде на сценарио кога еден малициозен опслужувач соработува со други малициозни опслужувачи за да даваат неправилни податоци.

### Маскирање на неправилностите со редундантност

Ако еден систем е толерантен кон неправилности, тогаш тој треба да се потруди да ги скрие неправилностите од другите процеси. Главната техника која се користи при маскирање на неправилностите е редундантноста. Постојат три типа на редундантност:

* Информациска
* Временска
* Физичка

Кај **информациската редундантност**, дополнителни битови се додаваат за полесно оправување од неправилни битови. Пример, на пратените податоци може да се додаде Хамингов код за оправување од шум на линијата за пренос.

Кај **временската редундантност** една акција може да се повторува повеќепати. Пример ако некоја трансакција откаже, истата може да се повтори без да се нанесе штета. Временската редундантност е од помош особено кај повремените и минливите неправилности.

Кај **физичката редундантност**, дополнителни опреми или процеси се пуштаат во употреба за да се намали недостатокот од не функционирањето на некоја друга компонента. Физичката редундантност може да се изврши со додавање на хардверски или софтверски делови. Оваа редундантност со години се користи кај струјните кола.

Еластичност на процеси
----------------------

Со помош на реплицирање на идентични процеси во групи, се намалува можноста од неправилна работа на процесите. Главната особина на ова организирање е кога се испраќа порака до самата група, сите процеси (членови) ја примаат. На овој начин, ако еден процес од групата откаже, некој друг процес може да ја преземе работата. Групите на процеси можат да бидат дунамични, односно можат да се создаваат нови групи, а старите да се уништуваат. Еден процес може да се придружи на нова група или да ја напушти за време на операциите. Исто така, еден процес може да биде член на повеќе групи во исто време.

Процесите се претставуваат на групи. Еден процес може да испрати порака до група на опслужувачи, без притоа да знае кои се тие опслужувачи, колку се на број или каде се наоѓаат. Во некои групи процесите се еднакви меѓусебно и колективно донесуваат одлуки, додека во други групи постојат процеси кои се главни координатори, односно групи каде има хиерархиска поделеност.

Двата типа на организација имаат свои предности и недостатоци. Кај првата група односно рамната група на процеси е симетрична и нема единствена точка на неправилност. Ако еден од процесите откаже, групата едноставно станува помала но може да продолжи со својата работа. Недостаток е тоа што донесувањето на одлуки е комплексна ситуација, која најчесто се решава со гласање, кое одзема време и ресурси. Кај хиерархиската група имаме спротивни својства. Доколку откаже координаторот на групата, целата група ќе престане со работа. Но додека групата е функционална, нема потреба од дополнителни ресурси и време за гласање.

Потребно е постоење на некој метод кој ќе биде одговорен за создавање и бришење на групи, како и некој кој ќе дозволува процесите да можат да напуштаат групи и да се приклучуваат на нови. Еден начин е да се има **опслужувач за групи**, на којшто ќе му се испраќаат сите побарувања. опслужувачот за групи потоа ќе може да чува своја база на податоци за сите групи и нивните членови. Методот е ефикасен и лесен за имплементација, меѓутоа тој има една точка на неправилност. Ако опслужувачот падне, менаџирањето на групите ќе престане да постои, со што може да се случи сите групи да треба да бидат структурирани од почеток како и да се изгуби работата што претходно ја извршувале. Спротивно на ова, менаџирањето на групите може да се извршува на дистрибуиран начин. Пример, ако еден процес сака да се приклучи на некоја група, може да испрати мултикаст до сите групи и да најави дека сака да се приклучи кон некоја. Спротивно на ова, доколку сака да напушти некоја група, потребно е да испрати порака за напуштање до сите. Но во практиката тоа не е толку едноставно, бидејќи процес кој ќе откаже не секогаш испраќа порака дека ќе биде надвор од употреба. Другите членови мораат сами да откријат дека еден од процесите откажал, на тој начин што ќе приметат дека процесот престанал да одговара. Откако ќе откријат, можат да го исфрлат од групата. Исто така, пристапувањето и напуштањето на групите мора да биде синхронизирано со податочните пораки кои се испраќаат. Постои уште една непрвилност кај менаџирањето со групи, а тоа е дека мора да постои некој протокол кој ќе ги изгради од почеток групите, кога повеќе машини ќе престанат да функционираат. Некои од процесите мора сами да ја преземат иницијативата.

### Маскирање на неправилности и репликација

Групирањето на процеси овозможува маскирање на процеси со неправилност со тоа што ќе се сокријат во групата. Со други зборови може да се реплицираат процесите и да се организираат во групи за да се намали штетното влијание на самостоен процес и да се смести во група која е толерантна на неправилности. Постојат два начина за ваква репликација: 

1. Првиот начин претставува создавање на резервни процеси кај хиерархиски поделените групи. Кога координаторот ќе откаже неговата работа се предава на друг процес, кој се одбира со помош на алгоритам.
2. Вториот начин е со користење на активна репликација кај рамните групи на процеси.

Главниот проблем кога се користи репликација за толеранција за неправилности, е да се одлучи колку репликација е потребно. Кај вториот случај на активна репликација кај рамните групи на процеси, кога еден процес ќе откаже потребни се *k*+1 процеси за да се овозможи *k* толерантна група.

Од друга страна доколку имаме Византиска неправилност, потребни се *2k*+1 репликации за да се овозможи *k* толерантна група.

Детекција на неправилности
--------------------------

Покрај тоа што некои неправилности можат да се маскираат на различни начини, останува фактот дека тие најпрво треба да се откријат. Детекцијата на неправилности претставува основа кај толеранција на неправилности кај дистрибуираните системи. Кога станува збор за детекција на неправилности, најчесто има два механизма: *активна проверка* на процесите или *пасивно чекање* одговорите да почнат да доаѓаат од друг процес. Во практира најчесто се користи првиот механизам со проверка на процесите. Исто така постојат механизми кои користат часовници, механизми кои сугерираат секој активен процес да ги информира другите дека е активен.

Системот за детекција на неправилности треба да може да ги препознава неправилностите кои настануваат поради недостатоци во мрежата од неправилното работење на процесите, односно не треба да се дава одлуката на еден процес. Кога ќе се забележи неправилност во работењето на некој процес, потребно е повеќе процеси да пробаат да стапат во контакт со процесот што предизвикува неправилно работење, па потоа да одлучат дали тој процес е сè уште достапен. Доколку процесот работи, меѓусебно треба да се информираат за неговата состојба.

Доверливи клиент-опслужувач комуникации
---------------------------------------

Во многу случаи толеранцијата на грешка во дистрибуираните системи е концентрирана на грешките на процесите. Но, предвид треба да се земат и комуникациските грешки. Во некои случаи комуникацискиот канал може да биде изложен на некои пропусти, паѓање на каналот, временски и произволни грешки. Во практика, кога се прават доверливи комуникациски канали, во центарот на вниманието се пропустите и паѓањето на каналите.

Комуникации од тип точка-точка
------------------------------

Во многу дистрибуирани системи, доверлива комуникација од типот точка-точка е воспоставена со користење на доверлив протокол на транспорт како што е TCP. TCP ги маскира пропустите кои се појавуваат во форма на изгубени пораки, користејќи потврди и ретрансмисии. Таквите грешки се целосно скриени од TCP клиентот. 
Но, грешките со паѓање не се маскирани. Оваа грешка може да се појави кога TCP врската е ненадејно прекината со што не може да се пренесуваат пораки низ комуникацискиот канал. Единствениот начин да се маскираат такви греши е да ми овозможиме на дистрибуираниот систем автоматски да направи нова врска, со едноставно препраќање на барање за поврзување.

RPC семантика во присуство на грешки
------------------------------------

Сега да ја погледнеме подобро клиент-опслужувач комуникацијата кога се користат комуникациски олеснувања од високо ниво како што се Remote Procedure Calls (RPCs). Целта на RPC е да ја скрие комуникацијата правејќи го RPC да личат како да се локални. Проблемот овде се јавува кога се појавува грешка. Во тој случај разликите помеѓу далечинските повици и локалните не се маскираат лесно. Има пет различни класи на грешки кои можат да се појават во PRC системите:

* Клиентот не е во можност да го пронајде опслужувачот.
* Барањето од клиентот до опслужувачот е изгубено.
* опслужувачот паѓа по добивањето на барањето.
* Пораката со одговорот од опслужувачот до клиентот е изгубена.
* Клиентот паѓа по праќањето на барањето.

Доверлива комуникација во групи
-------------------------------

Имајќи предвид колку е важна еластичноста на процесите од страна на репликацијата, не е толку изненадувачки дека доверливи се и мултикаст сервисите. Овие сервиси гарантираат дека пораките се испорачани до сите членови на групата. Но за жал, тоа не е секогаш така и во овој дел ќе ги погледнеме подобро прашањата кои се вклучени во доверливото испорачување на пораките до членовите на групата.

#### Основни шеми на доверливо мултикастирање

Прво да дефинираме прецизно што е всушност доверливо мултикастирање. Интуитивно, тоа значи дека пораката која е пратена до некоја група треба да биде испорачана на секој член од таа група. Но, што ќе се случи ако за времетраењето на комуникацијата друг процес (член) се вклучи во групата? Треба ли и тој процес да ја прими пораката? Исто така треба да се одлучи што ќе се случи ако процесот кој праќа падне за време на комуникацијата. 
За да се покријат овие ситуации разлика треба да се направи помеѓу доверлива комуникација во моментот на паѓањето на процесот, и доверлива комуникација кога се претпоставува дека процесите работат како што треба. 
Во првиот случај мултикастирањето се смета дека е доверливо кога може да гарантира сите членови од групата кои работат ќе ја примат таа порака. овде заплетканиот дел е дека договорот треба да се направи на тоа како изгледала групата пред да биде испорачана пораката, во поглед на понатамошните случувања. Ситуацијата станува поедноставна ако претпоставиме дека договорот е кој е член на групата а кој не е. Во основа, претпоставуваме дека процесите не паѓаат, и порцесите не и се придружуваат или ја напустаат групата додека се одвива комуникацијата, доверливо мултикастирање едноставно значи дека секоја порака треба да биде испорачана на секој моментален член на групата.

#### Размерливост во доверливото мултикастирање

Оваа послаба форма на доверливо мултикастирање е релативно лесна за имплементација е лесна за имплементирање, но бројот на примачи е ограничен. Ако има N примачи, праќачот треба да биде подготвен да прими барем N потврдувања. Со многу примачи праќачот може да биде преплавен со повратни пораки, што исто така се нарекува повратна експлозија. 
Едно решение на овој проблем е да не има повратни пораќи за потврда. Наместо тоа, примачот да прати порака да праќачот само да го информира ако не му стигнала пораката. 
Друг проблем со враќањето само на негативните потвдувања е тоа што праќачот во теорија ќе биде приморан да ја чува пораката во неговиот бафер со историја засекогаш, бидејќи праќачот не знае дали пораката била точно испорачана па затоа треба да биде спремен за повторно барање за истата порака од страна на примачот. 
Неколку предлози и различни шеми постојат за размерливо доверливо мултикастирање.

#### Нехиерархиска контрола на потврдувања

Оваа контрола на потврдувања е клучно прашање за размерливите решенија за доверливо мултикастирање каде што се намалува бројотнна потврдни пораки кои се праќаат до пракачот. Популарен модел кој е применет на неколку wide-area апликации е feedback sippression.

#### Хиерархиска конрола на потврдувања

За да објасниме како работи хиерархиската контрола, да претпоставиме дека има само еден единствен праќач кој треба да ги прати пораките до големи групи на примачи. Групата на примачи е партиционирана (поделена) на број од подгрупи, кои понатаму се организирани во дрво. Подгрупата која го содржи праќачот го формира коренот на дрвото. Со секоја подгрупа, било кое доерлива мултикастирачка пема која работи на мали групи може да се користи. 
Главнот проблем со хиерархиски решенија е конструкцијата на дрвото. Во многу случаи дрвото треба да биде конструирано динамички.

Наводи
------

[1] Andrew S. Tanenbaum, Maarten Van Steen, *Distributed Systems Principles and Paradigms (2002) first edition*

[2] Andrew S. Tanenbaum, Maarten Van Steen, *Distributed Systems Principles and Paradigms (2006) second edition*

[3] Colorious, George, Dollimore J. Kindberg T. *Distributed Systems, Concepts and Design (2001) 3rd ed. Pearson Education , p. 2.* 

[4] Brian Selic, 2004,  *Fault tolerance techniques for distributed systems* ,