MISCONF Redis RDB स्नैपशॉट को सहेजने के लिए कॉन्फ़िगर किया गया है


366

Redis ( SET foo bar) को लिखने के दौरान मुझे निम्नलिखित त्रुटि मिल रही है:

MISCONF Redis RDB स्नैपशॉट को सहेजने के लिए कॉन्फ़िगर किया गया है, लेकिन वर्तमान में डिस्क पर बने रहने में सक्षम नहीं है। कमांड जो डेटा सेट को संशोधित कर सकते हैं वे अक्षम हैं। कृपया त्रुटि के बारे में विवरण के लिए Redis लॉग की जाँच करें।

मूल रूप से मैं समझता हूं कि समस्या यह है कि रेडिस डिस्क पर डेटा को बचाने में सक्षम नहीं है, लेकिन समस्या से छुटकारा पाने का कोई विचार नहीं है।

साथ ही निम्नलिखित प्रश्न में एक ही समस्या है, यह बहुत समय पहले बिना किसी उत्तर के छोड़ दिया गया है और समस्या को हल करने के लिए कोई प्रयास नहीं किया गया है।


क्या आप इस समस्या को हल करने में सक्षम थे। यदि हाँ, तो क्या आप कृपया चरणों के साथ सहायता कर सकते हैं। क्योंकि rdb फाइल को कहीं और रखने से यह मुझे लगता है कि इसे हल नहीं करेगा। मुझे लगता है कि यहाँ कुछ याद आ रहा है
anur

4
Redis सर्वर को एक निर्देशिका में प्रारंभ करने के कारण यह त्रुटि होती है जहाँ redis की अनुमति नहीं है। मैं समस्या को ठीक करने के बाद डिफ़ॉल्ट सेटिंग्स पर वापस लौटने की सलाह देता हूं: इस समस्या के समाधान के बारे में उत्तर देखें ।
गोविंद राय

गोविंद राय के जवाब के अलावा: stackoverflow.com/a/47880440/5649620
वैष्णव रमेश त्रिशूर

@ गोविंदराय मैं पहले ही समूह और मालिक दोनों को बदलकर रेडिस की अनुमति दे चुका हूं redis, लेकिन इससे कोई मदद नहीं मिलती है!
wdetac

जवाबों:


184

यदि आप त्रुटि का सामना करते हैं और कुछ महत्वपूर्ण डेटा को चल रहे रेडिस उदाहरण ( rdbफ़ाइल के लिए अनुमतियों के साथ समस्या या गलत तरीके से या डिस्क स्थान से बाहर चलाने) पर नहीं छोड़ा जा सकता है , तो आप हमेशा rdbफ़ाइल को कहीं और लिखे जाने के लिए पुनर्निर्देशित कर सकते हैं ।

का उपयोग करते हुए redis-cli, आप ऐसा कुछ कर सकते हैं:

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

इसके बाद, आप BGSAVEयह सुनिश्चित करने के लिए एक कमांड निष्पादित करना चाह सकते हैं कि डेटा rdbफ़ाइल में लिखा जाएगा । सुनिश्चित करें कि जब आप निष्पादित करते हैं INFO persistence, bgsave_in_progressपहले से ही है 0और rdb_last_bgsave_statusहै ok। उसके बाद, आप अब उत्पन्न rdbफ़ाइल का बैकअप लेना शुरू कर सकते हैं कहीं सुरक्षित।


7
rdb_bgsave_in_progress: 0 दृढ़ता के तहत
थनिक्कल

किसी कारण से जब मैं किसी भी विन्यास सेट कमांड की कोशिश करता हूं, तो यह हमेशा के लिए लोड होता रहता है।
बशर अब्दुल्ला

5
उन दुर्भाग्यपूर्ण लोगों के लिए, जो इस समय विंडोज पर हैं, और हू एमएसओपेनटेक संस्करण का उपयोग कर रहे हैं, आपको निम्न शैली में निर्देशिका पथ सेट करना होगा dir C:/Temp/:। सत्यापित करने के लिए कि यह काम करता है एक bgsave करो ..
John P

@ जॉन पी, बस वही किया जाना चाहिए था। धन्यवाद!
सैम

2
127.0.0.1.16379> CONFIG SET dir / root / टूल (त्रुटि) ERR परिवर्तन निर्देशिका: अनुमति अस्वीकृत
Gank

316

का उपयोग करते हुए redis-cli, आप स्नैपशॉट को बचाने की कोशिश कर इसे रोक सकते हैं:

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

यह एक त्वरित वर्कअराउंड है, लेकिन यदि आप इसके लिए उपयोग किए जा रहे डेटा की परवाह करते हैं, तो आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि पहली जगह में bgsave विफल क्यों हुआ।


21
यह एक त्वरित समाधान है, लेकिन आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि पहले स्थान पर बीएसएसवी क्यों विफल रहा
मंदीप सिंह

