Selama menulis ke Redis ( SET foo bar
) saya mendapatkan kesalahan berikut:
MISCONF Redis dikonfigurasi untuk menyimpan snapshot RDB, tetapi saat ini tidak dapat bertahan pada disk. Perintah yang dapat mengubah set data dinonaktifkan. Silakan periksa log Redis untuk detail tentang kesalahan.
Pada dasarnya saya mengerti bahwa masalahnya redis tidak dapat menyimpan data pada disk, tetapi tidak tahu bagaimana cara menyingkirkan masalah.
Juga pertanyaan berikut memiliki masalah yang sama, sudah lama ditinggalkan tanpa jawaban dan kemungkinan besar tidak ada upaya untuk memecahkan masalah.
redis
, tetapi tidak membantu!Jawaban:
Jika Anda menemukan kesalahan dan beberapa data penting tidak dapat dibuang pada instance redis yang sedang berjalan (masalah dengan izin untuk
rdb
file atau direktori salah, atau kehabisan ruang disk), Anda selalu dapat mengarahkan ulangrdb
file untuk ditulis di tempat lain.Dengan menggunakan
redis-cli
, Anda dapat melakukan sesuatu seperti ini:Setelah ini, Anda mungkin ingin menjalankan
BGSAVE
perintah untuk memastikan bahwa data akan ditulis kerdb
file. Pastikan saat Anda mengeksekusiINFO persistence
,bgsave_in_progress
sudah0
danrdb_last_bgsave_status
adalahok
. Setelah itu, Anda sekarang dapat mulai membuat cadanganrdb
file yang dihasilkan di tempat yang aman.sumber
dir C:/Temp/
. Lakukan bgsave untuk memverifikasi bahwa itu berfungsi ..Dengan menggunakan
redis-cli
, Anda dapat menghentikannya dengan mencoba menyimpan snapshot:Ini adalah solusi cepat, tetapi jika Anda peduli dengan data yang Anda gunakan, Anda harus memeriksa untuk memastikan mengapa bgsave gagal sejak awal.
sumber
Mungkin ada kesalahan selama proses bgsave karena memori rendah. Coba ini (dari latar belakang redis, simpan FAQ)
sumber
Kesalahan ini terjadi karena BGSAVE gagal. Selama BGSAVE, Redis melakukan proses anak untuk menyimpan data pada disk. Meskipun alasan pasti untuk kegagalan BGSAVE dapat diperiksa dari log (biasanya di
/var/log/redis/redis-server.log
pada mesin linux) tetapi banyak kali BGAVE gagal karena garpu tidak dapat mengalokasikan memori. Berkali-kali garpu gagal mengalokasikan memori (meskipun mesin memiliki cukup RAM yang tersedia) karena optimasi yang bertentangan oleh OS.Seperti dapat dibaca dari FAQ Redis :
Redis tidak membutuhkan memori sebanyak yang dipikirkan oleh OS untuk menulis ke disk, jadi pre-emptively gagal menggunakan fork.
Untuk mengatasinya, Anda dapat:
Ubah
/etc/sysctl.conf
dan tambahkan:Kemudian mulai kembali sysctl dengan:
Di FreeBSD:
Di Linux:
sumber
systemctl status redis
mengungkapkan bahwa ada peringatan yang menyarankan untuk mengubahovercommit_memory=0
pengaturan dengan tepat. Mengubah itu memang memecahkan masalah bagi saya.Mulai ulang server redis Anda.
brew services restart redis
.sudo service redis restart
/sudo systemctl restart redis
services.msc
, Enter-> Pencarian untukRedis
kemudian klikrestart
.Saya pribadi mengalami masalah ini setelah memutakhirkan redis dengan Brew (
brew upgrade
). Setelah me-reboot laptop, ia segera bekerja.sumber
sudo
:brew services stop redis; sudo brew services start redis
.jika Anda bekerja pada mesin linux, periksa kembali juga file dan folder izin dari database.
Db dan jalur menuju itu dapat diperoleh melalui:
di
redis-cli
:dan di baris perintah
ls -l
. Izin untuk direktori harus 755 , dan untuk file tersebut harus 644 . Juga, biasanya redis-server dijalankan sebagai penggunaredis
, oleh karena itu bagus juga untuk memberikan penggunaredis
kepemilikan folder dengan mengeksekusisudo chown -R redis:redis /path/to/rdb/folder
. Ini telah dijabarkan dalam jawaban di sini .sumber
Terima kasih semuanya telah memeriksa masalah, ternyata kesalahan telah terjadi selama
bgsave
.Bagi saya, mengetikkan
config set stop-writes-on-bgsave-error no
shell dan memulai ulang Redis memecahkan masalah.sumber
Mulai Redis Server di direktori di mana Redis memiliki izin menulis
Jawaban di atas pasti akan menyelesaikan masalah Anda, tetapi inilah yang sebenarnya terjadi:
Lokasi default untuk menyimpan
rdb.dump
file adalah./
(menunjukkan direktori saat ini). Anda dapat memverifikasi ini diredis.conf
file Anda . Oleh karena itu, direktori dari mana Anda memulai server redis adalah tempatdump.rdb
file akan dibuat dan diperbarui.Tampaknya Anda sudah mulai menjalankan server redis di direktori di mana redis tidak memiliki izin yang benar untuk membuat
dump.rdb
file.Lebih buruk lagi, redis mungkin juga tidak akan memungkinkan Anda untuk mematikan server sampai ia dapat membuat file rdb untuk memastikan penghematan data yang tepat.
Untuk mengatasi masalah ini, Anda harus masuk ke lingkungan klien redis aktif menggunakan
redis-cli
dan memperbaruidir
kunci dan menetapkan nilainya ke folder proyek Anda atau folder apa pun di mana non-root memiliki izin untuk menyimpan. Kemudian jalankanBGSAVE
untuk menjalankan pembuatandump.rdb
file.(Sekarang, jika Anda perlu menyimpan file dump.rdb di direktori tempat Anda memulai server, maka Anda perlu mengubah izin untuk direktori tersebut sehingga redis dapat menulisnya. Anda dapat mencari stackoverflow untuk mengetahui cara melakukannya ).
Anda sekarang dapat mematikan server redis. Perhatikan bahwa kami menyandikan jalurnya. Hardcoding jarang merupakan praktik yang baik dan saya sangat merekomendasikan memulai server redis dari direktori proyek Anda dan mengubah
dir key back to
. / `.Dengan begitu ketika Anda perlu redis untuk proyek lain, file dump akan dibuat di direktori proyek Anda saat ini dan bukan di direktori proyek jalur hardcoded.
sumber
redis
jadi saya lakukan:sudo chown redis:redis /var/lib/redis
Jika Anda menjalankan MacOS dan baru-baru ini ditingkatkan ke Catalina, Anda mungkin perlu menjalankan
brew services restart redis
seperti yang disarankan dalam masalah ini .sumber
Terjadi kesalahan ini dan dapat mengetahui dari log bahwa kesalahan itu karena ruang disk tidak cukup. Semua data yang dimasukkan dalam kasus saya tidak diperlukan lagi. Jadi saya mencoba FLUSHALL. Karena proses redis-rdb-bgsave berjalan, itu tidak memungkinkan untuk FLUSH data juga. Saya mengikuti langkah-langkah di bawah ini dan dapat melanjutkan.
Proses redis-rdb-bgsave tidak lagi berjalan setelah langkah-langkah di atas.
sumber
Saya menghadapi masalah yang sama, alasan utama di balik ini adalah konsumsi memori (RAM) oleh redis. Mesin EC2 saya memiliki RAM 8GB (arounf 7.4 tersedia untuk konsumsi)
Ketika program saya sedang menjalankan penggunaan RAM naik ke 7,2 GB menyisakan hampir ~ 100MB RAM, ini biasanya memicu
MISCONF Redis error ...
Anda dapat menentukan konsumsi RAM menggunakan
htop
perintah. Cari atribut Mem setelah menjalankan perintah htop. Jika itu menunjukkan konsumsi tinggi (seperti dalam kasus saya itu 7.2GB / 7.4GB) Lebih baik untuk meng-upgrade instance dengan Memori yang lebih besar. Dalam skenario ini menggunakanconfig set stop-writes-on-bgsave-error no
akan menjadi bencana bagi server dan dapat mengakibatkan gangguan layanan lain yang berjalan di server (jika ada). Jadi, lebih baik untuk menghindari perintah config dan MENINGKATKAN MESIN REDISMU .FYI: Anda mungkin perlu menginstal htop untuk membuat ini berfungsi:
sudo apt-get install htop
Satu lagi solusi untuk ini dapat berupa layanan berat RAM lain yang berjalan di sistem Anda, periksa untuk layanan lain yang berjalan di server / mesin / instance Anda dan hentikan jika tidak diperlukan. Untuk memeriksa semua layanan yang berjalan di mesin Anda gunakan
service --status-all
Dan saran untuk orang-orang yang secara langsung menempelkan perintah konfigurasi, silakan lakukan penelitian ulang sedikit dan minimal memperingatkan pengguna sebelum menggunakan perintah tersebut. Dan seperti @Rodrigo disebutkan dalam komentarnya: "Tidak keren untuk mengabaikan kesalahan."
---MEMPERBARUI---
Anda juga dapat mengonfigurasi
maxmemory
danmaxmemory-policy
menetapkan perilaku Redis ketika batas memori tertentu tercapai. Sebagai contoh, jika saya ingin menjaga batas memori 6GB dan menghapus kunci yang paling baru digunakan dari DB untuk memastikan bahwa redis mem penggunaan tidak melebihi 6GB, maka kita dapat mengatur dua parameter ini (dalam redis.conf atau CONFIG SET perintah):Ada banyak nilai lain yang dapat Anda tetapkan untuk dua parameter ini yang dapat Anda baca dari sini: https://redis.io/topics/lru-cache
sumber
Perbaikan yang lebih permanen mungkin dengan melihat di /etc/redis/redis.conf di sekitar baris 200-250 ada pengaturan untuk fitur rdb, yang bukan merupakan bagian dari redis kembali dalam 2,x hari.
terutama
dapat diubah menjadi
atau Anda bisa berkomentar semua garis simpan, dan tidak khawatir tentang kegigihan. (Lihat komentar di /etc/redis/redis.conf)
Juga, jangan lupa
sumber
semua jawaban itu tidak menjelaskan alasan mengapa rdb save gagal.
sebagai kasus saya, saya memeriksa redis log dan menemukan:
jalankan perintah berikut di terminal:
itu menampilkan:
hanya itu saja! proses ini (redis save rdb) dibunuh oleh pembunuh OOM
mengacu:
https://github.com/antirez/redis/issues/1886
Menemukan proses mana yang dibunuh oleh pembunuh OOM Linux
sumber
FWIW, saya mengalami ini dan solusinya adalah dengan menambahkan swapfile ke kotak. Saya menggunakan metode ini: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
sumber
Saya juga menghadapi masalah yang sama. Baik jawaban (yang paling banyak dipilih maupun yang diterima) hanya memberikan perbaikan sementara untuk hal yang sama.
Selain itu,
config set stop-writes-on-bgsave-error no
ini adalah cara yang mengerikan untuk melihat kesalahan ini secara berlebihan, karena apa yang dilakukan opsi ini adalah berhenti redis untuk memberitahukan bahwa penulisan telah dihentikan dan untuk melanjutkan tanpa menulis data dalam snapshot. Ini hanya mengabaikan kesalahan ini. Lihat iniAdapun pengaturan
dir
diconfig
redis-cli, setelah Anda me-restart layanan redis, ini akan dihapus juga dan kesalahan yang sama akan muncul lagi. Nilai defaultdir
inredis.conf
adalah./
, dan jika Anda mulai redis sebagai pengguna root, maka./
adalah/
izin menulis yang tidak diberikan, dan karenanya kesalahan.Cara terbaik adalah mengatur
dir
parameter dalam file redis.conf dan mengatur izin yang tepat ke direktori itu. Sebagian besar distribusi debian akan memilikinya di/etc/redis/redis.conf
sumber
Saat ini masalah akses tulis Redis yang memberikan pesan kesalahan ini kepada klien muncul kembali dalam
redis
wadah buruh pelabuhan resmi .Redis dari gambar resmi
redis
mencoba untuk menulis file .rdb di/data
folder container , yang agak disayangkan, karena itu adalah folder yang dimiliki oleh root dan juga merupakan lokasi yang tidak persisten (data yang ditulis di sana akan hilang jika kontainer / pod Anda crash).Jadi setelah satu jam tidak aktif, jika Anda telah menjalankan
redis
wadah Anda sebagai pengguna non-root (misaldocker run -u 1007
daripada defaultdocker run -u 0
), Anda akan mendapatkan pesan kesalahan yang terperinci dengan baik di log server Anda (lihatdocker logs redis
):Jadi yang perlu Anda lakukan adalah memetakan
/data
folder kontainer ke lokasi eksternal (di mana pengguna non-root, di sini: 1007, memiliki akses tulis, seperti/tmp
pada mesin host), misalnya:Jadi itu adalah kesalahan konfigurasi dari gambar buruh pelabuhan resmi (yang seharusnya menulis untuk
/tmp
tidak/data
) yang menghasilkan "bom waktu" yang kemungkinan besar akan Anda temui hanya dalam produksi ... semalam selama beberapa akhir pekan liburan yang sangat tenang: /sumber
untuk saya
dan saya memuat ulang mac saya, itu berhasil
sumber
Saya mengalami masalah ini ketika bekerja pada server dengan ruang disk AFS karena token otentikasi saya telah kedaluwarsa, yang menghasilkan
Permission Denied
respons ketika redis-server mencoba menyimpan. Saya memecahkan masalah ini dengan menyegarkan token saya:kinit USERNAME_HERE -l 30d && aklog
sumber
Jika Anda menggunakan docker / docker-compose dan ingin mencegah redis dari menulis ke file, Anda dapat membuat konfigurasi redis dan mount ke wadah
docker.compose.override.yml
Anda dapat mengunduh konfigurasi default dari sini
dalam file redis.conf pastikan Anda mengomentari 3 baris ini
myou dapat melihat lebih banyak solusi untuk menghapus data persisten di sini
sumber
Dalam kasus saya itu terjadi karena saya baru saja menginstal
redis
menggunakan cara cepat. Jadi redis tidak berjalan sebagai root. Saya dapat menyelesaikan masalah ini dengan mengikuti instruksi di bawahInstalling Redis more properly
bagian Panduan Memulai Cepat mereka . Setelah melakukannya, masalah diselesaikan danredis
sekarang berjalan sebagai root. Coba lihat.sumber
Setelah membenturkan kepala saya melalui begitu banyak pertanyaan SO akhirnya - bagi saya jawaban @Axel Advento bekerja tetapi dengan beberapa langkah tambahan - saya masih menghadapi masalah izin.
Saya harus beralih pengguna ke
redis
, membuat dir baru di dir home itu dan kemudian mengaturnya sebagai dir redis.sumber
Dalam kasus saya ini terkait dengan ruang kosong disk. (Anda dapat memeriksanya dengan
df -h
perintah bash) ketika saya mengosongkan sebagian kesalahan ini hilang.sumber
Jika Anda menjalankan Redis secara lokal di mesin windows, coba "jalankan sebagai administrator" dan lihat apakah itu berfungsi. Dengan saya, masalahnya adalah bahwa Redis terletak di folder "Program Files", yang membatasi izin secara default. Seperti seharusnya.
Namun, jangan menjalankan Redis secara otomatis sebagai administrator. Anda tidak ingin memberinya lebih banyak hak yang seharusnya dimiliki Redis . Anda ingin menyelesaikan ini dengan buku.
Jadi, kami dapat dengan cepat mengidentifikasi masalah dengan menjalankannya sebagai administrator, tetapi ini bukan obatnya. Skenario yang mungkin terjadi adalah Anda telah meletakkan Redis di folder yang tidak memiliki hak tulis dan akibatnya file DB disimpan di lokasi yang sama.
Anda dapat menyelesaikan ini dengan membuka
redis.windows.conf
dan untuk mencari konfigurasi berikut:Ubah
dir ./
jalur yang Anda miliki izin baca / tulisnya secara teraturAnda juga bisa memindahkan folder Redis secara keseluruhan ke folder yang Anda tahu memiliki izin yang tepat.
sumber
Bagi saya itu hanya masalah izin pada folder data redis persisten. Saya memberikannya:
Dan itu berhasil! Mungkin terlalu dini untuk mengatakan itu menyelesaikan masalah. Karena saya juga curiga redis tidak dieksekusi sebagai root, jadi saya perlu memeriksa dockerFile saya untuk mencari tahu lebih lanjut.
sumber
Periksa log Redis Anda sebelum mengambil tindakan apa pun. Beberapa solusi di utas ini dapat menghapus data Redis Anda, jadi berhati-hatilah dengan apa yang Anda lakukan.
Dalam kasus saya, mesin kehabisan RAM . Ini juga bisa terjadi ketika tidak ada lagi ruang disk kosong di host.
sumber
Perlu diketahui, bahwa kesalahan ini muncul ketika server Anda sedang diserang. Baru saja ditemukan bahwa redis gagal menulis ke '/etc/cron.d/web' di mana setelah mengoreksi izin, file baru yang terdiri dari algoritma penambangan dengan beberapa opsi persembunyian ditambahkan.
sumber
sumber
Seperti yang ditunjukkan oleh @Chris masalahnya kemungkinan memori rendah. Kami mulai mengalaminya ketika kami mengalokasikan terlalu banyak RAM ke MySQL (
innodb_buffer_pool_size
).Untuk memastikan ada cukup RAM untuk Redis dan layanan lain kami mengurangi
innodb_buffer_pool_size
MySQL.sumber
Dalam kasus saya, alasannya adalah ruang kosong yang sangat rendah di disk (hanya 35 Mb). Saya melakukan yang berikut -
Hapus file redis dump (jika data yang ada tidak diperlukan)
sudo rm /var/lib/redis/*
Hapus semua kunci dari semua database yang ada
sudo redis-cli flushall
sumber
Anda harus chmod dan menemukan folder baru
chown -R redis dan chmod ...
sumber