MISCONF Redis jest skonfigurowany do zapisywania migawek RDB

366

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.

Salvador Dali
źródło
czy udało Ci się rozwiązać ten problem. Jeśli tak, czy mógłbyś pomóc w wykonaniu tych kroków? Ponieważ umieszczenie pliku rdb w innym miejscu nie rozwiązałoby go, jak sądzę. Myślę, że czegoś mi brakuje
ankur,
4
Ten błąd występuje z powodu uruchomienia serwera redis w katalogu, w którym redis nie ma uprawnień. Polecam przywrócenie ustawień domyślnych po rozwiązaniu problemu: Zobacz odpowiedź dotyczącą rozwiązania tego problemu.
Govind Rai
Oprócz odpowiedzi Govinda Rai: stackoverflow.com/a/47880440/5649620
Vyshnav Ramesh Thrissur
@GovindRai Udzieliłem już uprawnienia redis, zmieniając zarówno grupę, jak i właściciela redis, ale to nie pomaga!
wdetac

Odpowiedzi:

184

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 rdbpliku lub jego katalogu nieprawidłowo lub brak miejsca na dysku), zawsze możesz przekierować rdbplik, aby go zapisać w innym miejscu.

Za pomocą redis-climożesz zrobić coś takiego:

CONFIG SET dir /tmp/some/directory/other/than/var
CONFIG SET dbfilename temp.rdb

Następnie możesz wykonać BGSAVEpolecenie, aby upewnić się, że dane zostaną zapisane w rdbpliku. Upewnij się, że podczas wykonywania INFO persistence, bgsave_in_progressjuż jest 0i rdb_last_bgsave_statusjest ok. Następnie możesz rozpocząć tworzenie kopii zapasowej wygenerowanego rdbpliku w bezpiecznym miejscu.

Axel Advento
źródło
7
rdb_bgsave_in_progress: 0 under Persistence
thanikkal
Z jakiegoś powodu, gdy próbuję wykonać dowolne polecenie config set, przypomina to ładowanie na zawsze.
Bashar Abdullah
5
Dla tych nieszczęsnych tych, którzy są na Windows, ja w tej chwili, a zaraz używasz wersji MSOpenTech, trzeba ścieżce zestaw katalogów w następującym stylu: dir C:/Temp/. Zrób bgsave, aby sprawdzić, czy to działa.
John P
@John P, właśnie to trzeba było zrobić. Dziękuję Ci!
Sam
2
127.0.0.1:6379> USTAWIENIA KONFIGURACJI katalog / root / narzędzie (błąd) ERR Zmiana katalogu: Odmowa
dostępu
316

Za pomocą redis-climożesz przerwać próbę zapisania migawki:

config set stop-writes-on-bgsave-error no

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.

He zhe
źródło
21
jest to szybkie obejście, ale powinieneś sprawdzić, aby upewnić się, dlaczego bgsave zawiodło na pierwszym miejscu
Mandeep Singh,
7
Jeśli używasz redis głównie do buforowania i sesji, jest to koniecznością.
Jim
1
Czy to nie jest niebezpieczne? Na przykład NodeBB używa Redis jako magazynu danych.
codecowboy
2
@LoveToCode config set stop-writes-on-bgsave-error yes
Phil
4
Za każdym razem, gdy ponownie uruchamiam serwer, ponownie pojawia się ten sam problem. Potem muszę to ustawić ponownie. Jak mogę to zrobić na stałe?
Zia Qamar,
63

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)

echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
Chris
źródło
5
LInk: redis.io/topics/faq Wyszukaj: „ Zapisywanie w tle kończy się niepowodzeniem z błędem fork () pod Linuksem, nawet jeśli mam dużo wolnej pamięci RAM!
Bruno Peres
49

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.logz 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 :