7
यदि आप मुख्य रूप से कैशिंग और सत्रों के लिए रेडिस का उपयोग करते हैं, तो यह बहुत जरूरी है।
जिम

1
क्या यह खतरनाक नहीं है? उदाहरण के लिए, NodeBB Redis को डेटा स्टोर के रूप में उपयोग करता है।
कोडकॉबॉय

2
@LoveToCode कॉन्फिगरेशन सेट स्टॉप-राइट-ऑन-बग्सेव-एरर यस
फिल

4
जब भी मैं सर्वर को पुनरारंभ करता हूं तो मुझे फिर से वही मुद्दा मिलता है। फिर मुझे इसे फिर से सेट करना होगा। मैं इसे स्थायी कैसे बना सकता हूं?
ज़िया क़मर

63

स्मृति कम होने के कारण bgsave प्रक्रिया के दौरान त्रुटियाँ हो सकती हैं। इसे आज़माएं (redis background save FAQ से)

echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1

5
LInk: redis.io/topics/faq इस के लिए खोजें: " पृष्ठभूमि की बचत लिनक्स के साथ एक कांटा () त्रुटि के साथ विफल हो रही है, भले ही मैंने बहुत सारी मुफ्त रैम दी हो! "
ब्रूनो पेर

49

BGSAVE के विफल होने के कारण यह त्रुटि होती है। बीजीएसएवी के दौरान, रेडिस डिस्क पर डेटा को बचाने के लिए एक बच्चे की प्रक्रिया की तलाश करता है। यद्यपि BGSAVE की विफलता का सटीक कारण लॉग्स (आमतौर /var/log/redis/redis-server.logपर लिनक्स मशीनों पर) से जांचा जा सकता है, लेकिन कई बार BGAVE विफल रहता है क्योंकि कांटा मेमोरी आवंटित नहीं कर सकता है। ओएस द्वारा परस्पर विरोधी अनुकूलन के कारण कई बार कांटा मेमोरी को आवंटित करने में विफल रहता है (हालांकि मशीन में पर्याप्त रैम उपलब्ध है)।

जैसा कि Redis FAQ से पढ़ा जा सकता है :

Redis बैकग्राउंड सेविंग स्कीमा आधुनिक ऑपरेटिंग सिस्टम में fork की कॉपी-ऑन-राइट सिमेंटिक पर निर्भर करता है: Redis forks (चाइल्ड प्रोसेस बनाता है) जो कि पेरेंट की एक सटीक कॉपी है। बच्चे की प्रक्रिया डिस्क पर DB को डंप करती है और अंत में बाहर निकलती है। सिद्धांत रूप में बच्चे को माता-पिता की नकल के रूप में अधिक से अधिक स्मृति का उपयोग करना चाहिए, लेकिन वास्तव में अधिकांश आधुनिक ऑपरेटिंग सिस्टम द्वारा लागू कॉपी-ऑन-राइट सिमेंटिक के लिए धन्यवाद, माता-पिता और बच्चे की प्रक्रिया आम स्मृति पृष्ठों को साझा करेगी। एक पृष्ठ को केवल तभी दोहराया जाएगा जब वह बच्चे या माता-पिता में बदल जाएगा। चूंकि सिद्धांत में बच्चे की प्रक्रिया को सहेजते समय सभी पृष्ठ बदल सकते हैं, लिनक्स अग्रिम में यह नहीं बता सकता है कि बच्चा कितना मेमोरी लेगा, इसलिए यदि ओवरकमिट_मिमोरी सेटिंग को शून्य कांटा पर सेट किया जाता है, जब तक कि उतनी मुक्त रैम नहीं होती वास्तव में सभी माता-पिता स्मृति पृष्ठों की नकल करने के लिए आवश्यक है,

Overcommit_memory को 1 पर सेट करना लिनक्स को एक अधिक आशावादी आवंटन फैशन में आराम करने और प्रदर्शन करने के लिए कहता है, और यह वही है जो आप रेडिस के लिए चाहते हैं।

Redis को उतनी मेमोरी की आवश्यकता नहीं है जितना कि OS सोचता है कि यह डिस्क पर लिखना है, इसलिए कांटे को पूर्व-विफल कर सकते हैं।

इसे हल करने के लिए, आप कर सकते हैं:

संशोधित करें /etc/sysctl.confऔर जोड़ें:

vm.overcommit_memory=1

फिर के साथ sysctl को पुनः आरंभ करें:

FreeBSD पर:

sudo /etc/rc.d/sysctl reload

लिनक्स पर:

sudo sysctl -p /etc/sysctl.conf

आउटपुट से systemctl status redisपता चला कि एक चेतावनी है जो overcommit_memory=0सेटिंग को बिल्कुल बदलने का सुझाव देती है । यह कहना कि वास्तव में मेरे लिए समस्या का समाधान है।
सार

