Asymmetrisk Cache
måndag, januari 14th, 2008Den tidigare implementationen som jag skrivit om (SymmetricCache) garanterar att alla noder i ett kluster har samma data. Problemet med en sån lösning är att om datamängden blir stor så blir det mycket dyrt och svårt att skala ut. I det långa loppet så är det i princip omöjligt att alla noder i ett kluster ska ha samma tillstånd. Antingen tar minnet eller diskkapaciteten slut (detta gäller naturligtvis stora webapplikationer). För att kunna skala ut rejält så behövs en asymmetrisk modell. Detta är precis vad jag tagit fram och jag kallar den lite lamt “AsymmetricCache”.Nyckel/värdeparen sprids jämnt över klustret med lastbalansering och replikeras till X servrar. X bör vara 1 för minnescachar och 2 eller högre för diskcachar om en cachemiss är att betrakta som dataförlust. Detta är en klient/server lösning som fungerar ungefär som memcached.MemCached klienterna använder sig av en asymmetrisk modell när de väljer vilken server som ska få lagra vilket data. Den modellen baserar sig på en algoritm som kallas Consistent hash och är vanlig bland webcachar i allmänhet. Problemet med memcached är att det inte finns en mekanism som håller koll på vilken server vad är lagrat. Pga detta så kan man inte använda memcached för annat än transient data där en cachemiss trots att datat finns lagrat nånstans inte betraktas som dataförlust. Memcached största styrka är att den är så enkel att hantera både på klient och serversidan och är mycket testad och robust.En annan svaghet är att om man lägger till servrar så måste alla klienters konfiguration uppdateras och hela klustret omhashas, vilket betyder att klienterna tappar information om vart de lagrat tidigare data, vilket i sin tur kan ge en cachemiss trots att datat finns nånstans i klustret. Eftersom consistent hash används så måste dock inte hela klustrets info kastas.Features hos AsymetricCache:
Du hittar implementationen i Subversion där den heter AsymmetricJgroupsCacheEngine. Som vanligt hittar du exempel på hur den konfas i PlainCacheTest och i metoden testAsymmetricClient1() |