Schemat zapisywania w tle Redis opiera się na semantyce kopiowania przy zapisie rozwidlenia we współczesnych systemach operacyjnych: Redis forks (tworzy proces potomny), który jest dokładną kopią elementu nadrzędnego. Proces potomny zrzuca DB na dysk i kończy działanie. Teoretycznie dziecko powinno zużywać tyle pamięci, ile rodzic jest kopią, ale w rzeczywistości dzięki semantyce kopiowania przy zapisie zaimplementowanej przez większość nowoczesnych systemów operacyjnych proces nadrzędny i potomny będą dzielić wspólne strony pamięci. Strona zostanie zduplikowana tylko wtedy, gdy zmieni się u dziecka lub rodzica. Ponieważ teoretycznie wszystkie strony mogą się zmieniać podczas zapisywania procesu potomnego, Linux nie może z góry powiedzieć, ile pamięci zajmie dziecko, więc jeśli ustawienie overcommit_memory jest ustawione na zero, rozwidlenie się nie powiedzie, chyba że będzie tyle wolnej pamięci RAM, co wymagane do prawdziwego skopiowania wszystkich stron pamięci nadrzędnej,

Ustawienie overcommit_memory na 1 mówi Linuxowi, aby się zrelaksował i wykonał rozwidlenie w bardziej optymistyczny sposób alokacji, i to jest właśnie to, czego chcesz dla Redis.

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.confi dodaj:

vm.overcommit_memory=1

Następnie uruchom ponownie sysctl za pomocą:

Na FreeBSD:

sudo /etc/rc.d/sysctl reload

W systemie Linux:

sudo sysctl -p /etc/sysctl.conf
Bhindi
źródło
Dane wyjściowe systemctl status redisujawniły, że istnieje ostrzeżenie sugerujące dokładnie zmianę overcommit_memory=0ustawienia. Zmiana, która rzeczywiście rozwiązała problem dla mnie.
Algorytm abstrakcyjny
To rozwiązało problem poprawnie i powinna być zaakceptowaną odpowiedzią
DSynergy
Więc tldr byłby, przy domyślnych ustawieniach, jeśli redis używa 10 GB pamięci RAM, musisz mieć 10 GB pamięci RAM, aby ten proces potomny mógł zostać uruchomiony?
Dan Hastings
@DanHastings - Tak. A ustawienie overcommit_memory na 1 rozluźnia ten wymóg.
Bhindi
26

Uruchom ponownie serwer Redis.

  • Macos (piwny) : brew services restart redis.
  • Linux: sudo service redis restart /sudo systemctl restart redis
  • Windows: Windows + R-> Typ services.msc, Enter-> Wyszukaj, Redisa następnie kliknij restart.

Osobiście miałem ten problem po aktualizacji Redis za pomocą Brew ( brew upgrade). Po ponownym uruchomieniu laptopa od razu zadziałało.

Erowlin
źródło
Jeśli ktoś czyta to miałem problem z Homebrew jak dobrze, ale nie ma nic wspólnego z uaktualnieniem: Właśnie potrzebne do uruchomienia usługi z sudo: brew services stop redis; sudo brew services start redis.
bfontaine
24

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:

CONFIG GET reż

CONFIG GET nazwa pliku db

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żytkownik redis, dlatego dobrze jest też przekazać użytkownikowi rediswłasność folderu poprzez wykonanie sudo chown -R redis:redis /path/to/rdb/folder. Zostało to rozwinięte w odpowiedzi tutaj .

smilee89
źródło
Jakie powinny być uprawnienia?
Stephen
To zadziałało dla mnie. Dzięki!
Lordwhizy
19

Dziękujemy wszystkim za sprawdzenie problemu, najwyraźniej wystąpił błąd podczas bgsave.

Dla mnie wpisanie config set stop-writes-on-bgsave-error nopowłoki i ponowne uruchomienie Redis rozwiązało problem.

