MISCONF Redis ถูกกำหนดค่าเพื่อบันทึก RDB snapshots


366

ระหว่างการเขียนถึง Redis ( SET foo bar) ฉันได้รับข้อผิดพลาดต่อไปนี้:

MISCONF Redis ถูกกำหนดค่าให้บันทึกสแนปชอตของ RDB แต่ในปัจจุบันยังไม่สามารถอยู่บนดิสก์ได้ คำสั่งที่อาจแก้ไขชุดข้อมูลถูกปิดใช้งาน โปรดตรวจสอบบันทึก Redis เพื่อดูรายละเอียดเกี่ยวกับข้อผิดพลาด

โดยทั่วไปฉันเข้าใจว่าปัญหาคือว่า redis ไม่สามารถบันทึกข้อมูลบนดิสก์ แต่ไม่รู้ว่าจะกำจัดปัญหาได้อย่างไร

นอกจากนี้คำถามต่อไปนี้มีปัญหาเดียวกันมันถูกทอดทิ้งมานานแล้วโดยไม่มีคำตอบและส่วนใหญ่อาจไม่พยายามที่จะแก้ปัญหา


คุณสามารถแก้ไขปัญหานี้ได้ไหม ถ้าใช่คุณช่วยด้วยขั้นตอนได้ไหม เพราะการวางไฟล์ rdb ที่อื่นจะไม่แก้มันฉันเดา ฉันคิดว่า IM ไม่มีอะไรนี่
ankur

4
ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากการเริ่มเซิร์ฟเวอร์ redis ในไดเรกทอรีที่ redis ไม่มีสิทธิ์ ฉันขอแนะนำให้ย้อนกลับเป็นค่าเริ่มต้นหลังจากแก้ไขปัญหา: ดูคำตอบเกี่ยวกับการแก้ไขปัญหานี้
Govind Rai

นอกจากคำตอบของ Govind Rai: stackoverflow.com/a/47880440/5649620
Vyshnav Ramesh Thrissur

@GovindRai ฉันได้อนุญาตให้เปลี่ยนใหม่แล้วโดยเปลี่ยนทั้งกลุ่มและเจ้าของเป็นredisแต่ไม่ช่วย!
wdetac

คำตอบ:


184

