Redis Persistence
Redis (Remote Dictionary Server) là một NoSQL rất phổ biến hiện nay. Nó được sử dụng như là 1 database, caching hay 1 message broker.
Có 1 điểm khác biệt rõ ràng giữa Redis và Memcache đó chính là việc restore lại data khi gặp sự cố. Hãy thử tượng tượng điều gì xảy ra nếu toàn bộ dữ liệu quan trọng (mất nhiều thời gian compute mới có được) bị mất sạch sau 1 lần gặp sự cố mà không thể khôi phục được. Với Redis thì điều này đã được lường trước, và Redis persistence chính là nội dung mà chúng ta sẽ tìm hiểu trong bài này.
1. Persistance options
Phụ thuộc vào data và ứng dụng chúng ta có thể lựa chọn các persistence options sau:
- Redis database (RDB): Liên tục sau 1 khoảng thời gian được đặt trước sẽ thực hiện việc lưu data vào disk
- Append only file (AOF): lưu lại vào disk mọi thao tác write.
- RDB + AOF: Kết hợp cả 2 options trên. Nhưng khi Redis restart thì AOF sẽ được ưu tiên sử dụng để init data.
- No persistence: Nếu ứng dụng của bạn không cần backup data
2. Cách hoạt động
Sau đây chúng ta sẽ cùng đi tìm hiểu về Redis database (RDB) và Append only file (AOF).
a. Redis database (RDB)
Có 5 cách để tạo 1 bản snapshot backup vào disk:
- Dùng lệnh BGSAVE (Background SAVE): Redis sẽ dùng fork để tạo những process con để lưu data vào disk. còn main process vẫn sẽ tiếp tục làm việc.
- Dùng lệnh SAVE: Redis sẽ dừng toàn bộ process cho đến khi việc lưu data vào disk hoàn thành.
- Dùng save lines (save time count): Trong vòng time seconds nếu có count bản ghi (tính từ lần lưu thành công cuối cùng) thì Redis sẽ dùng lệnh BGSAVE để lưu data vào disk
- Khi gặp lệnh SHUTDOWN hoặc TERM signal: Redis sẽ lưu data vào disk và sẽ không nhận thêm bất kỳ 1 lệnh nào nữa
- Khi gặp lệnh SYNC khi sao chép data giữa các server: Redis sẽ dùng lệnh BGSAVE để lưu data vào disk
Ưu điểm:
- Là những file rất nhỏ được snapshot trong 1 khoảng thời gian nên việc backups rất dễ dàng
- Rất tốt cho việc khôi phục dữ liệu bị lỗi vì là file nhỏ có thể dễ dàng transfer đến data centers khác.
- Redis có hiệu năng tối đa vì nó tạo ra 1 process con chạy song song để lưu data mà không gây ảnh hưởng đến main process
- Với data lớn RDB sẽ restart nhanh hơn AOF
Nhược điểm:
- Dữ liệu có thể bị mất từ lần lưu thành công cuối cùng đến khi xảy ra sự cố.
- Tạo 1 process con có thể mất nhiều thời gian nếu data lớn
b. Append only file (AOF)
Có 3 options để sync data vào disk:
- always: Khi có bất kỳ 1 lệnh write vào Redis. sẽ thực hiện việc lưu data vào disk. Dữ liệu gần như không bị mất, nhưng tốc độ sẽ bị giảm đi đáng kể phụ thuộc vào tốc độ IO của disk
- everysec: Mỗi giây sẽ thực hiện việc lưu data vào disk. Nếu xảy ra sự cố thì dữ liệu mất nhiều nhất trong 1s, hiệu suất của Redis gần như không bị giảm đi.
- no: Redis sẽ không thực hiện việc lưu data vào disk mà nó sẽ phụ thuộc vào operating system. Hiệu suất trong trường hợp này sẽ không bị ảnh hưởng, tuy nhiên dữ liệu có thể bị mất mà k thể kiểm soát được. Ngoài ra nếu IO của disk quá chậm đây thực sự là thảm họa.
Ưu điểm:
- AOF giúp dataset bền vững hơn RBD.
- Redis ghi log AOF bằng cách thêm vào cuối file sẵn có, nên seek process trên file có sẵn là không cần thiết
- Redis tự động ghi lại file AOF trong 1 tiến trình nền khi dung lượng file 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 mới được tạo ra với tối thiểu operation phục vụ cho việc tạo dataset hiện tại. Và khi file mới đã sẵn sàng, Redis sẽ chuyển sang làm việc với file mới.
- Nội dung file log dễ hiểu, dễ đọc
Nhược điểm:
- AOF files thường lớn hơn RDB files với cùng dataset
- AOF có thể chậm hơn RDB tùy theo cách thiết lập khoảng thời gian cho việc sao lưu vào disk. Tuy nhiên, với everysec option vẫn có thể đạt được hiệu năng gần như RDB
3. Tổng kết
Sau khi tìm hiểu về Redis persistance chúng ta rút ra được:
- Nếu muốn data toàn vẹn thì bạn có thể dùng kết hợp cả 2 options
- Nếu việc mất dữ liệu trong thời gian vài phút là chấp nhận được với ứng dụng của bạn thì việc chọn RDB là một nựa chọn tốt
- Việc chỉ sử dụng AOF không được khuyến khích. Thỉnh thoảng RDB snapshot sẽ tốt hơn rất nhiều đê backup data