Czy Redis utrwala dane?

122

Rozumiem, że Redis obsługuje wszystkie dane z pamięci, ale czy utrzymuje się również po ponownym uruchomieniu serwera, tak że po ponownym uruchomieniu serwera wczytuje do pamięci wszystkie dane z dysku. A może zawsze jest to pusty magazyn, który służy tylko do przechowywania danych, gdy aplikacje działają bez trwałości?

Zuriar
źródło
1
Nie jestem pewien, czy dobrze rozumiem Twoje pytanie. Możesz zapisać migawkę na dysku i odczytać z tego pliku, jeśli tego nie zrobisz, twoja baza danych redis będzie pusta po ponownym uruchomieniu.
Sefa

Odpowiedzi:

82

Proponuję przeczytać o tym na http://redis.io/topics/persistence . Zasadniczo tracisz gwarantowaną trwałość, gdy zwiększasz wydajność, używając tylko przechowywania w pamięci. Wyobraź sobie scenariusz, w którym WSTAWISZ do pamięci, ale zanim utraci moc, spowoduje utratę zasilania. Nastąpi utrata danych.

Redis obsługuje tak zwane „migawki”. Oznacza to, że będzie robił pełną kopię tego, co jest w pamięci w pewnym momencie (np. Co pełną godzinę). Gdy stracisz zasilanie między dwoma migawkami, utracisz dane z czasu między ostatnią migawką a awarią (nie musi to być przerwa w zasilaniu ..). Redis porównuje bezpieczeństwo danych z wydajnością, tak jak robi to większość baz danych NoSQL.

Większość baz danych NoSQL opiera się na koncepcji replikacji między wieloma węzłami, aby zminimalizować to ryzyko. Redis jest uważany za bardziej szybką pamięć podręczną zamiast bazy danych, która gwarantuje spójność danych. Dlatego jego przypadki użycia zazwyczaj różnią się od tych, które występują w prawdziwych bazach danych: możesz na przykład przechowywać sesje, liczniki wydajności lub cokolwiek innego z niezrównaną wydajnością i bez rzeczywistych strat w przypadku awarii. Ale przetwarzanie zamówień / historii zakupów i tak dalej jest uważane za zadanie dla tradycyjnych baz danych.

Manuel Arwed Schmidt
źródło
1
Będzie wspaniale, jeśli możesz dodać domyślne zachowanie trwałości. Podobnie jak odpowiedź @Leonid Beschastny.
yeya
40

Serwer Redis od czasu do czasu zapisuje wszystkie swoje dane na dysku twardym, zapewniając w ten sposób pewien poziom trwałości.

Zapisuje dane w jednym z następujących przypadków:

  • automatycznie od czasu do czasu
  • kiedy ręcznie wywołujesz BGSAVEpolecenie
  • kiedy usługa redis jest zamykana

Ale dane w redis nie są tak naprawdę trwałe, ponieważ:

  • awaria procesu redis oznacza utratę wszystkich zmian od ostatniego zapisu
  • BGSAVE operację można wykonać tylko wtedy, gdy masz wystarczającą ilość wolnej pamięci RAM (ilość dodatkowej pamięci RAM jest równa rozmiarowi redis DB)

Uwaga: BGSAVE zapotrzebowanie na pamięć RAM jest prawdziwym problemem, ponieważ redis kontynuuje pracę, dopóki nie będzie więcej pamięci RAM do uruchomienia, ale przestaje zapisywać dane na HDD znacznie wcześniej (przy około 50% pamięci RAM).

Aby uzyskać więcej informacji, zobacz trwałość Redis .

Leonid Beschastny
źródło
1
Odkąd ta odpowiedź została napisana, redis wprowadził alternatywny model trwałości zwany AOF, który zapewnia znacznie wyższą trwałość, ale ma kilka innych wad, takich jak większe wykorzystanie dysku i wolniejsze uruchamianie serwera.
Leonid Beschastny
15

To kwestia konfiguracji. Możesz mieć brak, częściową lub pełną trwałość swoich danych w Redis. Najlepsza decyzja zostanie podjęta w oparciu o techniczne i biznesowe potrzeby projektu.

Zgodnie z dokumentacją Redis dotyczącą trwałości można skonfigurować instancję tak, aby zapisywała dane na dysku od czasu do czasu lub przy każdym zapytaniu, w skrócie. Zapewniają dwie strategie / metody AOF i RDB (przeczytaj dokumentację, aby zobaczyć szczegóły na ich temat), możesz używać każdej z nich samodzielnie lub razem.

Jeśli chcesz mieć „trwałość podobną do SQL”, powiedzieli:

Ogólne wskazanie jest takie, że jeśli chcesz uzyskać stopień bezpieczeństwa danych porównywalny z tym, jaki może zapewnić PostgreSQL, powinieneś używać obu metod trwałości.

Adailson De Castro
źródło
7

Generalnie odpowiedź brzmi tak , jednak pełniejsza odpowiedź naprawdę zależy od rodzaju danych, które próbujesz przechowywać. Ogólnie rzecz biorąc, bardziej kompletna krótka odpowiedź brzmi:

  • Redis nie najlepiej nadaje się do trwałej pamięci masowej, ponieważ koncentruje się głównie na wydajności
  • Redis jest naprawdę bardziej odpowiedni do niezawodnego przechowywania w pamięci / buforowania aktualnych danych stanu , szczególnie w celu umożliwienia skalowalności poprzez zapewnienie centralnego źródła danych używanych na wielu klientach / serwerach

Powiedziawszy to, Redis domyślnie będzie utrwalać migawki danych w okresowych odstępach czasu (najwyraźniej co 1 minutę, ale tego nie weryfikowałem - jest to opisane w poniższym artykule, który jest dobrym podstawowym wprowadzeniem):

http://qnimate.com/redis-permanent-storage/


TL; DR

Z oficjalnych dokumentów :

  • Trwałość RDB [wartość domyślna] wykonuje migawki zbioru danych z określonego punktu w czasie w określonych odstępach czasu.
  • Trwałość AOF [musi być jawnie skonfigurowana] rejestruje każdą operację zapisu otrzymaną przez serwer, która zostanie odtworzona ponownie podczas uruchamiania serwera, odtwarzając oryginalny zestaw danych.

Redis musi być jawnie skonfigurowany pod kątem trwałości AOF, jeśli jest to wymagane, co spowoduje spadek wydajności, a także wzrost dzienników. Może to wystarczyć do stosunkowo niezawodnego utrzymywania ograniczonej ilości przepływu danych.

Chris Halcrow
źródło
5

Możesz zrezygnować z trwałości w ogóle. Lepsza wydajność, ale wszystkie dane tracą podczas zamykania Redis.

Redis ma dwa mechanizmy trwałości: RDB i AOF.RDB używa globalnego snapshooting harmonogramu, a AOF zapisuje aktualizację do pliku dziennika tylko apappend, podobnego do MySql.

Możesz użyć jednego z nich lub obu, a po ponownym uruchomieniu Redis konstruuje dane z odczytu pliku RDB lub pliku AOF.

songxin
źródło