इसने समस्या को सही ढंग से हल किया और स्वीकृत उत्तर होना चाहिए
DSynergy

तो tldr होगा, डिफ़ॉल्ट सेटिंग्स के साथ, यदि रेडिस 10 gb का उपयोग कर रहा है RAM, तो आपको इस चाइल्ड प्रोसेस को निष्पादित करने में सक्षम होने के लिए 10gb RAM मुक्त होना चाहिए?
दान हेस्टिंग्स

@DanHastings - हाँ। और 1 के लिए overcommit_memory सेट करना इस आवश्यकता को शांत करता है।
भिंडी

26

अपने Redis सर्वर को पुनरारंभ करें।

  • MacOS (काढ़ा) : brew services restart redis
  • लिनक्स: sudo service redis restart /sudo systemctl restart redis
  • विंडोज: Windows + R-> प्रकार services.msc, Enter-> Redisफिर के लिए खोजें पर क्लिक करें restart

मुझे व्यक्तिगत रूप से ब्रू ( brew upgrade) के साथ रेडिस को अपग्रेड करने के बाद यह मुद्दा था । लैपटॉप को रिबूट करने के बाद, यह तुरंत काम करता है।


किसी को भी यह पढ़ रहा है, तो मैं उन्नयन के साथ क्या करना अच्छी तरह से लेकिन कुछ नहीं के रूप में Homebrew के साथ इस मुद्दे था: मैं बस के साथ सेवा शुरू करने के लिए की जरूरत sudo: brew services stop redis; sudo brew services start redis
bfontaine

24

यदि आप एक linux मशीन पर काम कर रहे हैं, तो डेटाबेस की फ़ाइल और फ़ोल्डर अनुमतियों को भी पुन: जाँचें।

इसके माध्यम से db और इसे प्राप्त किया जा सकता है:

में redis-cli:

कॉन्फिग गेट डीआईआर

CONFIG GET dbfilename मिलता है

और कमांडलाइन में ls -l। निर्देशिका के लिए अनुमतियाँ 755 होनी चाहिए , और फ़ाइल के लिए 644 होनी चाहिए । इसके अलावा, आम तौर पर रेडिस-सर्वर उपयोगकर्ता के रूप में निष्पादित होता है redis, इसलिए उपयोगकर्ता redisको निष्पादित करके फ़ोल्डर का स्वामित्व देना भी अच्छा लगता है sudo chown -R redis:redis /path/to/rdb/folder। इसका उत्तर यहाँ दिया गया है


उन्हें क्या अनुमति होनी चाहिए?
स्टीफन

इसने मेरे लिए काम किया। धन्यवाद!
लॉर्डविज़ी

19

समस्या की जाँच के लिए सभी को धन्यवाद, स्पष्ट रूप से त्रुटि के दौरान उत्पादन किया गया था bgsave

मेरे लिए, config set stop-writes-on-bgsave-error noएक शेल में टाइप करना और रेडिस को फिर से शुरू करने से समस्या हल हो गई।


82
यह "समस्या को हल नहीं किया", यह सिर्फ इसे नजरअंदाज कर दिया।
भैंस 12

Services.msc में RedisServer को पुनः आरंभ करना मेरे लिए काम किया।
ViPuL5

जब भी मैं सर्वर को पुनरारंभ करता हूं तो मुझे फिर से वही मुद्दा मिलता है। फिर मुझे इसे फिर से सेट करना होगा। मैं इसे स्थायी कैसे बना सकता हूं?
ज़िया क़मर

@ZiaQamar, आप संपत्ति स्थायी रूप से redis.conf है, जो सबसे अधिक संभावना /etc/redis/redis.conf में हो, सेट "रोकने के राईट-ऑन-bgsave त्रुटि नहीं" में सेट कर सकते हैं
गौरव त्यागी

IMO निश्चित रूप से समाधान नहीं है। आप रेडिस को केवल उन त्रुटियों को लॉग नहीं करने के लिए कह रहे हैं। लेकिन त्रुटियां अभी भी हैं ...
एरोलिन

17

Redis Server को उस डायरेक्टरी में शुरू करें जहाँ Redis के पास परमिशन है

ऊपर दिए गए उत्तर निश्चित रूप से आपकी समस्या को हल करेंगे, लेकिन यहां वास्तव में क्या हो रहा है:

rdb.dumpफ़ाइल को संग्रहीत करने के लिए डिफ़ॉल्ट स्थान ./(वर्तमान निर्देशिका को दर्शाते हुए) है। आप इसे अपनी redis.confफ़ाइल में सत्यापित कर सकते हैं । इसलिए, निर्देशिका जहां से आप रेडिस सर्वर शुरू करते हैं, जहां एक dump.rdbफ़ाइल बनाई जाएगी और अपडेट की जाएगी।