Salvador Dali
źródło
82
To nie „rozwiązało problemu”, po prostu go zignorowało.
Buffalo,
Ponowne uruchomienie RedisServer w Services.msc działało dla mnie.
ViPuL5
Za każdym razem, gdy ponownie uruchamiam serwer, ponownie pojawia się ten sam problem. Potem muszę to ustawić ponownie. Jak mogę to zrobić na stałe?
Zia Qamar,
@ZiaQamar, możesz ustawić właściwość na stałe w redis.conf, który najprawdopodobniej znajduje się w /etc/redis/redis.conf, ustawić „stop-writes-on-bgsave-error no”
Gaurav Tyagi
IMO zdecydowanie nie jest rozwiązaniem. Po prostu mówisz Redisowi, aby nie rejestrował tych błędów. Ale błędy nadal występują ...
Erowlin
17

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.dumppliku jest ./(oznaczający bieżący katalog). Możesz to sprawdzić w swoim redis.confpliku. Dlatego katalog, z którego uruchamiasz serwer redis, jest miejscem, w którym dump.rdbplik 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.rdbpliku.

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-clii zaktualizować dirklucz 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, BGSAVEaby wywołać tworzenie dump.rdbpliku.

CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE

(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. / `.

CONFIG SET dir "./"
BGSAVE

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.

Govind Rai
źródło
Upewnij się, że udzieliłeś uprawnienia użytkownika innego niż root na katalog, w którym będzie przechowywany plik zrzutu. W moim przypadku mam użytkownika, rediswięc: sudo chown redis:redis /var/lib/redis
RoundOutTooSoon 24.04.18
13

Jeśli korzystasz z systemu MacOS i niedawno dokonałeś aktualizacji do Cataliny, może być konieczne uruchomienie brew services restart rediszgodnie z sugestią tego problemu .

Fush
źródło
12

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ć.

  1. Zaloguj się do klienta redis
  2. Wykonaj zestaw konfiguracyjny stop-writes-on-bgsave-error no
  3. Uruchom FLUSHALL (przechowywane dane nie były potrzebne)
  4. Wykonaj zestaw konfiguracyjny stop-writes-on-bgsave-error yes

Proces redis-rdb-bgsave nie działał już po powyższych krokach.

RCK
źródło
7

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ą htoppolecenia. 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 korzystanie config set stop-writes-on-bgsave-error nobę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żyjservice --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ć maxmemoryi maxmemory-policyzdefiniować 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):

maxmemory 6gb
maxmemory-policy allkeys-lru

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

bhatman
źródło
6

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

dir ./

można zmienić na

dir /home/someuser/redislogfiledirectory

lub możesz skomentować wszystkie wiersze zapisu i nie martwić się o trwałość. (Zobacz komentarze w /etc/redis/redis.conf)

Nie zapomnij też

service redis-server stop
service redis-server start
Zupa Puchar
źródło
6

wszystkie te odpowiedzi nie wyjaśniają przyczyny niepowodzenia zapisu rdb.


w moim przypadku sprawdziłem dziennik redis i znalazłem:

14975: M 18 czerwca 13: 23: 07.354 # Zapisywanie w tle zakończone sygnałem 9

uruchom następującą komendę w terminalu:

sudo egrep -i -r 'killed process' /var/log/

wyświetla:

/var/log/kern.log.1:16 czerwca 13:23:07 10-10-88-16 jądro: [28152358.208108] Zabity proces 28416 (serwer redis) total-vm: 7660204kB, anon-rss: 2285492kB, plik-rss: 0kB

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

karton. huśtawka
źródło
3

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

Ryan Angilly
źródło
Jak odkryłeś, że przyczyną problemu jest przepełnienie pamięci? Mogę mieć ten sam problem.
DarthSpeedious,
@DarthSpeedious Nie pamiętam. Gdybym miał zgadywać, powiedziałbym, że może coś w logach narzeka na niemożność przydzielenia pamięci. Przepraszam, nie mogę być bardziej pomocny.
Ryan Angilly,
Po pierwsze, pomyślałem, że będzie to świetne rozwiązanie do pracy z połączeniami swap i redis, po czym przeprowadziłem badania i sięgnąłem do tego artykułu antirez.com/news/52 , który twierdzi, że jest to niewłaściwy sposób używania redis, w każdym razie nie jestem 100% się z tym zgadza, czy jesteś zadowolony z wydajności korzystania z redis z zamianą?
talsibony
1
@DarthSpeedious W dzienniku Redis zobaczysz błędy „ Nie można przydzielić pamięci ”. Zobacz tutaj, jak zobaczyć plik dziennika: stackoverflow.com/questions/16337107/…
Bruno Peres
3

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 nojest 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 to

Jeśli chodzi o ustawienie dirw configredis-cli, po ponownym uruchomieniu usługi redis, to również zostanie wyczyszczone i ponownie pojawi się ten sam błąd. Domyślna wartość dirin redis.confto ./, 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 dirparametru w pliku redis.conf i ustawienie odpowiednich uprawnień do tego katalogu. Większość dystrybucji Debiana powinna to mieć/etc/redis/redis.conf

Mayank Sharma
źródło
3

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 rediskontenerach dokerów.

Redis z oficjalnego redisobrazu próbuje zapisać plik .rdb w /datafolderze 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ś rediskontener jako użytkownik inny niż root (np. docker run -u 1007Zamiast domyślnego docker run -u 0), otrzymasz log szczegółowy błędu w dzienniku serwera (patrz docker logs redis):

1:M 29 Jun 2019 21:11:22.014 * 1 changes in 3600 seconds. Saving...
1:M 29 Jun 2019 21:11:22.015 * Background saving started by pid 499
499:C 29 Jun 2019 21:11:22.015 # Failed opening the RDB file dump.rdb (in server root dir /data) for saving: Permission denied
1:M 29 Jun 2019 21:11:22.115 # Background saving error

Musisz więc zamapować /datafolder kontenera na lokalizację zewnętrzną (gdzie użytkownik inny niż root, tutaj: 1007, ma dostęp do zapisu, na przykład /tmpna komputerze hosta), np .:

docker run --rm -d --name redis -p 6379:6379 -u 1007 -v /tmp:/data redis

Więc jest to błąd konfiguracji obrazu oficjalny Döcker (który powinien napisać do /tmpnie /data), która produkuje tę „bombę zegarową”, które najprawdopodobniej spotkanie tylko w produkcji ... noc nad jakimś szczególnie cichej weekendu: /

mirekphd
źródło
1
Chciałem tylko dodać tutaj komentarz, ponieważ ostatecznie pomógł rozwiązać problemy, z którymi miałem do czynienia z redis w Docker. Nasze serwery UAT i Dev Docker to Windows. Windows Defender rozpozna pliki RDB jako potencjalne wirusy. Zamontowanie katalogu / data tymczasowo rozwiąże problem nadrzędny; dopóki Windows Defender nie poddaje pliku kwarantannie, co powoduje kolejne. UPEWNIJ SIĘ, że dodajesz zamontowany katalog danych jako wyjątek w programie Windows Defender, aby rozwiązać ten problem.
TrevorB
1
Przypomina mi: że alert programu Windows Defender niekoniecznie musi być fałszywie dodatni - kryptomer może zainfekować oficjalny obraz Redis, nawet jeśli jest uruchamiany bez roota i ze wszystkimi możliwościami - wystarczy ujawnić swój port w sieci
mirekphd
Dzięki, to dobra uwaga. Ciekawe, ale jak plik RDB miałby działać na hoście, zwłaszcza Windows? Podejrzewam, że może działać w samym kontenerze. Ale to nie jest specyficzne dla tego konkretnego kontenera.
TrevorB
1
Racja, ładunek prawdopodobnie nie zadziałałby w systemie Windows, chyba że zostałby napisany w całości w Lua, a więc tak wieloplatformowy jak sama Redis ... polecenie eval jest wynalazkiem diabła, niezależnie od języka
mirekphd
To było oświecające doświadczenie; Dziękuję bardzo. Najwyraźniej nasze pliki tworzenia UAT / DEV odsłaniały porty poza siecią Docker. Nie wiem, jak to jest możliwe, ale te instancje otrzymywały polecenia administracyjne i rzeczywiście. uruchomili krypto-górnika. Wyłączyłem te porty, wyłączyłem lokalne podłączenie RDB i ponownie wdrożyłem wyjątek Windows Defender (choć nie będzie to miało znaczenia przy wyłączonym podłączeniu). Muszę zbadać, JAK te polecenia przedostały się przez naszą zaporę, ale uważnie monitoruję
TrevorB
3

dla mnie

config set stop-writes-on-bgsave-error no

i ponownie ładuję komputer Mac, to działa

Wuhaiwei
źródło
1

Wystąpił ten problem podczas pracy na serwerze z miejscem na dysku AFS, ponieważ mój token uwierzytelnienia wygasł, co dało Permission Deniedodpowiedzi, gdy serwer redis próbował zapisać. Rozwiązałem to, odświeżając mój token:

kinit USERNAME_HERE -l 30d && aklog

duhaime
źródło
1

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

  redis:¬
      volumes:¬
        - ./redis.conf:/usr/local/etc/redis/redis.conf¬
      ports:¬
        - 6379:6379¬

Możesz pobrać domyślną konfigurację stąd

w pliku redis.conf upewnij się, że skomentowałeś te 3 linie

save 900 1
save 300 10
save 60 10000

Myou można zobaczyć więcej rozwiązań do usuwania uporczywych dane tutaj

Nic Wanavit
źródło
1

W moim przypadku stało się tak, ponieważ właśnie zainstalowałem redisw 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 w Installing Redis more properlyczęści ich Przewodnika szybkiego startu . Po wykonaniu tej czynności problem został rozwiązany i redisdziała teraz jako root. Sprawdź to.

meow2x
źródło
1

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.

sudo su - redis -s /bin/bash
mkdir redis_dir
redis-cli CONFIG SET dir $(realpath redis_dir)
exit # to logout from redis user (optional)
markroxor
źródło
0

W moim przypadku było to związane z wolnym miejscem na dysku. (można to sprawdzić za pomocą df -hpolecenia bash), gdy zwolnię trochę miejsca, ten błąd zniknął.

Mohammad Reza Esmaeilzadeh
źródło
0

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.confi, aby wyszukać następującą konfigurację:

    # The working directory.
    #
    # The DB will be written inside this directory, with the filename specified
    # above using the 'dbfilename' configuration directive.
    #
    # The Append Only File will also be created inside this directory.
    #
    # Note that you must specify a directory here, not a file name.
    dir ./

Przejdź dir ./do ścieżki, dla której masz regularne uprawnienia do odczytu / zapisu

Możesz także przenieść folder Redis w całości do folderu, o którym wiesz, że ma odpowiednie uprawnienia.

Pascalculator
źródło
0

Dla mnie był to po prostu problem uprawnień do stałego folderu danych redis. Dałem to:

chmod 777 -Rf data/

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.

macherif
źródło
0

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 .

Erfun
źródło
0

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.

qzaki
źródło
0
# on redis 6.0.4 
# if show error 'MISCONF Redis is configured to save RDB snapshots'
# Because redis doesn't have permissions to create dump.rdb file
sudo redis/bin/redis-server 
sudo redis/bin/redis-cli
fan youwei
źródło
-1

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_sizena MySQL.

Mugoma J. Okomba
źródło
-1

W moim przypadku przyczyną było bardzo mało wolnego miejsca na dysku (tylko 35 Mb). Zrobiłem następujące -

  1. Zatrzymano wszystkie procesy związane z Redis
  2. Usuń niektóre pliki z dysku, aby uzyskać wystarczającą ilość wolnego miejsca
  3. Usuń plik zrzutu redis (jeśli istniejące dane nie są potrzebne)

    sudo rm /var/lib/redis/*

  4. Usuń wszystkie klucze wszystkich istniejących baz danych

    sudo redis-cli flushall

  5. zrestartuj wszystkie zadania selera i sprawdź odpowiednie dzienniki pod kątem problemów
rajarshig
źródło
1
Musiałeś to zrobić na instancji programisty. Niewłaściwe rozwiązanie w przypadku aplikacji skoncentrowanych na danych.
Nikesh Devaki,
-1

musisz chmod i przejrzeć nowy folder

chown -R redis i chmod ...

Mohamed-yassine Belatar
źródło