Tân Nguyễn
Tân Nguyễn I'am developer

Redis: 2. Redis persistence

Redis: 2. Redis persistence

Đặt vấn đề

Redis nổi tiếng với tốc độ xử lý cực nhanh nhờ lưu trữ dữ liệu trên RAM. Nhưng điều này cũng đặt ra một câu hỏi quan trọng: Điều gì xảy ra nếu Redis gặp sự cố hoặc bị tắt đột ngột?

Không giống như các cơ sở dữ liệu truyền thống (như MySQL, PostgreSQL), Redis không tự động lưu dữ liệu vào ổ đĩa theo cách mặc định. Nếu không có cơ chế lưu trữ (persistence), tất cả dữ liệu trong bộ nhớ sẽ biến mất khi server khởi động lại!

Redis Persistence:

1. Giới Thiệu

Redis nổi tiếng là một hệ thống lưu trữ dữ liệu in-memory tốc độ cao. Nhưng làm thế nào Redis có thể bảo đảm dữ liệu không bị mất khi hệ thống gặp sự cố? Câu trả lời chính là Redis Persistence (Tính bền vững của dữ liệu trong Redis).

Trong bài viết này, chúng ta sẽ tìm hiểu các cơ chế lưu trữ dữ liệu của Redis, ưu nhược điểm của từng phương pháp và khi nào nên sử dụng chúng.

2. Redis Có Cần Persistence Không?

Vì Redis là bộ nhớ trong (RAM-based), nếu không có persistence, toàn bộ dữ liệu sẽ mất khi Redis bị tắt. Một số ứng dụng không cần lưu trữ dữ liệu lâu dài, nhưng nhiều hệ thống quan trọng như hệ thống tài chính, giỏ hàng, hệ thống lưu trữ điểm game đều cần đảm bảo dữ liệu tồn tại ngay cả khi Redis gặp sự cố.

Redis cung cấp hai cơ chế persistence chính:

  • RDB (Redis Database File)

  • AOF (Append-Only File)

3. Cơ Chế Redis Persistence

3.1. RDB (Redis Database File)

Cách Hoạt Động:

  • Redis tạo snapshot (ảnh chụp nhanh) của toàn bộ dữ liệu và lưu vào file .rdb.

  • Khi Redis khởi động lại, nó sẽ nạp lại dữ liệu từ file này.

Cách Cấu Hình:Redis tự động lưu RDB theo cấu hình save trong redis.conf:

1
2
3
4
5
6
# Lưu RDB nếu có ít nhất 1 thay đổi sau 900 giây    
save 900 1
# Lưu RDB nếu có ít nhất 10 thay đổi sau 300 giây
save 300 10
# Lưu RDB nếu có ít nhất 10,000 thay đổi sau 60 giây
save 60 10000

Hoặc có thể thực hiện thủ công:

1
2
BGSAVE  # Chạy lưu RDB ở background
SAVE    # Lưu RDB đồng bộ (có thể chặn Redis trong giây lát)

Ưu điểm:

  • Nhanh, tối ưu cho backup định kỳ.

  • Ít ảnh hưởng đến hiệu suất hệ thống.

  • File RDB nhỏ gọn, dễ dàng sao lưu.

Nhược điểm:

  • Có thể mất dữ liệu do snapshot không lưu liên tục.

  • Nếu Redis bị crash giữa hai lần snapshot, dữ liệu chưa lưu sẽ mất.

3.2. AOF (Append-Only File)

Cách Hoạt Động:

  • Redis ghi mọi thao tác ghi dữ liệu (SET, HSET, LPUSH,…) vào file log .aof.

  • Khi Redis khởi động, nó sẽ đọc lại file .aof để khôi phục dữ liệu.

Cách Cấu Hình: Cấu hình trong redis.conf:

1
2
appendonly yes   # Bật AOF  
appendfsync everysec  # Ghi file AOF mỗi giây (hiệu suất tốt, độ bền cao)  

Các tùy chọn appendfsync:

  • always: Ghi vào disk ngay lập tức (an toàn nhất nhưng chậm)

  • everysec: Ghi mỗi giây (cân bằng giữa an toàn và hiệu suất)

  • no: Để hệ điều hành quyết định khi nào ghi (nhanh nhưng có rủi ro mất dữ liệu)

Ưu điểm:

  • Đảm bảo dữ liệu không bị mất.

  • Có thể lưu từng thao tác thay đổi dữ liệu.

  • Phù hợp cho ứng dụng cần high durability (độ bền dữ liệu cao).

