Podczas zapisywania do Redis ( SET foo bar
) pojawia się następujący błąd:
MISCONF Redis jest skonfigurowany do zapisywania migawek RDB, ale obecnie nie jest w stanie utrzymać się na dysku. Polecenia, które mogą modyfikować zestaw danych, są wyłączone. Sprawdź dzienniki Redis, aby uzyskać szczegółowe informacje na temat błędu.
Zasadniczo rozumiem, że problem polega na tym, że redis nie jest w stanie zapisać danych na dysku, ale nie mam pojęcia, jak pozbyć się problemu.
Również następujące pytanie ma ten sam problem, dawno temu zostało porzucone bez odpowiedzi i najprawdopodobniej bez prób rozwiązania problemu.
redis
, ale to nie pomaga!Odpowiedzi:
W przypadku wystąpienia błędu i niemożności odrzucenia niektórych ważnych danych w działającej instancji Redis (problemy z uprawnieniami do
rdb
pliku lub jego katalogu nieprawidłowo lub brak miejsca na dysku), zawsze możesz przekierowaćrdb
plik, aby go zapisać w innym miejscu.Za pomocą
redis-cli
możesz zrobić coś takiego:Następnie możesz wykonać
BGSAVE
polecenie, aby upewnić się, że dane zostaną zapisane wrdb
pliku. Upewnij się, że podczas wykonywaniaINFO persistence
,bgsave_in_progress
już jest0
irdb_last_bgsave_status
jestok
. Następnie możesz rozpocząć tworzenie kopii zapasowej wygenerowanegordb
pliku w bezpiecznym miejscu.źródło
dir C:/Temp/
. Zrób bgsave, aby sprawdzić, czy to działa.Za pomocą
redis-cli
możesz przerwać próbę zapisania migawki:Jest to szybkie obejście, ale jeśli zależy Ci na danych, z których korzystasz, powinieneś sprawdzić, aby upewnić się, dlaczego bgsave zawiodło na pierwszym miejscu.
źródło
Mogą wystąpić błędy podczas procesu bgsave z powodu małej ilości pamięci. Wypróbuj to (z najczęściej zadawanych pytań o zapisywanie w tle Redis)
źródło
Ten błąd występuje z powodu niepowodzenia BGSAVE. Podczas BGSAVE Redis prosi proces potomny o zapisanie danych na dysku. Chociaż dokładny powód niepowodzenia BGSAVE można sprawdzić z dzienników (zwykle na komputerach
/var/log/redis/redis-server.log
z systemem Linux), ale wiele razy BGAVE zawodzi, ponieważ widelec nie może przydzielić pamięci. Wiele razy widelec nie przydziela pamięci (chociaż maszyna ma wystarczającą ilość dostępnej pamięci RAM) z powodu sprzecznej optymalizacji przez system operacyjny.Jak można przeczytać w Redis FAQ :
Redis nie potrzebuje tyle pamięci, ile system operacyjny uważa, że zapisuje na dysk, więc może wyprzedzająco zawieść rozwidlenie.
Aby rozwiązać ten problem, możesz:
Zmodyfikuj
/etc/sysctl.conf
i dodaj:Następnie uruchom ponownie sysctl za pomocą:
Na FreeBSD:
W systemie Linux:
źródło
systemctl status redis
ujawniły, że istnieje ostrzeżenie sugerujące dokładnie zmianęovercommit_memory=0
ustawienia. Zmiana, która rzeczywiście rozwiązała problem dla mnie.Uruchom ponownie serwer Redis.
brew services restart redis
.sudo service redis restart
/sudo systemctl restart redis
services.msc
, Enter-> Wyszukaj,Redis
a następnie kliknijrestart
.Osobiście miałem ten problem po aktualizacji Redis za pomocą Brew (
brew upgrade
). Po ponownym uruchomieniu laptopa od razu zadziałało.źródło
sudo
:brew services stop redis; sudo brew services start redis
.jeśli pracujesz na komputerze z linuksem, sprawdź również uprawnienia do plików i folderów bazy danych.
Db i ścieżkę do niego można uzyskać poprzez:
w
redis-cli
:i w wierszu poleceń
ls -l
. Uprawnienia do katalogu powinny wynosić 755 , a uprawnienia do pliku - 644 . Ponadto normalnie serwer redis działa jako użytkownikredis
, dlatego dobrze jest też przekazać użytkownikowiredis
własność folderu poprzez wykonaniesudo chown -R redis:redis /path/to/rdb/folder
. Zostało to rozwinięte w odpowiedzi tutaj .źródło
Dziękujemy wszystkim za sprawdzenie problemu, najwyraźniej wystąpił błąd podczas
bgsave
.Dla mnie wpisanie
config set stop-writes-on-bgsave-error no
powłoki i ponowne uruchomienie Redis rozwiązało problem.źródło
Uruchom serwer Redis w katalogu, w którym Redis ma uprawnienia do zapisu
Powyższe odpowiedzi z pewnością rozwiążą Twój problem, ale oto, co się właściwie dzieje:
Domyślną lokalizacją do przechowywania
rdb.dump
pliku jest./
(oznaczający bieżący katalog). Możesz to sprawdzić w swoimredis.conf
pliku. Dlatego katalog, z którego uruchamiasz serwer redis, jest miejscem, w którymdump.rdb
plik zostanie utworzony i zaktualizowany.Wygląda na to, że zacząłeś uruchamiać serwer redis w katalogu, w którym redis nie ma odpowiednich uprawnień do utworzenia
dump.rdb
pliku.Co gorsza, redis prawdopodobnie również nie pozwoli ci zamknąć serwera, dopóki nie będzie w stanie utworzyć pliku rdb, aby zapewnić prawidłowe zapisywanie danych.
Aby rozwiązać ten problem, musisz przejść do aktywnego środowiska klienta redis za pomocą
redis-cli
i zaktualizowaćdir
klucz oraz ustawić jego wartość w folderze projektu lub dowolnym folderze, w którym użytkownik inny niż root ma uprawnienia do zapisywania. Następnie uruchom,BGSAVE
aby wywołać tworzeniedump.rdb
pliku.(Teraz, jeśli potrzeba , aby zapisać plik dump.rdb w katalogu, który rozpoczął się w serwer, a następnie będzie trzeba zmienić uprawnienia do katalogu, tak aby Redis można napisać do niego. Można wyszukiwać stackoverflow dla jak to zrobić ).
Teraz powinieneś być w stanie zamknąć serwer Redis. Zauważ, że zakodowaliśmy ścieżkę na stałe. Hardcoding jest rzadko dobrą praktyką i bardzo polecam uruchomienie serwera redis z katalogu projektu i zmianę
dir key back to
. / `.W ten sposób, gdy potrzebujesz redis dla innego projektu, plik zrzutu zostanie utworzony w katalogu bieżącego projektu, a nie w katalogu projektu ścieżki zakodowanej na stałe.
źródło
redis
więc:sudo chown redis:redis /var/lib/redis
Jeśli korzystasz z systemu MacOS i niedawno dokonałeś aktualizacji do Cataliny, może być konieczne uruchomienie
brew services restart redis
zgodnie z sugestią tego problemu .źródło
Napotkałem ten błąd i mogłem dowiedzieć się z dziennika, że błąd wynika z niewystarczającej ilości miejsca na dysku. Wszystkie dane, które zostały wstawione do mojej skrzynki, nie były już potrzebne. Więc próbowałem FLUSHALL. Ponieważ proces redis-rdb-bgsave był uruchomiony, nie pozwalał również na FLUSH danych. Wykonałem poniższe kroki i mogłem kontynuować.
Proces redis-rdb-bgsave nie działał już po powyższych krokach.
źródło
Napotkałem podobny problem, głównym powodem tego było zużycie pamięci (RAM) przez redis. Moja maszyna EC2 miała 8 GB pamięci RAM (około 7,4 dostępnych do konsumpcji)
Gdy mój program działał, zużycie pamięci RAM wzrosło do 7,2 GB, pozostawiając prawie ~ 100 MB pamięci RAM, co ogólnie powoduje uruchomienie
MISCONF Redis error ...
Możesz określić zużycie pamięci RAM za pomocą
htop
polecenia. Poszukaj atrybutu Mem po uruchomieniu polecenia htop. Jeśli pokazuje wysokie zużycie (tak jak w moim przypadku było to 7,2 GB / 7,4 GB) Lepiej jest zaktualizować instancję o większą pamięć. W tym scenariuszu korzystanieconfig set stop-writes-on-bgsave-error no
będzie katastrofą dla serwera i może spowodować zakłócenie działania innych usług działających na serwerze (jeśli występują). Lepiej więc uniknąć polecenia config i ULEPSZ SWOJĄ REDIS MACHINE .FYI: Może być konieczne zainstalowanie htop, aby to działało:
sudo apt-get install htop
Jeszcze jednym rozwiązaniem tego problemu może być inna usługa o dużej pojemności pamięci RAM działająca w systemie, sprawdź inną usługę działającą na serwerze / maszynie / instancji i zatrzymaj ją, jeśli nie jest to konieczne. Aby sprawdzić wszystkie usługi uruchomione na twoim komputerze, użyj
service --status-all
I sugestia dla osób bezpośrednio wklejających polecenie config, proszę ponownie przeszukać i przynajmniej ostrzec użytkownika przed użyciem takich poleceń. I jak wspomniał @Rodrigo w swoim komentarzu: „Zignorowanie błędów nie jest fajne”.
---AKTUALIZACJA---
Możesz także skonfigurować
maxmemory
imaxmemory-policy
zdefiniować zachowanie Redis po osiągnięciu określonego limitu pamięci. Na przykład, jeśli chcę zachować limit pamięci 6 GB i usunąć ostatnio używane klucze z DB, aby upewnić się, że użycie pamięci redis nie przekracza 6 GB, możemy ustawić te dwa parametry (w redis.conf lub CONFIG SET Komenda):Istnieje wiele innych wartości, które możesz ustawić dla tych dwóch parametrów, o których możesz przeczytać tutaj: https://redis.io/topics/lru-cache
źródło
Bardziej trwałym rozwiązaniem może być sprawdzenie w /etc/redis/redis.conf wokół linii 200-250, istnieją ustawienia dla funkcji rdb, które nie były częścią redis w 2.x dniach.
szczególnie
można zmienić na
lub możesz skomentować wszystkie wiersze zapisu i nie martwić się o trwałość. (Zobacz komentarze w /etc/redis/redis.conf)
Nie zapomnij też
źródło
wszystkie te odpowiedzi nie wyjaśniają przyczyny niepowodzenia zapisu rdb.
w moim przypadku sprawdziłem dziennik redis i znalazłem:
uruchom następującą komendę w terminalu:
wyświetla:
to jest to! ten proces (redis save rdb) zostaje zabity przez zabójcę OOM
odnosi się:
https://github.com/antirez/redis/issues/1886
Ustalenie, który proces został zabity przez zabójcę Linux OOM
źródło
FWIW, natknąłem się na to i rozwiązaniem było po prostu dodanie pliku wymiany do pudełka. Zastosowałem tę metodę: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
źródło
Ja też miałem do czynienia z tym samym problemem. Obie odpowiedzi (najbardziej uprzywilejowana i zaakceptowana) dają tymczasową naprawę tego samego.
Co więcej,
config set stop-writes-on-bgsave-error no
jest to okropny sposób, aby przeoczyć ten błąd, ponieważ to, co robi ta opcja, to powstrzymanie redis od powiadamiania, że zapisy zostały zatrzymane i przejście bez zapisywania danych w migawce. To po prostu ignoruje ten błąd. Zobacz toJeśli chodzi o ustawienie
dir
wconfig
redis-cli, po ponownym uruchomieniu usługi redis, to również zostanie wyczyszczone i ponownie pojawi się ten sam błąd. Domyślna wartośćdir
inredis.conf
to./
, a jeśli zaczniesz redis jako użytkownik root,./
to/
do których uprawnień do zapisu nie są przyznawane, i stąd błąd.Najlepszym sposobem jest ustawienie
dir
parametru w pliku redis.conf i ustawienie odpowiednich uprawnień do tego katalogu. Większość dystrybucji Debiana powinna to mieć/etc/redis/redis.conf
źródło
W dzisiejszych czasach problemy z dostępem do zapisu w Redis, które dają ten komunikat o błędzie klientowi, pojawiły się ponownie w oficjalnych
redis
kontenerach dokerów.Redis z oficjalnego
redis
obrazu próbuje zapisać plik .rdb w/data
folderze pojemników , co jest raczej niefortunne, ponieważ jest to folder będący własnością root i również nietrwałe położenie (zapisane tam dane znikną, jeśli twój kontener / pod awarie).Więc po godzinie bezczynności, jeśli uruchomiłeś
redis
kontener jako użytkownik inny niż root (np.docker run -u 1007
Zamiast domyślnegodocker run -u 0
), otrzymasz log szczegółowy błędu w dzienniku serwera (patrzdocker logs redis
):Musisz więc zamapować
/data
folder kontenera na lokalizację zewnętrzną (gdzie użytkownik inny niż root, tutaj: 1007, ma dostęp do zapisu, na przykład/tmp
na komputerze hosta), np .:Więc jest to błąd konfiguracji obrazu oficjalny Döcker (który powinien napisać do
/tmp
nie/data
), która produkuje tę „bombę zegarową”, które najprawdopodobniej spotkanie tylko w produkcji ... noc nad jakimś szczególnie cichej weekendu: /źródło
dla mnie
i ponownie ładuję komputer Mac, to działa
źródło
Wystąpił ten problem podczas pracy na serwerze z miejscem na dysku AFS, ponieważ mój token uwierzytelnienia wygasł, co dało
Permission Denied
odpowiedzi, gdy serwer redis próbował zapisać. Rozwiązałem to, odświeżając mój token:kinit USERNAME_HERE -l 30d && aklog
źródło
Jeśli używasz Dockera / Docker-Compose i chcesz uniemożliwić redisowi zapisywanie do pliku, możesz utworzyć konfigurację redis i zamontować w kontenerze
docker.compose.override.yml
Możesz pobrać domyślną konfigurację stąd
w pliku redis.conf upewnij się, że skomentowałeś te 3 linie
Myou można zobaczyć więcej rozwiązań do usuwania uporczywych dane tutaj
źródło
W moim przypadku stało się tak, ponieważ właśnie zainstalowałem
redis
w szybki sposób. Więc redis nie działa jako root. Byłem w stanie rozwiązać ten problem, postępując zgodnie z instrukcjami podanymi wInstalling Redis more properly
części ich Przewodnika szybkiego startu . Po wykonaniu tej czynności problem został rozwiązany iredis
działa teraz jako root. Sprawdź to.źródło
Po tym, jak w końcu uderzyłem się w tak wiele pytań SO - dla mnie odpowiedź @Axel Advento zadziałała, ale z kilkoma dodatkowymi krokami - wciąż miałem problemy z pozwoleniami.
Musiałem zmienić użytkownika
redis
, utworzyć nowy katalog w katalogu domowym, a następnie ustawić go jako katalog redis.źródło
W moim przypadku było to związane z wolnym miejscem na dysku. (można to sprawdzić za pomocą
df -h
polecenia bash), gdy zwolnię trochę miejsca, ten błąd zniknął.źródło
Jeśli uruchamiasz Redis lokalnie na komputerze z systemem Windows, spróbuj „uruchomić jako administrator” i sprawdź, czy działa. Problem ze mną polegał na tym, że Redis znajdował się w folderze „Program Files”, co domyślnie ogranicza uprawnienia. Jak powinno.
Nie uruchamiaj jednak automatycznie Redis jako administrator. Nie chcesz przyznawać mu więcej praw, niż powinno. Chcesz rozwiązać ten problem przez książkę.
Tak więc byliśmy w stanie szybko zidentyfikować problem, uruchamiając go jako administrator, ale to nie jest lekarstwo. Prawdopodobnym scenariuszem jest umieszczenie Redis w folderze, który nie ma uprawnień do zapisu, w wyniku czego plik DB jest przechowywany w tej samej lokalizacji.
Możesz rozwiązać ten problem, otwierając
redis.windows.conf
i, aby wyszukać następującą konfigurację:Przejdź
dir ./
do ścieżki, dla której masz regularne uprawnienia do odczytu / zapisuMożesz także przenieść folder Redis w całości do folderu, o którym wiesz, że ma odpowiednie uprawnienia.
źródło
Dla mnie był to po prostu problem uprawnień do stałego folderu danych redis. Dałem to:
I to działa! Być może jest już za wcześnie, aby powiedzieć, że to rozwiązało problem. Ponieważ podejrzewam również, że redis nie wykonuje się jako root, dlatego muszę sprawdzić mój plik dockerFile, aby dowiedzieć się więcej.
źródło
Sprawdź dziennik Redis przed podjęciem jakichkolwiek działań. Niektóre rozwiązania w tym wątku mogą skasować dane Redis, więc uważaj na to, co robisz.
W moim przypadku w maszynie zabrakło pamięci RAM . Może się to również zdarzyć, gdy na hoście nie ma już wolnego miejsca na dysku .
źródło
Należy pamiętać, że ten błąd pojawia się, gdy serwer jest atakowany. Właśnie odkryłem, że redis nie zapisuje do '/etc/cron.d/web', gdzie po poprawieniu uprawnień dodano nowy plik składający się z algorytmu wyszukiwania z pewnymi opcjami ukrywania.
źródło
źródło
Jak zauważył @Chris, problem może być zbyt niski. Zaczęliśmy go doświadczać, gdy przydzieliliśmy zbyt dużo pamięci RAM MySQL (
innodb_buffer_pool_size
).Aby zapewnić wystarczającą ilość pamięci RAM dla Redis i innych usług, które zredukowaliśmy
innodb_buffer_pool_size
na MySQL.źródło
W moim przypadku przyczyną było bardzo mało wolnego miejsca na dysku (tylko 35 Mb). Zrobiłem następujące -
Usuń plik zrzutu redis (jeśli istniejące dane nie są potrzebne)
sudo rm /var/lib/redis/*
Usuń wszystkie klucze wszystkich istniejących baz danych
sudo redis-cli flushall
źródło
musisz chmod i przejrzeć nowy folder
chown -R redis i chmod ...
źródło