Pri predpoklade že všetky snody o sebe vedia, určite nepotrebuješ aby všetky snody držali konzistentné kópie všetkých dát.
Rozmýšľal si rozdeliť možné hash hodnoty kľúčov medzi snody? Príklad: máš N (>= M) snodov a chceš držať aspoň M replík dát. To znamená že pre každú hash hodnotu budeš musieť vedieť určiť M snodov kde sa má hodnota nachádzať. A teraz máš nasledovné možnosti: [
http://en.wikipedia.org/wiki/Quorum_(distributed_computing)]
a) chceš aby synchrónny zápis do takejto key value distribuovanej databázy prebehol čo najrýchlejšie. Zapisuješ naraz na všetkých M nodov, ale klientovi (v tomto prípade asi anodu) potvrdzuješ zápis už pri prvom úspešnom potvrdení od ktoréhokoľvek s-nodu.
b) chceš aby čítanie z DB prebehlo čo najrýchlejšie - Potvrdzuješ zápis až keď je zmena rozkopírovaná na všetky zodpovedné snody. Čítanie môžeš potom robiť z ktoréhokoľvek z nich.
c) chceš niečo medzi a a b - pri zápise čakáš na potvrdenie od n/2+1 uzlov. Takisto realizuješ čítanie z n/2+1 uzlov.
Samozrejme pre hodnoty si musíš ukladať aj timestamp aby si vedel posúdiť ktorá verzia je najnovšia. Pri vymazaní hodnoty kľúč nemažeš, ale poznačíš si timestamp zmazania.
Samozrejme situácia je iná pokiaľ nepotrebuješ synchrónny zápis a je ti jedno že v niektorých okamihoch bude databáza nekonzistentná, a je pre teba dôležité iba aby niekedy doiterovala do konzistentného stavu.
Poprípade ak jednotlivé snody nevedia o všetkých s-nodoch a vymieňajú si informácie iba cez susedov. To by sa dalo riešiť najjednoduchšie tak že každý node po prijatí transakcie skontroluje či je pre neho nová ak áno tak si ju uloží a prepošle na všetkých ostatých susedov. Ak by bolo treba minimalizovať komunikáciu potom bude treba asi najprv treba skúsiť vytvoriť minimálny graf aby sa dáta neposielali duplicitne.
Ale to sú už iné story.