Nhược điểm:

  • File AOF lớn hơn RDB do ghi nhiều thao tác hơn.

  • Tốc độ khôi phục chậm hơn do phải đọc lại toàn bộ log thay đổi.

4. So Sánh RDB Và AOF

Tiêu chí RDB (Snapshot) AOF (Log Thay Đổi)
Tốc độ Nhanh hơn (lưu file gọn) Chậm hơn (ghi log từng thao tác)
Mất dữ liệu? Có thể mất vài phút dữ liệu Ít rủi ro hơn, chỉ mất tối đa 1 giây dữ liệu
Khôi phục Nhanh (đọc 1 file snapshot) Chậm hơn (đọc lại từng thao tác)
Kích thước file Nhỏ gọn Lớn hơn do lưu từng thao tác
Phù hợp với Backup định kỳ, ứng dụng không cần dữ liệu real-time Ứng dụng yêu cầu độ bền cao

5. Khi Nào Nên Dùng RDB? Khi Nào Nên Dùng AOF?

  • Dùng RDB nếu:

    • Bạn chỉ cần backup dữ liệu định kỳ.

    • Bạn muốn tốc độ nhanh hơn, ít ảnh hưởng đến hiệu suất hệ thống.

    • Bạn không yêu cầu dữ liệu real-time.

  • Dùng AOF nếu:

    • Bạn cần độ bền dữ liệu cao, không muốn mất bất kỳ giao dịch nào.

    • Ứng dụng yêu cầu khôi phục chính xác mọi thao tác.

    • Bạn có thể chấp nhận chi phí lưu trữ cao hơn.

  • Kết hợp cả hai:

    • Trong nhiều trường hợp, tốt nhất là bật cả RDB + AOF để tận dụng ưu điểm của từng phương pháp.

Cấu hình kết hợp trong redis.conf:

1
2
3
4
5
save 900 1  
save 300 10  
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes

6. Cách Redis Khôi Phục Dữ Liệu ?

Redis khôi phục dữ liệu khác nhau tùy theo cơ chế RDB, AOF, hoặc kết hợp cả hai. Dưới đây là chi tiết cách hoạt động của từng cơ chế:


🔹 1. Khi sử dụng RDB

📌 Cách hoạt động:

  • Redis đọc file dump.rdb và nạp toàn bộ dữ liệu vào bộ nhớ.
  • Do RDB lưu snapshot theo từng khoảng thời gian, dữ liệu có thể bị mất nếu crash xảy ra giữa hai lần snapshot.

🛠 Quy trình khôi phục:

  1. Khi Redis khởi động, nó tìm file dump.rdb trong thư mục dữ liệu.
  2. Nếu có, Redis load toàn bộ file này vào RAM.
  3. Redis bắt đầu hoạt động bình thường.

📍 Lưu ý:

  • RDB giúp khởi động nhanh hơn so với AOF vì chỉ cần load toàn bộ dữ liệu một lần.
  • Nếu RDB bị lỗi hoặc không có file, Redis sẽ khởi động mà không có dữ liệu.

🔹 2. Khi sử dụng AOF

📌 Cách hoạt động:

  • Redis đọc file appendonly.aofphát lại từng lệnh để khôi phục dữ liệu.
  • AOF lưu từng lệnh ghi dữ liệu nên khôi phục đầy đủ hơn RDB, nhưng chậm hơn do phải thực thi từng lệnh.

🛠 Quy trình khôi phục:

  1. Redis kiểm tra file appendonly.aof trong thư mục dữ liệu.
  2. Nếu có, Redis đọc từng lệnh trong file và thực thi lại tuần tự.
  3. Khi chạy hết file, Redis bắt đầu hoạt động bình thường.

📍 Lưu ý:

  • AOF giúp khôi phục đầy đủ dữ liệu, nhưng nếu file quá lớn thì khởi động sẽ chậm.
  • Redis có cơ chế AOF rewrite để giảm dung lượng file AOF.

🔹 3. Khi kết hợp cả RDB và AOF

📌 Cách hoạt động:

  • Mặc định, Redis ưu tiên AOF nếu cả hai đều có sẵn.
  • Nếu bật aof-use-rdb-preamble yes, Redis sẽ kết hợp cả RDB và AOF trong cùng một file AOF.
  • Khi khôi phục, Redis có thể load nhanh từ RDB, sau đó tiếp tục áp dụng các lệnh từ AOF để đảm bảo không mất dữ liệu.