ऐसा लगता है कि आपने डायरेक्टरी में रेडिस सर्वर चलाना शुरू कर दिया है, जहाँ रेडिस के पास dump.rdbफाइल बनाने की सही अनुमति नहीं है ।

मामले को बदतर बनाने के लिए, रेडिस भी शायद आपको सर्वर को बंद करने की अनुमति नहीं देगा, जब तक कि यह डेटा की उचित बचत सुनिश्चित करने के लिए आरडीबी फ़ाइल बनाने में सक्षम न हो।

इस समस्या को हल करने के लिए, आप का उपयोग कर सक्रिय redis ग्राहक वातावरण में जाना होगा redis-cliऔर अद्यतन dirकुंजी और अपनी परियोजना फ़ोल्डर या जहां गैर-रूट को बचाने के लिए अनुमतियों किसी भी फ़ोल्डर में अपने मूल्य निर्धारित किया है। फिर फ़ाइल BGSAVEके निर्माण को लागू करने के लिए चलाएँ dump.rdb

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

(अब, यदि आपको उस निर्देशिका में डंप .rdb फ़ाइल को सहेजने की आवश्यकता है जिसे आपने सर्वर में शुरू किया है, तो आपको निर्देशिका के लिए अनुमतियां बदलने की आवश्यकता होगी ताकि रेडिस इसे लिख सकें। आप ऐसा करने के लिए स्टैकओवरफ़्लो खोज सकते हैं। )।

