Cơ chế lưu data redis từ ram sang ổ cứng

Cơ chế lưu data redis từ ram sang ổ cứng.

(Xem lại: Hướng dẫn cài đặt, lập trình với Redis Server)

  • Sự khác biết lớn nhất nhất giữa redis với database đó là data của Redis được lưu ở Ram (in-memory). Do đó tốc độ truy cập (đọc/ghi) của Redis nhanh hơn hẳn do với database.
  • Redis khá tin cậy, kể cả khi bạn khởi động lại máy tính thì dữ liệu trong redis vẫn còn vì nó có cơ chế sao lưu data từ RAM vào ổ cứng.
    Trong bài này mình sẽ trình bày các cơ chế lưu data Redis từ RAM sang ổ cứng.

1. Các cơ chế lưu data redis từ ram sang ổ cứng.

Redis cung cấp các lựa chọn sau để thực hiện sao lưu data từ in-memory sang ổ cứng:

  • RDB (Redis Database): Redis thực hiện lưu data hiện tại trong in-memory thành snapshots. Hành động sao lưu này lặp đi lặp lại với khoảng thời gian cố định. Ví dụ cứ 1 phút thì lưu lại data từ in-memory sang ổ cứng. Khi redis start thì nó sẽ đọc data từ snapshots vào in-memory.
  • AOF (Append Only File): Redis thực hiện ghi lại toàn bộ các lệnh ghi (write operation) nhận được vào file (gọi là AOF file). Khi Redis được start thì nó sẽ chạy lại tất cả các lệnh ghi từ AOF file để lấy lại data mới nhất.
  • No persistence: Với cơ chế này data chỉ lưu ở in-memory chứ ko được sao lưu vào ổ cứng.
  • RDB + AOF: Kết hợp 2 phương pháp RDB và AOF. Trong trường hợp này, khi Redis khởi động lại thì AOF file sẽ được sử dụng để restore lại data mới nhất.

2. Ưu nhược điểm của cơ chế RDB

– Ưu điểm:

  • RDB file rất nhẹ và dễ dàng cho backups.
  • RDB cũng rất dễ dàng cho việc restore, khôi phục lại dữ liệu. Bạn chỉ cần copy RDB file tới server cần restore là được.
  • RDB cho phép Redis khởi động nhanh hơn với lượng data lớn khi so sánh với AOF

– Nhược điểm:

  • Không tối ưu cho việc đảm bảo dữ liệu. Dữ liệu có thể bị mất nếu Redis chưa kịp ghi ra file RDB mà bị xảy ra sự cố (ví dụ mất điện). Ta có thể tăng tần suất ghi file RDB nhưng khả năng mất data vẫn có thể xảy ra.
  • RDB cần fork() thường xuyên (tức là ghi dữ liệu vào ổ cứng thường xuyên). Hành động fork() có thể tốn 1 ít thời gian nếu data lớn và có thể redis sẽ ngừng phục vụ trong thời gian đó.

3. Ưu nhược điểm của cơ chế AOF

– Ưu điểm:

  • AOF tin cậy hơn RDB, nó thực hiện fsync() để lưu data từ in-memory vào ổ đĩa. Việc fsync() có thể thực hiện trên mỗi query hoặc thực hiện mỗi giây. (fsync được thực hiện bằng cách sử dụng một luồng nền và luồng chính sẽ cố gắng thực hiện ghi khi không có fsync đang diễn ra).
  • File AOF là một file chỉ append thêm. Ngay cả khi file thúc bằng một lệnh được viết một nửa vì lý do nào đó (đĩa đầy hoặc các lý do khác), công cụ redis-check-aof vẫn có thể khắc phục nó một cách dễ dàng.
  • Redis có thể tự động viết lại AOF trong nền khi nó quá lớn. Việc ghi lại hoàn toàn an toàn vì trong khi Redis tiếp tục thêm vào tệp cũ, một tệp hoàn toàn mới được tạo ra với tập hợp các thao tác tối thiểu cần thiết để tạo tập dữ liệu hiện tại. Và khi tệp thứ hai này đã sẵn sàng, Redis chuyển hai tệp và bắt đầu thêm vào một cái mới.
  • AOF chứa nhật ký của tất cả các hoạt động lần lượt ở định dạng dễ hiểu và phân tích cú pháp. Bạn thậm chí có thể dễ dàng xuất tệp AOF. Ví dụ: ngay cả khi bạn đã vô tình xóa mọi thứ bằng lệnh FLUSHALL. Miễn là không có ghi lại nhật ký nào được thực hiện trong thời gian chờ đợi, bạn vẫn có thể lưu tập dữ liệu của mình chỉ bằng cách dừng máy chủ, xóa lệnh mới nhất và khởi động lại Redis lần nữa.

– Nhược điểm:

  • Các tệp AOF thường lớn hơn các tệp RDB tương đương cho cùng một tập dữ liệu.
  • AOF có thể chậm hơn RDB tùy thuộc vào chính sách fsync. Nói chung với fsync được đặt thành từng giây, hiệu suất vẫn rất cao. Trường hợp fsync bị vô hiệu hóa, nó sẽ nhanh như RDB ngay cả khi tải cao.

References: https://redis.io/topics/persistence

stackjava.com