ในกรณีที่คุณพบข้อผิดพลาดและข้อมูลสำคัญบางอย่างไม่สามารถยกเลิกได้ในการทำงาน Redis อินสแตนซ์ (ปัญหาเกี่ยวกับสิทธิ์สำหรับ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 ภายใต้ Persistence
thanikkal

ด้วยเหตุผลบางอย่างเมื่อฉันลองคำสั่งตั้งค่าใด ๆ มันก็เหมือนจะโหลดตลอดไป
Bashar Abdullah

5
สำหรับคนที่โชคร้ายผู้ที่อยู่บน Windows, ฉันในขณะนี้และโอ้โฮกำลังใช้รุ่น MSOpenTech dir C:/Temp/คุณต้องเส้นทางไดเรกทอรีชุดในรูปแบบต่อไปนี้: ทำ bgsave เพื่อตรวจสอบว่ามันใช้งานได้หรือไม่
จอห์นพี

@ John P นั่นเป็นเพียงสิ่งที่ต้องทำ ขอบคุณ!
แซม

2
127.0.0.1:6379> กำหนดค่า dir / root / tool (ข้อผิดพลาด) ERR การเปลี่ยนไดเรกทอรี: การอนุญาตถูกปฏิเสธ
Gank

316

ใช้redis-cliคุณสามารถหยุดมันพยายามที่จะบันทึกภาพรวม:

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

นี่เป็นวิธีแก้ปัญหาอย่างรวดเร็ว แต่ถ้าคุณสนใจข้อมูลที่คุณใช้คุณควรตรวจสอบเพื่อให้แน่ใจว่าเหตุใด bgsave จึงล้มเหลวตั้งแต่แรก


21
นี่เป็นวิธีแก้ปัญหาอย่างรวดเร็ว แต่คุณควรตรวจสอบเพื่อให้แน่ใจว่าเหตุใด bgsave จึงล้มเหลวตั้งแต่แรก
Mandeep Singh

7
หากคุณใช้ Redis เป็นหลักสำหรับการแคชและเซสชันสิ่งนี้จะต้องมี
จิม

1
สิ่งนี้ไม่เป็นอันตรายหรือไม่? ตัวอย่างเช่น NodeBB ใช้ Redis เป็นแหล่งข้อมูล
codecowboy

2
@LoveToCode config set stop-write-on-bgsave-error ใช่
Phil

4
เมื่อใดก็ตามที่ฉันรีสตาร์ทเซิร์ฟเวอร์ฉันก็มีปัญหาเดียวกันอีกครั้ง จากนั้นฉันต้องตั้งค่าอีกครั้ง ฉันจะทำให้มันถาวรได้อย่างไร
Zia Qamar

63

อาจมีข้อผิดพลาดในระหว่างกระบวนการ bgsave เนื่องจากหน่วยความจำเหลือน้อย ลองนี้ (จากคำถามที่พบบ่อยบันทึก redis พื้นหลัง)

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

5
LInk: redis.io/topics/faqค้นหาสิ่งนี้: " การบันทึกพื้นหลังล้มเหลวด้วย fork () ข้อผิดพลาดภายใต้ Linux แม้ว่าฉันจะมี RAM จำนวนมากฟรี! "
Bruno Peres

49

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจาก BGSAVE ล้มเหลว ระหว่าง BGSAVE Redis จะดำเนินการกระบวนการลูกเพื่อบันทึกข้อมูลบนดิสก์ แม้ว่าสาเหตุที่แท้จริงสำหรับความล้มเหลวของ BGSAVE สามารถตรวจสอบได้จากบันทึก (โดยปกติจะอยู่ที่/var/log/redis/redis-server.logเครื่อง Linux) แต่มีหลายครั้งที่ BGAVE ล้มเหลวเนื่องจากทางแยกไม่สามารถจัดสรรหน่วยความจำได้ หลายครั้งที่ทางแยกไม่สามารถจัดสรรหน่วยความจำได้ (แม้ว่าเครื่องจะมีแรมเพียงพอ) เนื่องจากการปรับให้เหมาะสมที่ขัดแย้งกันโดยระบบปฏิบัติการ

ที่สามารถอ่านได้จากRedis คำถามที่พบบ่อย :

สคีมาการบันทึกพื้นหลัง Redis ขึ้นอยู่กับความหมายของ copy-on-write ของ fork ในระบบปฏิบัติการสมัยใหม่: Redis forks (สร้างกระบวนการลูก) ซึ่งเป็นสำเนาที่แน่นอนของพาเรนต์ กระบวนการลูกทิ้งฐานข้อมูลบนดิสก์และออกในที่สุด ในทางทฤษฎีเด็กควรใช้หน่วยความจำให้มากที่สุดเท่าที่ผู้ปกครองเป็นสำเนา แต่จริง ๆ แล้วต้องขอบคุณความหมายของการคัดลอกบนการเขียนที่ดำเนินการโดยระบบปฏิบัติการที่ทันสมัยส่วนใหญ่กระบวนการผู้ปกครองและเด็กจะแบ่งปันหน้าหน่วยความจำทั่วไป หน้าจะซ้ำกันก็ต่อเมื่อมีการเปลี่ยนแปลงในเด็กหรือในผู้ปกครอง เนื่องจากในทางทฤษฎีแล้วทุกหน้าอาจมีการเปลี่ยนแปลงในขณะที่กระบวนการย่อยกำลังบันทึก Linux ไม่สามารถบอกล่วงหน้าได้ว่าหน่วยความจำของเด็กจะใช้เวลาเท่าใดดังนั้นหากการตั้งค่า overcommit_memory ถูกตั้งค่าเป็นศูนย์แยกจะล้มเหลว จำเป็นต้องทำซ้ำหน้าหน่วยความจำหลักทั้งหมดจริง ๆ

การตั้งค่า overcommit_memory ให้เป็น 1 จะบอกว่า Linux จะผ่อนคลายและดำเนินการแยกในรูปแบบการจัดสรรในแง่ดีมากขึ้นและนี่คือสิ่งที่คุณต้องการสำหรับ Redis

Redis ไม่ต้องการหน่วยความจำมากเท่าที่ระบบปฏิบัติการคิดว่าทำเพื่อเขียนลงดิสก์ดังนั้นอาจแยกส้อมก่อน

ในการแก้ไขปัญหานี้คุณสามารถ:

แก้ไข/etc/sysctl.confและเพิ่ม:

vm.overcommit_memory=1

จากนั้นรีสตาร์ท sysctl ด้วย:

ใน FreeBSD:

sudo /etc/rc.d/sysctl reload

บน Linux:

sudo sysctl -p /etc/sysctl.conf

ผลลัพธ์ของการsystemctl status redisเปิดเผยว่ามีคำเตือนที่แนะนำให้เปลี่ยนการovercommit_memory=0ตั้งค่าอย่างแน่นอน การแก้ไขที่แก้ไขปัญหาสำหรับฉันแล้ว
อัลกอริทึมนามธรรม

วิธีนี้แก้ไขปัญหาได้อย่างถูกต้องและควรเป็นคำตอบที่ได้รับการยอมรับ
DSynergy

tldr จะเป็นเช่นนั้นด้วยการตั้งค่าเริ่มต้นหาก redis ใช้ ram 10 gb คุณต้องมี ram 10gb ฟรีสำหรับกระบวนการลูกนี้เพื่อให้สามารถประมวลผลได้หรือไม่
Dan Hastings

@DanHastings - ใช่ และการตั้งค่า overcommit_memory เป็น 1 จะผ่อนคลายข้อกำหนดนี้
Bhindi

26

รีสตาร์ทเซิร์ฟเวอร์ Redis ของคุณ

  • MacOS (ชง) brew services restart redis:
  • Linux: sudo service redis restart /sudo systemctl restart redis
  • ของ Windows: Windows + R-> ประเภทservices.msc, Enter-> ค้นหาจากนั้นคลิกที่Redisrestart

ฉันมีปัญหานี้เป็นการส่วนตัวหลังจากอัพเกรด Redis ด้วย Brew ( brew upgrade) หลังจากรีบูตแล็ปท็อปมันจะทำงานได้ทันที


หากใครที่อ่านข้อความนี้ผมมีปัญหากับ Homebrew เช่นกัน แต่ไม่มีอะไรจะทำอย่างไรกับการอัพเกรด: ผมเพียงต้องการที่จะเริ่มให้บริการกับ:sudo brew services stop redis; sudo brew services start redis
bfontaine

24

ในกรณีที่คุณทำงานกับเครื่อง linux ให้ตรวจสอบสิทธิ์ของไฟล์และโฟลเดอร์ของฐานข้อมูลอีกครั้ง

db และพา ธ ไปยังสามารถรับได้ผ่าน:

ในredis-cli:

กำหนดค่าให้ dir

กำหนดค่ารับ dbfilename

และใน ls -lcommandline สิทธิ์ในไดเรกทอรีที่ควรจะเป็น755และบรรดาไฟล์ควรเป็น644 นอกจากนี้ตามปกติ Redis เซิร์ฟเวอร์รันเป็นผู้ใช้redisจึงยังมีความสุขที่จะให้ผู้ใช้เป็นเจ้าของของโฟลเดอร์โดยการดำเนินการredis sudo chown -R redis:redis /path/to/rdb/folderนี้ได้รับเนื้อหาในคำตอบที่นี่


พวกเขาควรได้รับอนุญาตอะไร
stephen

สิ่งนี้ใช้ได้สำหรับฉัน ขอบคุณ!
Lordwhizy

19

ขอบคุณทุกคนที่ตรวจสอบปัญหาดูเหมือนว่าข้อผิดพลาดเกิดขึ้นระหว่าง bgsaveขอบคุณทุกคนสำหรับการตรวจสอบปัญหาที่เกิดขึ้นเห็นได้ชัดว่าข้อผิดพลาดในระหว่างการผลิต

สำหรับฉันการพิมพ์config set stop-writes-on-bgsave-error noเชลล์และรีสตาร์ท Redis แก้ปัญหาได้แล้ว


82
นั่นไม่ได้ "แก้ปัญหา" แต่มันก็ไม่สนใจ
บัฟฟาโล

การรีสตาร์ท RedisServer ใน Services.msc ใช้งานได้สำหรับฉัน
ViPuL5

เมื่อใดก็ตามที่ฉันรีสตาร์ทเซิร์ฟเวอร์ฉันก็มีปัญหาเดียวกันอีกครั้ง จากนั้นฉันต้องตั้งค่าอีกครั้ง ฉันจะทำให้มันถาวรได้อย่างไร
Zia Qamar

@ZiaQamar คุณสามารถตั้งค่าคุณสมบัติอย่างถาวรใน redis.conf ซึ่งน่าจะเป็นที่ /etc/redis/redis.conf ตั้ง "stop-write-on-bgsave-error no"
Gaurav Tyagi

IMO ไม่ใช่ทางออกแน่นอน คุณเพียงแค่บอกให้ Redis ไม่บันทึกข้อผิดพลาดเหล่านั้น แต่ข้อผิดพลาดที่ยังคงมี ...
Erowlin

17

เริ่ม Redis Server ในไดเรกทอรีที่ Redis มีสิทธิ์ในการเขียน

คำตอบข้างต้นจะแก้ปัญหาของคุณแน่นอน แต่นี่คือสิ่งที่เกิดขึ้นจริง:

ตำแหน่งเริ่มต้นสำหรับการจัดเก็บrdb.dumpไฟล์คือ./(แสดงถึงไดเรกทอรีปัจจุบัน) คุณสามารถตรวจสอบได้ในredis.confไฟล์ของคุณ ดังนั้นไดเร็กทอรีที่คุณเริ่มเซิร์ฟเวอร์ redis คือตำแหน่งที่dump.rdbไฟล์จะถูกสร้างและอัพเดต

ดูเหมือนว่าคุณเริ่มใช้เซิร์ฟเวอร์ redis ในไดเรกทอรีที่ redis ไม่มีสิทธิ์ที่ถูกต้องในการสร้างdump.rdbไฟล์

เพื่อทำให้เรื่องแย่ลง Redis อาจไม่อนุญาตให้คุณปิดเซิร์ฟเวอร์ด้วยซ้ำจนกว่าจะสามารถสร้างไฟล์ rdb เพื่อให้แน่ใจว่าการบันทึกข้อมูลที่เหมาะสม

ในการแก้ปัญหานี้คุณจะต้องเข้าสู่สภาพแวดล้อมไคลเอนต์ redis ที่ใช้งานอยู่โดยใช้redis-cliและอัปเดตdirรหัสและตั้งค่าให้กับโฟลเดอร์โครงการของคุณหรือโฟลเดอร์ใด ๆ ที่ไม่ใช่รูทมีสิทธิ์ในการบันทึก จากนั้นเรียกใช้BGSAVEเพื่อเรียกใช้การสร้างdump.rdbไฟล์

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

(ตอนนี้ถ้าคุณต้องการบันทึกไฟล์ dump.rdb ในไดเรกทอรีที่คุณเริ่มต้นเซิร์ฟเวอร์คุณจะต้องเปลี่ยนสิทธิ์สำหรับไดเรกทอรีเพื่อให้ Redis สามารถเขียนลงไปได้คุณสามารถค้นหา stackoverflow เพื่อดูวิธีการทำ )

ตอนนี้คุณน่าจะสามารถปิดเซิร์ฟเวอร์ redis ได้แล้ว โปรดทราบว่าเรา hardcoded เส้นทาง ฮาร์ดโค้ดเป็นวิธีปฏิบัติที่ดีและฉันขอแนะนำให้เริ่มเซิร์ฟเวอร์ Redis จากไดเรกทอรีโครงการของคุณและเปลี่ยนdir key back to. / `

CONFIG SET dir "./"
BGSAVE

ด้วยวิธีนี้เมื่อคุณต้องการ redis สำหรับโครงการอื่นไฟล์ดัมพ์จะถูกสร้างขึ้นในไดเรกทอรีโครงการปัจจุบันของคุณและไม่อยู่ในไดเรกทอรีโครงการของพา ธ ฮาร์ดโค้ด


ตรวจสอบให้แน่ใจว่าคุณได้รับอนุญาตจากผู้ใช้ที่ไม่ใช่รูทสำหรับไดเรกทอรีที่ไฟล์ดัมพ์จะถูกเก็บไว้ในกรณีของฉันฉันมีผู้ใช้redisดังนั้นฉัน: sudo chown redis:redis /var/lib/redis
RoundOutTooSoon

13

หากคุณใช้ MacOS และเพิ่งอัพเกรดเป็น Catalina คุณอาจต้องเรียกใช้brew services restart redisตามที่แนะนำในปัญหานี้


12

พบข้อผิดพลาดนี้และสามารถค้นหาได้จากบันทึกว่าข้อผิดพลาดเกิดจากพื้นที่ดิสก์ไม่เพียงพอ ข้อมูลทั้งหมดที่ถูกแทรกในกรณีของฉันไม่ต้องการอีกต่อไป ดังนั้นฉันจึงพยายามที่จะล้าง เนื่องจากกระบวนการ redis-rdb-bgsave กำลังทำงานอยู่จึงไม่อนุญาตให้ทำการล้างข้อมูลด้วย ฉันทำตามขั้นตอนด้านล่างและสามารถดำเนินการต่อได้

  1. เข้าสู่ระบบลูกค้า Redis
  2. เรียกใช้งานชุดการกำหนดค่า stop-writes-on-bgsave-error no
  3. ดำเนินการFLUSHALL (ไม่จำเป็นต้องจัดเก็บข้อมูล)
  4. ดำเนินการกำหนดค่ากำหนด stop-write-on-bgsave-error ใช่

กระบวนการ redis-rdb-bgsave ไม่ได้ทำงานอีกต่อไปหลังจากขั้นตอนข้างต้น


7

ฉันต้องเผชิญกับปัญหาที่คล้ายกันเหตุผลหลักที่อยู่เบื้องหลังคือการใช้หน่วยความจำ (RAM) โดย redis เครื่อง EC2 ของฉันมี 8GB RAM (ใช้ได้ 7.4 สำหรับการบริโภค)

เมื่อโปรแกรมของฉันใช้งานการใช้ RAM เกิน 7.2 GB เหลือแทบจะไม่ถึง 100MB ใน RAM ซึ่งโดยทั่วไปจะเป็นตัวกระตุ้น MISCONF Redis error ...

คุณสามารถกำหนดปริมาณการใช้ RAM โดยใช้htopคำสั่ง ค้นหาแอตทริบิวต์Memหลังจากรันคำสั่ง htop ถ้ามันแสดงการสิ้นเปลืองที่สูง (เช่นในกรณีของฉันมันคือ 7.2GB / 7.4GB) มันจะดีกว่าถ้าจะอัพเกรดอินสแตนซ์ด้วยหน่วยความจำขนาดใหญ่ ในสถานการณ์สมมตินี้การใช้config set stop-writes-on-bgsave-error noจะเป็นความเสียหายสำหรับเซิร์ฟเวอร์และอาจส่งผลให้บริการอื่น ๆ ที่ทำงานบนเซิร์ฟเวอร์หยุดชะงัก (ถ้ามี) ดังนั้นจึงดีกว่าที่จะหลีกเลี่ยงคำสั่งการตั้งค่าและอัพเกรดเครื่อง REDIS ของคุณ

FYI: คุณอาจต้องติดตั้งhtopเพื่อให้งานนี้:sudo apt-get install htop

อีกวิธีหนึ่งในการแก้ไขปัญหานี้อาจเป็นบริการอื่น ๆ ของ RAM ที่ทำงานอยู่ในระบบของคุณตรวจสอบบริการอื่น ๆ ที่ทำงานบนเซิร์ฟเวอร์ / เครื่อง / อินสแตนซ์ของคุณและหยุดหากไม่จำเป็น เพื่อตรวจสอบบริการทั้งหมดที่ใช้งานบนเครื่องของคุณservice --status-all

และคำแนะนำสำหรับผู้ที่วางคำสั่ง config โดยตรงกรุณาค้นหาอีกครั้งและอย่างน้อยก็เตือนผู้ใช้ก่อนที่จะใช้คำสั่งดังกล่าว และตามที่ @Rodrigo พูดถึงในความคิดเห็นของเขา: "มันดูไม่ดีเลยที่จะเพิกเฉยต่อข้อผิดพลาด"

--- UPDATE ---

คุณสามารถกำหนดค่าmaxmemoryและmaxmemory-policyกำหนดพฤติกรรมของ Redis ได้เมื่อถึงขีด จำกัด หน่วยความจำที่เฉพาะเจาะจง ตัวอย่างเช่นถ้าฉันต้องการรักษาขีด จำกัด หน่วยความจำ 6GB และลบคีย์ที่ใช้งานน้อยที่สุดจากฐานข้อมูลเพื่อให้แน่ใจว่าการใช้ redis mem ไม่เกิน 6GB จากนั้นเราสามารถตั้งค่าพารามิเตอร์ทั้งสองนี้ได้ (ใน redis.conf หรือ CONFIG SET คำสั่ง):

maxmemory 6gb
maxmemory-policy allkeys-lru

มีค่าอื่น ๆ อีกมากมายที่คุณสามารถตั้งค่าสำหรับพารามิเตอร์ทั้งสองนี้คุณสามารถอ่านเกี่ยวกับสิ่งนี้ได้จากที่นี่: https://redis.io/topics/lru-cache


6

การแก้ไขที่ถาวรมากขึ้นอาจดูใน /etc/redis/redis.conf รอบ ๆ บรรทัด 200-250 ที่มีการตั้งค่าสำหรับคุณสมบัติ rdb ซึ่งไม่ได้เป็นส่วนหนึ่งของการทำซ้ำใน 2.x วัน

ยวด

dir ./

สามารถเปลี่ยนเป็น

dir /home/someuser/redislogfiledirectory

หรือคุณสามารถคอมเม้นท์ทุกบรรทัดที่บันทึกไว้และไม่ต้องกังวลกับการคงอยู่ (ดูความคิดเห็นใน /etc/redis/redis.conf)

นอกจากนี้อย่าลืม

service redis-server stop
service redis-server start

6

คำตอบทั้งหมดนั้นไม่ได้อธิบายถึงสาเหตุที่การบันทึก rdb ล้มเหลว


ในกรณีของฉันฉันตรวจสอบบันทึก Redis และพบว่า:

14975: M 18 Jun 13: 23: 07.354 # การบันทึกพื้นหลังถูกยกเลิกโดยสัญญาณ 9

รันคำสั่งต่อไปนี้ในเทอร์มินัล:

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

มันแสดง:

/var/log/kern.log.1: มิ.ย. 18 13:23:07 10-10-88-16 เคอร์เนล: [28152358.208108] กระบวนการฆ่า 28416 (เซิร์ฟเวอร์ Redis) รวม -vm: 7660204kB, anon-rss: 2285492kB, ไฟล์ RSS: 0kb

อย่างนั้นแหละ! กระบวนการนี้ (redis save rdb) ถูกฆ่าโดยOOM killer

หมายถึง:

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

การค้นหากระบวนการที่ถูกฆ่าโดย Linux OOM killer


3

FWIW ฉันพบปัญหานี้และวิธีแก้ไขก็แค่เพิ่ม swapfile ลงในกล่อง ฉันใช้วิธีนี้: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04


คุณคิดว่าหน่วยความจำล้นเป็นปัญหาได้อย่างไร ฉันอาจจะมีปัญหาเดียวกัน
DarthSpeedious

@DarthSpeedious ฉันจำไม่ได้ ถ้าฉันต้องเดาฉันจะบอกว่าอาจมีบางอย่างในบันทึกที่บ่นว่าไม่สามารถจัดสรรหน่วยความจำได้ ขออภัยฉันไม่สามารถช่วยเหลือได้มากกว่านี้
Ryan Angilly

ในตอนแรกฉันคิดว่ามันจะเป็นทางออกที่ดีในการทำงานร่วมกับ swap และ redis รวมกันแล้วฉันก็ทำการวิจัยและถึงบทความนี้antirez.com/news/52ซึ่งอ้างว่ามันเป็นวิธีที่ผิดในการใช้ redis อยู่แล้วฉันไม่ได้ เห็นด้วย 100% คุณพอใจกับประสิทธิภาพของการใช้ redis กับ swap หรือไม่?
talsibony

1
@DarthSpeedious ในบันทึก Redis ของคุณคุณจะเห็นข้อผิดพลาด " ไม่สามารถจัดสรรหน่วยความจำ " ดูที่นี่เกี่ยวกับวิธีดูไฟล์บันทึกข้อมูล: stackoverflow.com/questions/16337107/…
Bruno Peres

3

ฉันก็กำลังเผชิญกับปัญหาเดียวกัน ทั้งคำตอบ (คำตอบที่ได้รับการโหวตมากที่สุดและคำตอบที่ยอมรับได้) เพียงให้การแก้ไขชั่วคราวสำหรับสิ่งเดียวกัน

ยิ่งไปกว่านั้นวิธีconfig set stop-writes-on-bgsave-error noนี้เป็นวิธีที่น่ากลัวในการดูข้อผิดพลาดนี้เนื่องจากสิ่งที่ตัวเลือกนี้ทำคือหยุด redis จากการแจ้งเตือนว่าการเขียนถูกหยุดและดำเนินการต่อโดยไม่ต้องเขียนข้อมูลในสแน็ปช็อต นี่เป็นเพียงการละเว้นข้อผิดพลาดนี้ แนะนำสิ่งนี้

สำหรับการตั้งค่าdirในconfigredis-cli เมื่อคุณเริ่มบริการ redis ใหม่อีกครั้งสิ่งนี้จะถูกล้างออกด้วยและข้อผิดพลาดเดียวกันจะปรากฏขึ้นอีกครั้ง ค่าเริ่มต้นของdirในredis.confเป็น./และถ้าคุณเริ่มต้น Redis เป็นผู้ใช้ root แล้ว./คือ/ที่สิทธิ์ในการเขียนไม่ได้รับอนุญาตและด้วยเหตุนี้ข้อผิดพลาด

วิธีที่ดีที่สุดคือการตั้งค่าdirพารามิเตอร์ในไฟล์ redis.conf และตั้งค่าการอนุญาตที่เหมาะสมให้กับไดเรกทอรีนั้น การแจกแจงแบบเดเบียนส่วนใหญ่จะมี/etc/redis/redis.conf


3

ทุกวันนี้ปัญหาการเข้าถึงการเขียนของ Redis ที่ให้ข้อความแสดงข้อผิดพลาดนี้แก่ลูกค้าปรากฏขึ้นอีกครั้งในredisคอนเทนเนอร์นักเทียบท่าอย่างเป็นทางการ

Redis จากอิมเมจอย่างเป็นทางการredisพยายามเขียนไฟล์. rdb ลงในคอนเทนเนอร์/dataโฟลเดอร์ซึ่งค่อนข้างโชคร้ายเนื่องจากเป็นโฟลเดอร์ที่เป็นเจ้าของรูทและเป็นตำแหน่งที่ไม่ติดขัดเช่นกัน (ข้อมูลที่เขียนจะหายไปหากคอนเทนเนอร์ / พ็อดของคุณ แฮงค์)

ดังนั้นหลังจากไม่มีการใช้งานเป็นเวลาหนึ่งชั่วโมงหากคุณเรียกใช้redisคอนเทนเนอร์ของคุณในฐานะผู้ใช้ที่ไม่ใช่รูท (เช่นdocker run -u 1007แทนที่จะเป็นค่าเริ่มต้นdocker run -u 0) คุณจะได้รับข้อความแสดงข้อผิดพลาดอย่างละเอียดเกี่ยวกับ msg ในบันทึกของเซิร์ฟเวอร์ (ดู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

ดังนั้นมันจึงเป็นค่าที่ผิดของภาพที่นักเทียบท่าอย่างเป็นทางการ (ซึ่งควรเขียนถึง/tmpไม่ได้/data) ที่ผลิตนี้ "ระเบิดเวลา" ที่คุณจะมีโอกาสมากที่สุดเผชิญหน้าเฉพาะในการผลิต ... ในชั่วข้ามคืนในช่วงวันหยุดสุดสัปดาห์ที่เงียบสงบบางส่วนโดยเฉพาะอย่างยิ่ง: /


1
แค่ต้องการเพิ่มความคิดเห็นที่นี่เนื่องจากท้ายที่สุดนี้ช่วยแก้ไขปัญหาที่ฉันเผชิญกับ redis ใน Docker เซิร์ฟเวอร์ UAT และ Dev Docker ของเราคือ Windows Windows Defender จะระบุไฟล์ RDB ว่าเป็นไวรัสที่อาจเป็นไปได้ ดังนั้นการเมาท์ไดเร็กทอรี / data ของคุณจะเป็นการแก้ปัญหาชั่วคราว จนกระทั่ง Windows Defender กักกันไฟล์ทำให้เกิดไฟล์อื่น ทำแน่ใจว่าคุณเพิ่มไดเรกทอรีข้อมูลที่ติดตั้งอยู่เป็นข้อยกเว้นใน Windows Defender เพื่อแก้ไขปัญหานี้
TrevorB

1
ทำให้ผมนึกถึง: ว่า Windows Defender แจ้งเตือนอาจไม่จำเป็นต้องเป็นบวกเท็จ - เป็น cryptominer สามารถติดภาพ Redis อย่างเป็นทางการแม้ในขณะที่ทำงานได้โดยไม่ต้องรากและมีความสามารถทั้งหมดที่ลดลง - ก็พอที่จะเปิดเผยพอร์ตมาสุทธิ
mirekphd

ขอบคุณนั่นเป็นจุดที่ดี แค่อยากรู้อยากเห็น แต่ไฟล์ RDB จะดำเนินการบนโฮสต์โดยเฉพาะอย่างยิ่ง Windows ได้อย่างไร ฉันคิดว่ามันสามารถดำเนินการภายในคอนเทนเนอร์เอง แต่นั่นไม่ได้เฉพาะเจาะจงกับภาชนะนี้
TrevorB

1
ขวาส่วนของข้อมูลอาจจะล้มเหลวในการรันบน Windows เว้นแต่จะเขียนทั้งหมดใน Lua และข้ามแพลตฟอร์มเป็น Redis เอง ... คำสั่ง eval เป็นการประดิษฐ์ของปีศาจโดยไม่คำนึงถึงภาษา
mirekphd

นี่เป็นประสบการณ์ที่น่าประทับใจ ขอบคุณมาก ๆ. เห็นได้ชัดว่าไฟล์การเขียน UAT / DEV ของเรากำลังเปิดเผยพอร์ตที่อยู่นอกเครือข่าย Docker ฉันไม่ทราบว่าสิ่งนี้เป็นไปได้ แต่กรณีเหล่านั้นได้รับคำสั่งของผู้ดูแลระบบและแน่นอน กำลังเปิดตัว crypto miner ฉันได้ปิดการใช้งานพอร์ตเหล่านั้นปิดการเมานต์ RDB ในระบบแล้วทำการติดตั้ง Windows Defender อีกครั้ง (แม้ว่าจะไม่สำคัญกับการเมานต์) ฉันต้องตรวจสอบว่าคำสั่งเหล่านี้ผ่านไฟร์วอลล์ของเราได้อย่างไร แต่ฉันกำลังตรวจสอบอย่างใกล้ชิด
TrevorB

3

สำหรับฉัน

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

และฉันรีโหลดแม็คใหม่ใช้งานได้


1

ฉันพบปัญหานี้ขณะทำงานบนเซิร์ฟเวอร์ที่มีพื้นที่ดิสก์ AFS เนื่องจากโทเค็นการตรวจสอบสิทธิ์ของฉันหมดอายุซึ่งให้Permission Deniedการตอบสนองเมื่อเซิร์ฟเวอร์ Redis พยายามบันทึก ฉันแก้ไขสิ่งนี้ได้โดยการเติมโทเค็นของฉันใหม่:

kinit USERNAME_HERE -l 30d && aklog


1

ในกรณีที่คุณใช้นักเทียบท่า / นักแต่งเพลงและต้องการป้องกันไม่ให้ Redis เขียนลงไฟล์คุณสามารถสร้างการตั้งค่า Redis และติดตั้งลงในคอนเทนเนอร์

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โดยใช้วิธีที่รวดเร็ว ดังนั้น Redis จึงไม่ทำงานเหมือนรูท ผมสามารถที่จะแก้ปัญหานี้โดยทำตามคำแนะนำที่อยู่ภายใต้Installing Redis more properlyส่วนของคู่มือการเริ่มต้น หลังจากทำเช่นนั้นปัญหาได้รับการแก้ไขและredisขณะนี้ทำงานเป็นรูท ลองดูสิ


1

หลังจากต่อสู้กับคำถามมากมายดังนั้นในที่สุด - สำหรับฉัน @Axel Advento ทำงานได้ แต่มีขั้นตอนเพิ่มเติมไม่กี่ก้าว - ฉันยังคงเผชิญกับปัญหาการอนุญาต
ฉันต้องเปลี่ยนผู้ใช้เป็นredisสร้าง dir ใหม่ในที่บ้าน dir แล้วตั้งเป็น dir ของ 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

ในกรณีของฉันมันเกี่ยวข้องกับพื้นที่ว่างในดิสก์ (คุณสามารถตรวจสอบได้ด้วยdf -hคำสั่ง bash) เมื่อฉันเพิ่มที่ว่างบางส่วนข้อผิดพลาดนี้หายไป


0

หากคุณใช้ Redis อยู่ภายในเครื่อง windows ให้ลอง "run as administrator" และดูว่าใช้งานได้หรือไม่ สำหรับฉันปัญหาคือ Redis ตั้งอยู่ในโฟลเดอร์ "Program Files" ซึ่งจะ จำกัด การอนุญาตตามค่าเริ่มต้น เท่าที่ควร

อย่างไรก็ตามอย่าเรียกใช้ 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

สำหรับฉันมันเป็นเพียงปัญหาสิทธิ์ในโฟลเดอร์ข้อมูล Redis ถาวร ฉันให้มัน:

chmod 777 -Rf data/

และมันใช้งานได้! อาจจะเร็ว แต่จะบอกว่าแก้ไขปัญหาได้แล้ว เนื่องจากฉันยังสงสัยว่า redis ไม่ได้ทำงานเป็น root ดังนั้นฉันจึงต้องตรวจสอบ dockerFile ของฉันเพื่อหาข้อมูลเพิ่มเติม


0

ตรวจสอบบันทึก Redis ของคุณก่อนดำเนินการใด ๆ โซลูชันบางอย่างในชุดข้อความนี้อาจลบข้อมูล Redis ของคุณดังนั้นโปรดระวังสิ่งที่คุณกำลังทำ

ในกรณีของเครื่องก็วิ่งออกมาจากแรม สิ่งนี้สามารถเกิดขึ้นได้เมื่อไม่มีอีกต่อไปพื้นที่ว่างบนดิสก์เพิ่มเติมบนโฮสต์


0

โปรดระวังว่าข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อเซิร์ฟเวอร์ของคุณถูกโจมตี เพิ่งพบว่า redis ล้มเหลวในการเขียนไปยัง '/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 มากเกินไปinnodb_buffer_pool_size )

เพื่อให้มั่นใจว่ามี RAM เพียงพอสำหรับ Redis และบริการอื่น ๆ เราจึงลดการinnodb_buffer_pool_sizeใช้งาน MySQL


-1

ในกรณีของฉันเหตุผลก็คือพื้นที่ว่างในดิสก์เหลือน้อยมาก (เพียง 35 Mb) ฉันทำต่อไปนี้ -

  1. หยุดกระบวนการที่เกี่ยวข้องกับ Redis ทั้งหมด
  2. ลบบางไฟล์ในดิสก์เพื่อให้มีพื้นที่ว่างเพียงพอ
  3. ลบไฟล์ redis dump (หากไม่ต้องการข้อมูลที่มีอยู่)

    sudo rm /var/lib/redis/*

  4. ลบคีย์ทั้งหมดของฐานข้อมูลที่มีอยู่ทั้งหมด

    sudo redis-cli flushall

  5. รีสตาร์ทงานคื่นฉ่ายทั้งหมดและตรวจสอบบันทึกที่เกี่ยวข้องสำหรับปัญหาใด ๆ

1
คุณต้องทำสิ่งนี้บนอินสแตนซ์ dev ของคุณ วิธีการแก้ปัญหาที่ไม่ถูกต้องเมื่อจัดการกับแอปพลิเคชันเป็นศูนย์กลางของข้อมูล
Nikesh Devaki

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.