अब आपको रेडिस सर्वर को बंद करने में सक्षम होना चाहिए। ध्यान दें कि हमने मार्ग को हार्डकोड किया है। हार्डकोडिंग शायद ही कभी एक अच्छा अभ्यास है और मैं आपकी परियोजना निर्देशिका से रेडिस सर्वर शुरू करने और dir key back to/ / `को बदलने की अत्यधिक अनुशंसा करता हूं ।

CONFIG SET dir "./"
BGSAVE

इस तरह जब आपको किसी अन्य प्रोजेक्ट के लिए रेडिस की आवश्यकता होती है, तो डंप फ़ाइल आपके वर्तमान प्रोजेक्ट की डायरेक्टरी में बनाई जाएगी, न कि हार्डकोड के प्रोजेक्ट डायरेक्टरी में।


सुनिश्चित करें कि आप उस निर्देशिका के लिए गैर-रूट उपयोगकर्ता की अनुमति प्रदान करते हैं जो डंप फ़ाइल में संग्रहीत किया जाएगा। मेरे मामले में, मेरे पास एक उपयोगकर्ता है redisइसलिए मैं करता हूं: sudo chown redis:redis /var/lib/redis
RoundOutTooSoon

13

यदि आप MacOS चला रहे हैं और हाल ही में कैटालिना में अपग्रेड हुए हैं, तो आपको इस मुद्देbrew services restart redis में सुझाए अनुसार चलाने की आवश्यकता हो सकती है ।


12

इस त्रुटि का सामना किया था और लॉग से यह पता लगाने में सक्षम था कि डिस्क स्थान पर्याप्त नहीं होने के कारण त्रुटि है। मेरे मामले में डाले गए सभी डेटा की अब कोई आवश्यकता नहीं थी। इसलिए मैंने FLUSHALL की कोशिश की। चूंकि redis-rdb-bgsave प्रक्रिया चल रही थी, इसलिए यह FLUSH डेटा को भी अनुमति नहीं दे रहा था। मैंने नीचे दिए गए चरणों का पालन किया और जारी रखने में सक्षम था।

  1. Redis क्लाइंट को लॉगिन करें
  2. निष्पादित कॉन्फ़िगरेशन सेट स्टॉप-राइट-ऑन-बग्सेव-एरर नं
  3. निष्पादन FLUSHALL (संग्रहीत डेटा की आवश्यकता नहीं थी)
  4. निष्पादित कॉन्फ़िगरेशन सेट स्टॉप-राइट-ऑन-बग्सेव-त्रुटि हाँ

उपरोक्त चरणों के बाद प्रक्रिया redis-rdb-bgsave अब नहीं चल रही थी।


7

मुझे इसी तरह के मुद्दे का सामना करना पड़ा, इसके पीछे मुख्य कारण रेडियों द्वारा मेमोरी (रैम) की खपत थी। मेरी EC2 मशीन में 8GB RAM (उपभोग के लिए उपलब्ध 7.4) था

जब मेरा प्रोग्राम रैम चल रहा था तो 7.2 जीबी तक चला गया ~ मुश्किल से 100 जीबी रैम में, यह आम तौर पर ट्रिगर होता है MISCONF Redis error ...

आप htopकमांड का उपयोग करके रैम की खपत निर्धारित कर सकते हैं । के लिए देखो मेम htop आदेश चलाने के बाद विशेषता। यदि यह उच्च खपत दिखाता है (जैसे कि मेरे मामले में यह 7.2GB / 7.4GB था) तो बड़ी मेमोरी के साथ इंस्टेंस को अपग्रेड करना बेहतर है। इस परिदृश्य config set stop-writes-on-bgsave-error noमें सर्वर का उपयोग करना एक आपदा होगी और इसका परिणाम सर्वर पर चल रही अन्य सेवाओं को बाधित कर सकता है (यदि कोई हो)। इसलिए, config कमांड से बचना बेहतर है और अपने REDIS MACHINE को UPGRADE करें

FYI करें: इस काम को करने के लिए आपको htop स्थापित करने की आवश्यकता हो सकती है :sudo apt-get install htop

इसका एक और समाधान आपके सिस्टम पर चलने वाली कुछ अन्य रैम हैवी सर्विस हो सकती है, अपने सर्वर / मशीन / इंस्टेंस पर चल रही अन्य सर्विस की जांच करें और यदि आवश्यक न हो तो इसे बंद कर दें। अपने मशीन के उपयोग पर चलने वाली सभी सेवाओं की जांच करने के लिएservice --status-all

और लोगों के लिए एक सुझाव सीधे विन्यास कमांड को चिपकाने के लिए, कृपया थोड़ी खोज करें और कम से कम इस तरह के आदेशों का उपयोग करने से पहले उपयोगकर्ता को चेतावनी दें। और जैसा कि @ रोड्रिगो ने अपनी टिप्पणी में उल्लेख किया है: "यह त्रुटियों को अनदेखा करने के लिए अच्छा नहीं लगता है।"

---अपडेट करें---

जब आप मेमोरी की एक विशिष्ट सीमा तक पहुँच जाते हैं तो YO, Redis के व्यवहार को कॉन्फ़िगर maxmemoryऔर maxmemory-policyपरिभाषित कर सकता है। उदाहरण के लिए, यदि मैं 6GB की मेमोरी लिमिट रखना चाहता हूं और DB से कम से कम हाल ही में उपयोग की गई कीज को डिलीट करना चाहता हूं ताकि यह सुनिश्चित हो सके कि रेडिस मेम का उपयोग 6GB से अधिक न हो, तो हम इन दो मापदंडों (redis.conf या CONFIG TET में) सेट कर सकते हैं आदेश):

maxmemory 6gb
maxmemory-policy allkeys-lru

बहुत सारे अन्य मूल्य हैं जो आप इन दो मापदंडों के लिए निर्धारित कर सकते हैं जिन्हें आप इस बारे में यहां से पढ़ सकते हैं: https://redis.io/topics/lru-cache


6

/Etc/redis/redis.conf में लाइनों को 200-250 के आसपास देखने के लिए एक अधिक स्थायी फिक्स हो सकता है, आरडीबी सुविधाओं के लिए सेटिंग्स हैं, जो 2.x दिनों में वापस रेडिस का हिस्सा नहीं थे।

विशेष रूप से

dir ./

को बदला जा सकता है

dir /home/someuser/redislogfiledirectory

या आप सभी सेव लाइन्स पर टिप्पणी कर सकते हैं, और दृढ़ता के बारे में चिंता न करें। (/Etc/redis/redis.conf में टिप्पणियां देखें)

इसके अलावा, मत भूलना

service redis-server stop
service redis-server start

6

उन सभी उत्तरों के कारण नहीं बताए गए कि rdb सेव फेल क्यों हुआ।


मेरे मामले के रूप में, मैंने रेडिस लॉग की जाँच की और पाया:

14975: एम 18 जून 13: 23: 07.354 # पृष्ठभूमि की बचत संकेत 9 द्वारा समाप्त

टर्मिनल में निम्नलिखित कमांड चलाएँ:

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

यह प्रदर्शित:

/var/log/kern.log.1:Jun 18 13:23:07 10-10-88-16 कर्नेल: [28152358.208108] हत्या की प्रक्रिया 28416 (रेडिस-सर्वर) कुल-वीएम: 7660204kB, अननॉन- rss: 2285492kB, फ़ाइल-आरएसएस: 0KB

बस इतना ही! यह प्रक्रिया (रेडिस सेव आरडीबी) ओओएम किलर द्वारा मार दी गई है

संदर्भित करता है:

https://github.com/antirez/redis/issues/1886

यह पता लगाना कि लिनक्स OOM किलर द्वारा किस प्रक्रिया को मार दिया गया


3

एफडब्ल्यूआईडब्ल्यू, मैं इसमें भाग गया और समाधान केवल बॉक्स में एक स्वैपफाइल जोड़ना था। मैंने इस विधि का उपयोग किया: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04


आपने मेमोरी ओवरफ्लो का पता कैसे लगाया यह मुद्दा था? मैं एक ही मुद्दा हो सकता है।
डेर्थस्पीडियस

@DarthSpeedious मुझे याद नहीं है। अगर मुझे लगता था कि मैं कहूंगा कि शायद लॉग्स में कुछ याददाश्त को आवंटित करने में सक्षम नहीं होने के बारे में शिकायत कर रहा था। क्षमा करें, मैं अधिक सहायक नहीं हो सकता।
रयान एंगिलि

पहली जगह में मुझे लगा कि यह स्वैप और रेडिस के साथ काम करने के लिए बहुत अच्छा समाधान होगा, फिर मैंने कुछ शोध किया और इस लेख तक पहुंच गया antirez.com/news/52 , जो दावा करता है कि यह रेडिस का उपयोग करने का गलत तरीका है, वैसे भी मैं नहीं हूं 100% इससे सहमत हैं, क्या आप स्वैप के साथ रेडिस का उपयोग करने के प्रदर्शन से खुश हैं?
talsibony

1
@DarthSpeedious अपने Redis लॉग में आप " मेमोरी आवंटित नहीं कर सकते " त्रुटियों को देखेंगे । लॉग फ़ाइल देखने के तरीके के बारे में यहां देखें: stackoverflow.com/questions/16337107/…
ब्रूनो पेर

3

मैं भी उसी मुद्दे का सामना कर रहा था। दोनों उत्तर (सबसे अधिक उत्कीर्ण एक और स्वीकृत एक) बस उसी के लिए एक अस्थायी निर्धारण देते हैं।

इसके अलावा, config set stop-writes-on-bgsave-error noइस त्रुटि को देखने का एक भयानक तरीका है, क्योंकि यह विकल्प क्या करता है, यह सूचित करने से रोक दिया जाता है कि लिखना बंद कर दिया गया है और स्नैपशॉट में डेटा लिखे बिना आगे बढ़ना है। यह केवल इस त्रुटि को अनदेखा कर रहा है। इसे देखें

स्थापित करने के लिए के रूप में dirमें configredis-CLI में, एक बार आप redis सेवा पुनरारंभ करें, यह भी मंजूरी दे दी हो जाएगा और एक ही गलती फिर से पॉप अप जाएगा। का डिफ़ॉल्ट मान dirमें redis.confहै ./, और यदि आप जड़ उपयोगकर्ता के रूप में redis शुरू तो./ है /त्रुटि जो लिखने की अनुमति नहीं दिया गया है करने के लिए, और इसलिए।

सबसे अच्छा तरीका है dirredis.conf फ़ाइल में पैरामीटर सेट करना और उस निर्देशिका के लिए उचित अनुमतियाँ सेट करना। अधिकांश डिबियन वितरण में यह होगा/etc/redis/redis.conf


3

आजकल Redis राइट-एक्सेस समस्याएं जो क्लाइंट को यह त्रुटि संदेश देती हैं, आधिकारिक रूप से फिर से सामने आती हैं redis डॉकटर कंटेनरों उभरती हैं।

आधिकारिक छवि से रेडिसredis की कोशिश करता कंटेनरों में .rdb फ़ाइल लिखने में /data, फ़ोल्डर, जो बल्कि दुर्भाग्यपूर्ण है, क्योंकि यह एक रूट के स्वामित्व वाली फ़ोल्डर है और यह एक गैर लगातार स्थान भी है (लिखित डेटा वहाँ से गायब हो जाएगा अगर अपने कंटेनर / फली दुर्घटनाओं)।

इसलिए एक घंटे की निष्क्रियता के बाद, यदि आपने अपना redisकंटेनर एक गैर-रूट उपयोगकर्ता (उदाहरण के docker run -u 1007बजाय डिफ़ॉल्ट docker run -u 0) के रूप में चलाया है, तो आपको अपने सर्वर लॉग में एक अच्छी तरह से विस्तृत त्रुटि संदेश मिलेगा (देखें 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

तो आपको क्या करने की ज़रूरत है कंटेनर के /dataफ़ोल्डर को बाहरी स्थान पर मैप करना है (जहां गैर-रूट उपयोगकर्ता, यहां: 1007, में एक्सेस लिखना है, जैसे /tmpहोस्ट मशीन पर), जैसे:

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

तो यह आधिकारिक docker छवि (जो लिखना /tmpनहीं चाहिए /data) की एक गलत धारणा है, जो इस "टाइम बम" का निर्माण करती है कि आप सबसे अधिक संभावना केवल उत्पादन में ही प्राप्त करेंगे ... कुछ विशेष रूप से शांत छुट्टी सप्ताहांत में रात भर: /


1
बस यहाँ एक टिप्पणी जोड़ना चाहता था, क्योंकि इससे अंततः उन मुद्दों को हल करने में मदद मिली जो मैं डॉकियर में रेडियों के साथ सामना कर रहा था। हमारे यूएटी और देव डॉकर सर्वर विंडोज हैं। विंडोज डिफेंडर आरडीबी फाइलों की पहचान संभावित वायरस के रूप में करेगा। तो अपने / डेटा निर्देशिका बढ़ते अस्थायी रूप से मूल मुद्दे को हल करेगा; जब तक विंडोज डिफेंडर फ़ाइल को संगरोध करता है, तब तक एक और कारण बनता है। यह सुनिश्चित करें कि आप इसे हल करने के लिए Windows डिफ़ेंडर में अपवाद के रूप में माउंटेड डेटा निर्देशिका को जोड़ते हैं।
ट्रेवरब

1
मुझे याद दिलाता है: कि विंडोज डिफेंडर चेतावनी जरूरी नहीं कि एक झूठी सकारात्मक हो - एक क्रिप्टोकरंसी आधिकारिक Redis छवि को तब भी संक्रमित कर सकती है, जब इसे बिना रूट के और सभी क्षमताओं के साथ गिराए - यह अपने पोर्ट को शुद्ध करने के लिए पर्याप्त है
mirekkd

धन्यवाद, यह एक अच्छी बात है। बस उत्सुक, लेकिन मेजबान पर RDB फ़ाइल कैसे निष्पादित होगी, विशेष रूप से एक विंडोज एक? मुझे लगता है कि यह कंटेनर के भीतर ही निष्पादित हो सकता है। लेकिन यह इस विशेष कंटेनर के लिए विशिष्ट नहीं है।
ट्रेवरब

1
ठीक है, पेलोड शायद विंडोज पर निष्पादित करने में विफल होगा, जब तक कि पूरी तरह से लुआ में नहीं लिखा जाता है और इस तरह
रेडिस के

यह एक ज्ञानवर्धक अनुभव रहा है; बहुत बहुत धन्यवाद। जाहिरा तौर पर, हमारे UAT / DEV कंपोज़ फाइलें डॉकर नेटवर्क के बाहर बंदरगाहों को उजागर कर रही थीं। मुझे नहीं पता कि यह कैसे संभव है, लेकिन उन उदाहरणों से व्यवस्थापक आदेश प्राप्त हो रहे थे और वास्तव में। एक क्रिप्टोकरंसी लॉन्च कर रहे थे। मैंने उन बंदरगाहों को निष्क्रिय कर दिया है, स्थानीय आरडीबी माउंट को बंद कर दिया है, और विंडोज डिफेंडर अपवाद को फिर से स्थापित किया है (हालांकि, माउंट ऑफ के साथ कोई फर्क नहीं पड़ेगा)। मुझे यह जांचने की आवश्यकता है कि ये कमांड हमारे फ़ायरवॉल के माध्यम से कैसे प्राप्त कर रहे थे, लेकिन मैं बारीकी से निगरानी कर रहा हूं
ट्रेवरबी

3

मेरे लिए

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

और मैं अपने मैक को फिर से लोड करता हूं, यह काम करता है


1

मैंने एएफएस डिस्क स्थान वाले सर्वर पर काम करते समय इस समस्या को मारा क्योंकि मेरे प्रमाणीकरण टोकन की समय सीमा समाप्त हो गई थी, जो Permission Deniedरेडिस-सर्वर को बचाने की कोशिश करने पर प्रतिक्रियाएं मिलीं। मैंने अपना टोकन ताज़ा करके इसे हल किया:

kinit USERNAME_HERE -l 30d && aklog


1

यदि आप docker / docker-compose का उपयोग कर रहे हैं और फाइल को लिखने से रिडिस को रोकना चाहते हैं, तो आप एक रेडिस कॉन्फिग बना सकते हैं और एक कंटेनर में माउंट कर सकते हैं।

docker.compose.override.yml

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

आप डिफॉल्ट कॉन्फिग को यहां से डाउनलोड कर सकते हैं

redis.conf फ़ाइल में सुनिश्चित करें कि आप इन 3 लाइनों पर टिप्पणी करते हैं

save 900 1
save 300 10
save 60 10000

myou यहाँ लगातार डेटा को हटाने के लिए और अधिक समाधान देख सकते हैं


1

मेरे मामले में ऐसा इसलिए हुआ क्योंकि मैं सिर्फ redisत्वरित तरीके से प्रयोग कर रहा था । इसलिए लालियां जड़ के रूप में नहीं चल रही हैं। मैं Installing Redis more properlyउनके क्विक स्टार्ट गाइड के अनुभाग के तहत निर्देशों का पालन करके इस समस्या को हल करने में सक्षम था । ऐसा करने के बाद, समस्या हल हो गई और redisअब जड़ के रूप में चल रही है। इसकी जांच - पड़ताल करें।


1

इतने सारे एसओ सवालों के माध्यम से आखिरकार मेरे सिर को पीटने के बाद - मेरे लिए @Axel Advento के जवाब ने काम किया लेकिन कुछ अतिरिक्त चरणों के साथ - मैं अभी भी अनुमति के मुद्दों का सामना कर रहा था।
मुझे उपयोगकर्ता को स्विच करना था 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)


0

यदि आप विंडोज मशीन पर स्थानीय रूप से रेडिस चला रहे हैं, तो "व्यवस्थापक के रूप में चलाने" का प्रयास करें और देखें कि क्या यह काम करता है। मेरे साथ, समस्या यह थी कि रेडिस "प्रोग्राम फाइल्स" फ़ोल्डर में स्थित था, जो डिफ़ॉल्ट रूप से अनुमतियों को प्रतिबंधित करता है। जैसा होना चाहिए।

हालाँकि, Redis को एक व्यवस्थापक के रूप में स्वचालित रूप से न चलाएं आप इसे और अधिक अधिकार नहीं देना चाहते हैं जो इसे माना जाता है। आप इसे पुस्तक द्वारा हल करना चाहते हैं।

इसलिए, हम इसे प्रशासक के रूप में चलाकर समस्या को जल्दी पहचानने में सफल रहे हैं, लेकिन यह इलाज नहीं है। एक संभावित परिदृश्य यह है कि आपने Redis को एक फ़ोल्डर में रखा है जिसमें राइट नहीं है और परिणामस्वरूप DB फाइल उसी स्थान पर संग्रहीत है।

आप redis.windows.confनिम्न कॉन्फ़िगरेशन को खोलकर और इसे हल कर सकते हैं :

    # 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 ./

dir ./एक पथ को बदलें जिसके लिए आपके पास नियमित रूप से पढ़ने / लिखने की अनुमति है

आप बस Redis फ़ोल्डर को स्थानांतरित कर सकते हैं यह संपूर्ण फ़ोल्डर में है जिसे आप जानते हैं कि सही अनुमतियाँ हैं।


0

मेरे लिए यह लगातार रेडिस डेटा फ़ोल्डर पर अनुमतियों की समस्या थी। मैंने इसे दिया:

chmod 777 -Rf data/

और यह काम करता है! यह कहना जल्दबाजी होगी कि यह समस्या का समाधान है। क्योंकि मुझे यह भी संदेह है कि रेडिस जड़ के रूप में निष्पादित नहीं कर रहा है, इसलिए मुझे अधिक जानने के लिए अपने डॉकफाइल का निरीक्षण करने की आवश्यकता है।


0

कोई भी कार्रवाई करने से पहले अपने Redis लॉग की जाँच करें। इस धागे के कुछ समाधान आपके Redis डेटा को मिटा सकते हैं, इसलिए आप जो कर रहे हैं उसके बारे में सावधान रहें।

मेरे मामले में, मशीन रैम से बाहर चल रही थी । यह तब भी हो सकता है जब मेजबान पर कोई और डिस्क स्थान खाली न हो


0

कृपया, अवगत रहें, कि यह त्रुटि तब दिखाई देती है जब आपका सर्वर हमला कर रहा हो। बस पाया गया कि रेडिस '/etc/cron.d/web' पर लिखने में विफल रहता है, जहां अनुमतियों के सही होने के बाद, कुछ छुपाने के विकल्प के साथ खनन एल्गोरिदम से युक्त नई फ़ाइल जोड़ी गई थी।


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

-1

जैसा कि @Chris द्वारा बताया गया है कि समस्या कम मेमोरी की संभावना है। हमने इसे तब अनुभव करना शुरू किया जब हमने MySQL को बहुत अधिक RAM आवंटित किया (innodb_buffer_pool_size ) ।

यह सुनिश्चित करने के लिए कि RedSQL और अन्य सेवाओं के लिए पर्याप्त RAM है जो हमने innodb_buffer_pool_sizeMySQL पर कम की है।


-1

मेरे मामले में, इसका कारण डिस्क में बहुत कम मुक्त स्थान (केवल 35 एमबी) था। मैंने निम्नलिखित किया -

  1. सभी रेडिस संबंधित प्रक्रिया को रोक दिया
  2. पर्याप्त खाली स्थान बनाने के लिए डिस्क में कुछ फ़ाइलों को हटा दें
  3. Redis डंप फ़ाइल हटाएँ (यदि मौजूदा डेटा की आवश्यकता नहीं है)

    sudo rm /var/lib/redis/*

  4. सभी मौजूदा डेटाबेस की सभी कुंजियों को हटा दें

    sudo redis-cli flushall

  5. सभी अजवाइन कार्यों को पुनरारंभ करें और किसी भी समस्या के लिए संबंधित लॉग की जांच करें

1
आपने अपने देव उदाहरण पर ऐसा किया होगा। डेटा केंद्रित अनुप्रयोगों के साथ काम करते समय सही समाधान नहीं।
निकेश देवकी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.