• Shoda se stává důležitá v DS, kde různé části systému mohou udržovat kopie dat a informací.

  • Shoda je proces, kdy se všechny uzly v systému dohodnou na společném rozhodnutí nebo hodnotě.

  • Je potřeba zajistit, aby všechny kopie byly v souladu.

  • Shoda v systémech bez selhání, je velmi jednoduchá zjistit.

Skupiny

  • Zavedení redundance.
  • Úlohu uzlu převezme skupina uzlů.

Protokol primární-záloha

  • Hierarchická skupina.
  • Pracuje primární (zápisy).
  • Výpadek primárního záloha převezme roli.

Protokol replikovaného zápisu

  • Plochá skupina.
  • Všichni stejná role.
  • Nemají kritický bod.
  • Nutná koordinace.

Shoda v systémech s možností selhání

Flooding consensus

  • Algoritmus sloužící k dosažení shody v DS.
  • Jedná se o jednoduchý přístup, kde každý uzel systému periodicky rozesílá svůj stav nebo informace o změnách všem ostatním uzlům ve svém okolí.
  • Tento proces se nazývá “flooding” (případně “epidemic dissemination”).
  • Fail-stop (ví kdo vypadl a umí s tím pracovat)

Postup:

  • V každém kole si aktivní uzly vymění své návrhy.
  • Každý uzel z návrhu deterministicky zvolí volbu.
  • Pokud někdo nedostane některou odpověď, začne nové kolo.
  • Všichni dostanou všechny odpovědi volba konec.

Paxos

  • Algoritmus pro dosažení shody v DS, i když se jednotlivé uzly mohou chovat nespolehlivě (např. mohou selhat nebo se zpozdit).

Předpoklady:

  • Máme částečně synchronní či zcela asynchronní DS, který nemá libovolné (byzantské) chyby.
  • Spoje mohou být nespolehlivé.
  • Operace jsou deterministické.
  • Chybné zprávy lze detekovat (Fail-stop).
  • Shoda je rozhodnutí většiny.

  • Tolerance chyb v uzlech.

  • Principy fungování algoritmu Paxos jsou komplexní, ale základní kroky mohou být popsány následovně:

Zjednodušený Paxos algoritmus:

  • Fáze přípravy (Prepare Phase):
    • Proposer vyšle požadavek na acceptory s návrhem čísla (proposal number).
    • Číslo přípravy se skládá z dvou čísel:
      • Číslo instance
      • Unikátní identifikátor uzlu
    • Uzly odpovídají s informace o nejvyšším čísle přípravy, které dosud viděly a s hodnotou, pokud již nějakou mají.
  • Fáze přijetí (Accept Phase):
    • Pokud uzel obdrží dostatek odpovědí ve fázi přípravy, pokračuje fází přijetí.
    • Uzel požádá ostatní uzly o přijetí navrhované hodnoty a informace o čísle přípravy.
    • Uzly odpovídají buď potvrzením, že hodnota byla přijata, nebo odmítnutím s informacemi o nejvyšším čísle přípravy, které dosud viděly.
  • Fáze rozhodnutí (Decision Phase):
    • Pokud uzel obdrží dostatek potvrzení ve fázi přijetí, může rozhodnout o hodnotě, kterou předložil.
    • Pokud uzel obdrží odmítnutí nebo nedostatek potvrzení, musí zahájit nový pokus o dosažení shody s novým číslem přípravy.

Možné chyby:

  • Pokud selže uzel přijímající návrh, nic se neděje, dokud funguje většina.

  • Pokud selže navrhující uzel před návrhem, jeho roli převezme jiný uzel.

  • Pokud selže navrhující uzel v průběhu fáze přijetí, jiný uzel převezme jeho roli a v případě, že existuje alespoň jedna informace o návrhu (zpráva accept()), převezme ji.
  • Funguje i v případě, že více uzlů zahájí návrh, můžu ale dojít k livelocku. To se řeší volbou lídra (např. Bully, Raft, …)

Raft algoritmus

  • Fail-noisy model.
  • Shoda v DS ve formě replikovaného logu operací.
  • ”*Moderní”, často používaný. ‘Náhrada Paxosu’, který je hodně komplikovaný.
  • Stavy uzlů:
    • Lídr, následovník, kandidát.
  • https://raft.github.io