[Backend Masterclass] Thực chiến: 2 Cách thiết lập Redis Maxmemory và những cú lừa cần tránh
Chào anh em, học lý thuyết suông về OOM (Out Of Memory) ở bài trước là đủ rồi. Hôm nay chúng ta sẽ bắt tay vào "thực chiến": Cầm cờ-lê mỏ lết lên và siết lại thông số maxmemory cho con Redis của anh em.
Có 2 cách để thiết lập thông số này: Một cách dùng để setup từ đầu (cố định), và một cách dùng để "cấp cứu" hệ thống ngay trên Production mà không cần khởi động lại.
Dưới đây là hướng dẫn chi tiết chuẩn kĩ sư hệ thống.
Cách 1: Thiết lập vĩnh viễn qua file redis.conf (Chuẩn bài)
Đây là cách chính thống nhất. Mọi thay đổi trong file này sẽ tồn tại mãi mãi, kể cả khi server khởi động lại.
Bước 1: Tìm file cấu hình
Thường thì file này nằm ở /etc/redis/redis.conf (đối với Ubuntu/Debian) hoặc nằm ngay trong thư mục cài đặt nếu anh em tự build từ source.
Bước 2: Mở file và tìm dòng maxmemory
Dùng nano hoặc vim:
sudo vim /etc/redis/redis.conf
Tìm đến dòng có chữ # maxmemory <bytes> (thường bị comment lại bằng dấu #).
Bước 3: Bỏ comment và gán giá trị
Anh em xóa dấu # đi và điền dung lượng vào. Redis rất thông minh, nó hỗ trợ các hậu tố như mb, gb (không phân biệt chữ hoa chữ thường).
# Thiết lập giới hạn là 4 Gigabytes
maxmemory 4gb
# Hoặc nếu anh em thích khổ dâm gõ theo byte:
# maxmemory 4294967296
# NHỚ ĐỪNG QUÊN CẤU HÌNH EVICTION POLICY Ở NGAY BÊN DƯỚI NHÉ:
maxmemory-policy allkeys-lfu
Bước 4: Khởi động lại Redis để ăn config
sudo systemctl restart redis-server
Cách 2: Thiết lập "Nóng" qua redis-cli (Cấp cứu Production)
Giả sử hệ thống đang chạy Flash Sale, RAM bỗng nhiên tăng vọt sắp chạm nóc. Anh em không thể nào mở file config ra sửa rồi gõ restart được. Khởi động lại Redis lúc này đồng nghĩa với việc vứt đi toàn bộ Cache hiện tại, MySQL phía sau sẽ hứng trọn traffic và... sập luôn!
Lúc này, chúng ta phải dùng tính năng Hot-Swap (Sửa nóng) của Redis.
Bước 1: Chui vào CLI của Redis
redis-cli
(Nếu có mật khẩu thì gõ: redis-cli -a matkhau_cua_ban)
Bước 2: Ép thông số mới ngay lập tức (Không cần restart)
Giả sử bạn muốn tăng RAM cho Redis lên 6GB ngay lập tức:
127.0.0.1:6379> CONFIG SET maxmemory 6G
OK
Bùm! Redis đã nhận giới hạn mới. Không tốn một mili-giây downtime nào.
Bước 3: Lưu lại vĩnh viễn (CỰC KÌ QUAN TRỌNG)
Nhiều anh em Junior gõ xong bước 2, thấy báo OK là xách balo đi về.
Nhưng lệnh CONFIG SET chỉ lưu trên RAM. Đêm đó server mất điện khởi động lại, Redis sẽ đọc lại file redis.conf cũ và mất sạch cấu hình 6GB vừa set.
Phải gõ thêm một lệnh chốt hạ này để Redis tự động ghi đè thông số mới ngược trở lại file redis.conf:
127.0.0.1:6379> CONFIG REWRITE
OK
Kiểm tra lại xem cấu hình đã "ăn" chưa?
Sau khi thiết lập bằng bất kì cách nào, anh em đều nên check lại cho chắc ăn. Mở redis-cli lên và gõ:
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "6442450944" # Trả về kết quả bằng Bytes (6GB)
Hoặc xịn hơn, xem bức tranh toàn cảnh về RAM hiện tại của Redis bằng lệnh:
127.0.0.1:6379> INFO memory
(Hãy chú ý dòng used_memory_human để xem RAM đang dùng thực tế, và maxmemory_human để xem giới hạn anh em vừa set).
Công thức tính toán dung lượng chuẩn (Nhắc lại bài cũ)
Tuyệt đối không nhắm mắt set bừa. Anh em hãy áp dụng công thức sau để server không bị OOM Killer trảm:
- Nguyên tắc:
Maxmemory = Tổng RAM vật lý * 60%(hoặc tối đa 70%). - Ví dụ: Server có 16GB RAM.
- Trừ đi 2GB cho Hệ điều hành (Linux).
- Trừ đi khoảng 4GB không gian đệm để Redis làm trò Copy-on-Write khi lưu file RDB (
BGSAVE). - -> Con số lý tưởng để set cho
maxmemorylà10gb.
Thiết lập chuẩn chỉnh như thế này, anh em cứ kê cao gối mà ngủ, mặc kệ traffic ngày mai có x10 đi chăng nữa.
Hôm nay thực hành nhẹ nhàng vậy thôi. Anh em đã config thành công con Redis của mình chưa? Có gặp lỗi gì trong quá trình vọc vạch không thì ném log xuống comment nhé, mình bắt bệnh cho!
All Rights Reserved