2011-10-10 16 views
7

Chciałbym użyć Cassandra do przechowywania informacji związanych z sesją. Nie mam prawdziwej sesji HTTP - to inny protokół, ale ta sama koncepcja.Cassandra jako sklep sesji pod dużym obciążeniem

Memcached byłby w porządku, ale chciałbym dodatkowo zachować dane.

Cassandra setup:

  • non replikowane klawisz spacji
  • jednorodzinnego Kolumna, w której kluczem jest identyfikator sesji i każda kolumna w ciągu sklepach wiersz pojedynczy klucz/wartość - (Map<String,Set<String,String>>)
  • kolumna TTL = 10 minut
  • zapisu CL = ONE
  • czytać CL = ONE
  • 2,000 pisze/s
  • 5,000 odsłon/s przykład

danych:

session1:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
..... 
    {propXXX:val3, TTL:10 min} 
}, 
session2:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
}, 
...... 
sessionXXXX:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
} 

W tym przypadku spójności nie jest problemem, ale wydajność może być, zwłaszcza dysk IO.

Ponieważ dane w mojej sesji pozostawiają na krótki czas, chciałbym uniknąć przechowywania na dysku twardym - z wyjątkiem dziennika commit.

Mam kilka pytań:

  1. Jeśli kolumna wygasa w Memtable przed płukaniem go SSTable będzie Cassandra i tak przechowywać taką kolumnę w SSTable (wylewać go do HDD)?
  2. Replikacja jest wyłączona dla mojej przestrzeni kluczy, w tym przypadku przechowywanie takiej wygasłej kolumny w SSTable nie byłoby konieczne, prawda?
  3. Każdy kapelusz CF max 10 kolumn. W takim przypadku włączałbym pamięć podręczną wierszy i wyłączał pamięć podręczną kluczy. Ale oczekuję, że moje dane będą nadal dostępne w wersji Memtable, w tym przypadku mogę wyłączyć całą pamięć podręczną, prawda?
  4. Wszelkie wskazówki konfiguracyjne Cassandra takiego przypadku sesji sklep stosowanie byłoby bardzo mile widziane :)

Dziękuję Maciej

+0

mówisz, że chcesz zachować dane, ale chcesz je również TTL po 10 minutach. – sdolgy

+0

To jest ważny proces i chciałbym się upewnić, że to się nie zepsuje. –

Odpowiedz

4

Oto co zrobiłem - i to działa dobrze:

  1. Set replication_factor do 1 - oznacza wyłączenie replikacji
  2. Ustaw gc_grace to 0 - środki usuwać kolumny na pierwszej zagęszczenia. Jest to w porządku, ponieważ dane nie są replikowane.
  3. Zwiększyć rozmiar pamięci i zmniejszyć rozmiar pamięci podręcznej. Chcemy odczytać dane z pamięci podręcznej i pominąć pamięć podręczną - płukanie danych na HDD i ponowne ich odczytanie z HDD do pamięci podręcznej.
  4. Dodatkowo popełnić dziennika może być wyłączona - durable_writes = false

W tej konfiguracji, dane zostaną odczytane z pamięci podręcznej memtable i nie zostaną wykorzystane. Memtable może przydzielić wystarczającą ilość sterty, aby zachować moje dane, dopóki nie wygaśnie, a nawet dłużej.

Po przepłukaniu danych do SSTable, zagęszczanie natychmiast usunie wygasłe wiersze od gc_grace=0.

+4

Nie widzę sensu w tym. Jeśli nie replikujesz, otrzymujesz to, co już masz z memcached. Jeśli węzeł, na którym znajdują się twoje dane, straci dane. Pewnie, że jest w commitlogu, ale odbudowuje węzeł w 10 minut? Czy coś mi brakuje? –

1

Biorąc pod uwagę sprawy użyć, jeśli się nie mylę, które chcą mieć wszystko twoja kluczowa wartość [sessionID => sessionData] paruje w pamięci i te wartości wygasną co 10 minut [Oznacza, że ​​nie chcesz uporczywości].

To dlaczego nie możesz wypróbować czegoś takiego jak redis, który jest magazynem w pamięci.

Od Doc:

Redis jest open source, zaawansowany sklep klucz-wartość. Jest często określany jako serwer struktury danych, ponieważ klucze mogą zawierać łańcuchy, skróty, listy, zestawy i posortowane zestawy.

Ponieważ u nie trzeba Redis replikacji opanować architektura niewolnika nawet może nie wpłynąć Ci

Redis obsługuje TTL również

AFAIK Cassandra jest dobre dla szerokich rzędach tłuszczu [więcej kolumn mniej wierszy] raczej chude wierszy [ transpozycja poprzedniej]. Twój przypadek użycia nie wydaje się tak.

Pozdrawiam, Tamil

+0

Mamy już memcached - byłoby to również w porządku dla takich przypadków użycia. Ale powiedzmy, że mój proces jest ważny i chciałbym się upewnić, że dane nie zostaną utracone podczas tych 10 minut - może być również 30 minut. –

+0

Wszystko, co cię interesuje, to implementacja logu commit w Cassandrze. Mam nadzieję, że to pomoże http://redis.io/topics/persistence, I memu abc memcached i tak – Tamil

Powiązane problemy