🛠 Quy trình khôi phục:

  1. Redis kiểm tra file appendonly.aof.
  2. Nếu có preamble từ RDB, Redis sẽ tải dữ liệu từ snapshot RDB trước.
  3. Sau đó, Redis đọc và áp dụng các lệnh từ phần AOF để đảm bảo dữ liệu mới nhất.
  4. Nếu không có AOF, Redis fallback về RDB.

📍 Lưu ý:

  • Kết hợp cả hai giúp khởi động nhanh (RDB) và không mất dữ liệu (AOF).
  • Cần bật aof-use-rdb-preamble yes để sử dụng tối ưu nhất.

Tóm tắt so sánh

Cơ chế Tốc độ khởi động Mất dữ liệu nếu crash? Dung lượng file Khả năng chịu tải
RDB Nhanh Có thể mất vài giây Nhỏ Tốt
AOF Chậm hơn Gần như không mất Lớn hơn RDB Cao hơn
RDB + AOF Trung bình Gần như không mất Trung bình Cao

💡 Lời khuyên: Nếu bạn muốn khởi động nhanh + không mất dữ liệu, hãy kết hợp cả hai và bật aof-use-rdb-preamble yes! 🚀

7. Liệu rằng kết hợp cả 2 thì có đảm bảo dữ liệu không bị mất ?

Dù có bật cả RDB và AOF, một Redis single node vẫn không đảm bảo được:

1️⃣ Fault Tolerance (Khả năng chịu lỗi):

  • RDB chỉ giúp tạo snapshot theo chu kỳ, nên nếu node bất ngờ crash, bạn vẫn mất dữ liệu từ lần backup gần nhất.
  • AOF giúp ghi lại tất cả thay đổi, nhưng nếu node bị lỗi, bạn vẫn cần một bản sao khác để khôi phục.
  • Nếu server vật lý hỏng hoàn toàn (ổ cứng, nguồn…), cả RDB và AOF đều không giúp bạn khôi phục nhanh nếu không có bản sao trên một node khác.

2️⃣ Scalability (Mở rộng hệ thống):

  • Dù có AOF/RDB, một single node vẫn có giới hạn về RAM, CPU và IOPS.
  • Nếu lượng dữ liệu hoặc số lượng request quá lớn, Redis node vẫn bị quá tải, dẫn đến độ trễ cao hoặc sập dịch vụ.

👉 Giải pháp:

  • Để có Fault Tolerance, bạn cần Replication (Master/Replica) hoặc Redis Cluster để có ít nhất 1 bản sao dự phòng.
  • Để mở rộng (Scalability), Redis Cluster cho phép sharding dữ liệu trên nhiều node thay vì dồn hết vào một node duy nhất.

8. 📌 Kết Luận: Redis Persistence

Redis cung cấp hai cơ chế lưu trữ dữ liệu: RDBAOF, mỗi loại có ưu nhược điểm riêng:

RDB (Redis Database Backup)

  • Phù hợp với backup định kỳkhởi động nhanh.
  • Hiệu suất cao hơn, nhưng có nguy cơ mất dữ liệu giữa các lần snapshot.

AOF (Append-Only File)

  • Ghi lại mọi thay đổi, giúp giảm thiểu mất dữ liệu.
  • Tốn tài nguyên hơn RDB, cần cơ chế rewrite để tránh file quá lớn.

Kết hợp cả RDB & AOF

  • Tận dụng ưu điểm của cả hai, giúp đảm bảo an toàn dữ liệu mà không ảnh hưởng quá nhiều đến hiệu suất.

🚨 Nhưng Redis Single Node vẫn có hạn chế!
Dù dùng RDB hay AOF, một node đơn lẻ không đảm bảo Fault Tolerance và Scalability. Vì vậy, để tăng cường độ bền vững và mở rộng, bạn cần:

  • Replication (Master/Replica) để đảm bảo dự phòng.
  • Redis Cluster để chia tải và mở rộng hệ thống.
  • Cloud Solutions (AWS ElastiCache, GCP MemoryStore…) để tận dụng multi-zone và tự động failover.

💡 Kết luận: Redis Persistence giúp bảo vệ dữ liệu, nhưng để đảm bảo hệ thống ổn định và mở rộng tốt, cần kết hợp replication, clustering hoặc sử dụng Redis trên cloud. 🚀

comments powered by Disqus