#HọcTừSaiLầm - Mình vừa mắc phải một sai lầm mà mãi đến mấy tháng sau mới phát hiện ra. Vì vậy sai lầm này đã phải trả giá bằng tiền bạc (cứ scale server redis mà vẫn bị hết memory), Web App thì bị downtime vài lần, hơi muộn nhưng đã ngộ ra được.
Cụ thể là mình có dùng redis làm session_store của Rails:
Rails.application.config.session_store :redis_store, servers: ["#{ENV['REDIS_URL']}/1/sessions"], expires_in: 60.minutes
Nhưng khi đó lại mình quên mất vụ expires_in
nên cuối cùng Rails set default là unlimited. Session Keys cứ thế lưu trữ dài hạn trên Redis, và cứ âm thầm ngốn hết Ram của Instance Redis, mình đã thử nâng lần lượt 1GB lên 2GB, rồi 4GB và 8GB nhưng sau một thời gian vẫn cứ ngốn sạch trơn Ram, trong khi kiểm tra số lượng Redis keys mà App dùng thì chỉ khoảng 100k. Cuối cùng, vô tình kiểm tra ở database 1 (Redis đánh số database, mặc định là 0) thì choáng, số lượng lên tới hơn 50 triệu keys đang dùng làm sessions.
Giải quyết nhanh bằng cách flushdb để xóa toàn bộ data từ một database cụ thể. (May là mình đã tách riêng sessions ra một database khác nên flushdb không thương tiếc, users đang đăng nhập sẽ bị đá ra khỏi hệ thống.)
redis-cli
SELECT dbnum
flushdb
Lệnh flushall để xóa toàn bộ databases của Redis
Học được từ sai lầm này:
-
Rails không set expires mặc định cho session_store nhé, liệu mà nhớ thêm vào.
-
Hiểu hơn về Redis - học được vài chiêu Optimize Memory Usage của Redis (Tham khảo Redis Memory Optimization): Sử dụng hash-zipmap - use hashes when possible thay cho cặp key-value đơn lẻ (Việc dùng small hashes rất tối ưu cho việc sử dụng Memory nhưng đánh đổi bằng CPU Usage sẽ cao hơn).
-
Redis memory footprint:
An empty instance uses ~ 1MB of memory.
1 Million small Keys -> String Value pairs use ~ 100MB of memory.
1 Million Keys -> Hash value, representing an object with 5 fields, use ~ 200 MB of memory.
-
Biết được các công nghệ có thể dùng để thay thế redis trong tương lại: Kyoto Tycoon, AeroSpike.
-
Khả năng Monitoring Server của mình còn quá kém, thiếu sự nhạy cảm và chịu khó của một SysAdmin.