คำตอบสั้น ๆ: เลือกและตั้งค่าวิธีเก็บข้อมูล Redis ลงดิสก์ให้เหมาะกับงาน ทั้งแบบ Snapshot และแบบบันทึกทุกคำสั่ง พร้อมวิธีกู้คืนและจำกัดหน่วยความจำ
คู่มือนี้อธิบาย RDB ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
หลายคนใช้ Redis เป็นแคชโดยไม่สนใจว่าข้อมูลจะหายเมื่อรีสตาร์ต ซึ่งถูกต้องสำหรับงานแคช แต่เมื่อนำไปเก็บคิวงาน เซสชันผู้ใช้ หรือตัวนับที่ต้องแม่นยำ การที่ข้อมูลหายหมายถึงงานที่หายไปและผู้ใช้ที่ถูกเตะออกจากระบบทั้งหมดพร้อมกัน
คู่มือนี้อธิบายสองกลไกที่ Redis มีให้ พร้อมแนวทางเลือกใช้ตามลักษณะงาน และการตั้งค่าหน่วยความจำซึ่งสำคัญไม่แพ้กัน
สิ่งที่ต้องเตรียม
- Redis 6 ขึ้นไปบน Linux และสิทธิ์
sudo - รู้ว่าข้อมูลที่เก็บยอมให้สูญหายได้แค่ไหน ซึ่งเป็นสิ่งที่ตัดสินทุกอย่างในคู่มือนี้
redis-cli INFO server | grep redis_version
redis-cli INFO persistence | head -20
ขั้นตอนที่ 1: เข้าใจสองกลไก
RDB คือการถ่ายภาพข้อมูลทั้งหมดเป็นระยะ
- ข้อดี ไฟล์เล็ก กู้คืนเร็วมาก ภาระต่อระบบต่ำ เหมาะกับการสำรองข้อมูล
- ข้อเสีย ข้อมูลระหว่างสองภาพจะหายเมื่อไฟดับ อาจเป็นหลายนาที
AOF คือการบันทึกทุกคำสั่งที่เปลี่ยนแปลงข้อมูล
- ข้อดี สูญหายน้อยมาก ตั้งได้ถึงระดับทุกวินาที
- ข้อเสีย ไฟล์ใหญ่กว่า กู้คืนช้ากว่า และมีภาระการเขียนมากกว่า
แนวทางที่แนะนำสำหรับงานจริงคือเปิดทั้งสองอย่าง ใช้ AOF เป็นหลักในการกู้คืนเพราะข้อมูลครบกว่า และใช้ RDB เป็นไฟล์สำรองที่ส่งออกไปเก็บนอกเครื่อง
ขั้นตอนที่ 2: ตั้งค่า RDB
sudo nano /etc/redis/redis.conf
# บันทึกเมื่อ: ผ่านไป 900 วินาทีและมีการเปลี่ยนแปลงอย่างน้อย 1 ครั้ง
# ผ่านไป 300 วินาทีและเปลี่ยนแปลง 10 ครั้ง
# ผ่านไป 60 วินาทีและเปลี่ยนแปลง 10000 ครั้ง
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis
rdbcompression yes
rdbchecksum yes
# หยุดรับการเขียนหากบันทึกลงดิสก์ไม่สำเร็จ ป้องกันข้อมูลหายเงียบ ๆ
stop-writes-on-bgsave-error yes
ปิด RDB ทั้งหมดได้ด้วยการลบบรรทัด save ทุกบรรทัดแล้วใส่ save "" ซึ่งเหมาะกับกรณีที่ใช้เป็นแคชล้วน ๆ
ขั้นตอนที่ 3: ตั้งค่า AOF
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
# ทางเลือกในการซิงก์ลงดิสก์
# always = ปลอดภัยที่สุด ช้าที่สุด
# everysec = สมดุลที่สุด สูญหายไม่เกิน 1 วินาที <- แนะนำ
# no = เร็วที่สุด ปล่อยให้ระบบปฏิบัติการตัดสินใจ
appendfsync everysec
# บีบอัดไฟล์อัตโนมัติเมื่อโตขึ้นเท่าตัว
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# ไม่ซิงก์ระหว่างกำลังบีบอัด ลดอาการกระตุก
no-appendfsync-on-rewrite yes
sudo systemctl restart redis-server
redis-cli INFO persistence | grep -E 'aof_enabled|rdb_last_bgsave_status|aof_last_write_status'
ขั้นตอนที่ 4: จำกัดหน่วยความจำและเลือกนโยบายลบ
ข้อนี้สำคัญพอ ๆ กับความคงทน หากไม่จำกัด Redis จะใช้หน่วยความจำจนเครื่องหมดและถูกระบบฆ่าทิ้ง ซึ่งทำให้ข้อมูลในหน่วยความจำหายทันที
# ตั้งประมาณ 60-70% ของ RAM ทั้งเครื่อง เผื่อไว้ให้การบีบอัด AOF
maxmemory 4gb
maxmemory-policy allkeys-lru
นโยบายที่เลือกได้และควรใช้เมื่อไร
noevictionไม่ลบอะไรเลย คืนค่าผิดพลาดเมื่อเต็ม ใช้เมื่อข้อมูลทุกตัวสำคัญ เช่น คิวงานallkeys-lruลบตัวที่ไม่ได้ใช้นานที่สุด เหมาะกับแคชทั่วไปvolatile-lruลบเฉพาะคีย์ที่ตั้งเวลาหมดอายุไว้ เหมาะเมื่อเก็บทั้งข้อมูลถาวรและแคชปนกันallkeys-lfuลบตัวที่ใช้น้อยที่สุด เหมาะเมื่อมีข้อมูลยอดนิยมชัดเจน
ตรวจการใช้หน่วยความจำจริง
redis-cli INFO memory | grep -E 'used_memory_human|maxmemory_human|mem_fragmentation_ratio'
redis-cli --bigkeys
คำสั่ง --bigkeys หาคีย์ที่ใหญ่ผิดปกติ ซึ่งมักเป็นสาเหตุที่หน่วยความจำเต็มเร็วกว่าที่คำนวณไว้