2013-05-14 12 views
5

Jestem początkującym Cassandra - Szukałem informacji związanych z commitami i odzyskiwania awarii w Cassandra na jednym węźle. I mając nadzieję, że ktoś może wyjaśnić szczegóły.Cassandra Commit and Recovery na pojedynczym węźle

Testuję Cassandrę - więc skonfiguruj go na jednym węźle. Używam stressstool na datastax, aby wstawić miliony wierszy. Co dzieje się w przypadku awarii elektrycznej lub wyłączenia systemu? Czy wszystkie dane znajdujące się w pamięci Cassandry zostaną zapisane na dysku po ponownym uruchomieniu Cassandry (chyba, że ​​commitlog działa jako pośrednik)? Jak długo trwa ten proces?

Dzięki!

Odpowiedz

11

Dziennik zatwierdzeń Cassandry zawiera trwałe napisy Cassandry. Kiedy piszesz do Cassandry, zapis jest dołączany do dziennika zatwierdzeń, zanim potwierdzenie zostanie potwierdzone klientowi. Oznacza to, że każdy zapis, że klient otrzyma pomyślną odpowiedź, zostanie zapisany w dzienniku zatwierdzenia. Zapis jest również wprowadzany do bieżącego pliku memtable, który zostanie ostatecznie zapisany na dysk jako SSTable, gdy będzie wystarczająco duży. Może to być dużo czasu po napisaniu.

Jednak dziennik zatwierdzeń nie jest natychmiast synchronizowany z dyskiem ze względu na wydajność. Wartością domyślną jest tryb okresowy (ustawiony przez parametr commitlogsync w pliku cassandra.yaml) z okresem 10 sekund (ustawiany przez commitlog_sync_period_in_ms w pliku cassandra.yaml). Oznacza to, że dziennik zatwierdzania jest zsynchronizowany z dyskiem co 10 sekund. Przy takim zachowaniu można stracić do 10 sekund zapisu, jeśli serwer straci moc. Jeśli masz wiele węzłów w klastrze i użyłeś współczynnika replikacji większego niż jeden, musisz stracić moc do wielu węzłów w ciągu 10 sekund, aby utracić jakiekolwiek dane.

Jeśli to okno ryzyka nie jest akceptowalne, można użyć trybu wsadowego w dzienniku zatwierdzania. Ten tryb nie zatwierdza zapisów do klienta, dopóki dziennik zatwierdzeń nie zostanie zsynchronizowany z dyskiem. Okno czasu jest ustawione przez commitlog_sync_batch_window_in_ms, domyślnie jest to 50 ms. To znacznie zwiększy opóźnienie zapisu i prawdopodobnie zmniejszy przepustowość, więc używaj tego tylko wtedy, gdy koszt utraty kilku potwierdzonych zapisów jest wysoki. Szczególnie ważne jest przechowywanie dziennika zatwierdzeń na oddzielnym dysku podczas korzystania z tego trybu.

W przypadku, gdy serwer traci moc, przy uruchomieniu Cassandra ponownie wyświetla dziennik zatwierdzenia, aby odbudować jego zapis. Proces ten zajmie sekundy (być może minuty) na bardzo ciężkich serwerach zapisu.

Jeśli chcesz się upewnić, że dane w memtables są zapisane na dysku, możesz uruchomić "nodetool flush" (działa to na węzeł). Spowoduje to utworzenie nowej SSTable i usunięcie dzienników zatwierdzeń odnoszących się do danych w opróżnionych memtables.

+3

Dziękuję za szczegółowe i bardzo dobrze napisane wyjaśnienie - teraz jest o wiele jaśniej.Mam nadzieję, że pomoże to innym początkującym, takim jak ja. – user1680784

+0

Wygląda na to, że możesz mieć "batch" i "periodic" do tyłu ... okresowa jest domyślna, aby potwierdzenia czekać, przełączysz się na partię, tak? –

+0

@Richard Mam do czynienia z tym problemem. Dziennik zatwierdzania Cassandra jest uszkodzony. Jakieś sugestie? Zadałem tutaj pytanie: http://stackoverflow.com/questions/33304367/cassandra-exiting-due-to-error-while-processing-commit-log-during-initializatio – Dojo

0

Pytasz coś podobnego

  1. Co się stanie, jeśli wystąpi awaria sieci na dane czasu jest ładowany w Oracle przy użyciu SQL * Loader?
  2. A co się dzieje, że Sqoop przestaje przetwarzać z powodu pewnych warunków podczas przesyłania danych?

Po prostu dane, które są przesyłane przed awarią elektryczną lub zamknięciem systemu, pozostaną niezmienione.

Przejście do drugiego pytania, gdy kiedykolwiek pamięć kończy się w miejscu, tj. Gdy liczba kluczy przekracza określony limit (domyślnie 128) lub gdy osiągnie czas trwania (zegar klastra), jest zapisywany w sstable niezmienna przestrzeń.

+0

Druga część pomógł - dzięki! – user1680784