EQVPS

Cách cài Redis trên VPS: giới hạn bộ nhớ, lưu xuống đĩa và mật khẩu không bị mất

Cài Redis trên Ubuntu 24.04, giới hạn bộ nhớ để nó không chiếm cả máy chủ, bật tệp AOF mà không xóa dữ liệu và đặt mật khẩu vẫn còn sau khi khởi động lại. Hai trong số các bước này có bẫy mà chính chúng tôi đã mắc trên máy chủ thử nghiệm.

Redis giữ dữ liệu trong bộ nhớ và trả lời trong khoảng một mili giây, vì vậy nó đứng sau rất nhiều ứng dụng với vai trò bộ nhớ đệm, hàng đợi hay kho phiên. Cài đặt chỉ là một lệnh. Công việc thật nằm ở các giá trị mặc định: không giới hạn bộ nhớ, ảnh chụp có thể mất các lần ghi gần nhất, và hai lỗi dễ mắc có thể âm thầm xóa dữ liệu hoặc tắt mật khẩu của bạn. Hướng dẫn này đi qua tất cả trên Ubuntu 24.04. Chúng tôi đã chạy từng bước trên image của mình; các con số lấy từ một máy chủ Micro (2 vCPU, 2 GB).

Bạn cần một người dùng có sudo. Hướng dẫn thiết lập Ubuntu sẽ tạo một người.

1. Cài đặt

sudo apt update
sudo apt install -y redis-server
redis-server --version
redis-cli ping

Quá trình cài mất 13 giây và cho chúng tôi Redis 7.0.15. Nó khởi động ngay và mỗi lần bật máy, trả lời PONG và chỉ lắng nghe trên chính máy chủ: 127.0.0.1:6379 và [::1]:6379, với protected-mode yes. Khi chưa có dữ liệu, nó dùng 13,5 MB RAM.

Nhật ký đã có sẵn một cảnh báo:

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.

Redis lưu xuống đĩa từ một bản sao của chính nó được tạo bằng fork, và với thiết lập mặc định của nhân, fork này có thể thất bại khi bộ nhớ eo hẹp. Sửa một lần:

echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/90-redis.conf
sudo sysctl -p /etc/sysctl.d/90-redis.conf
sudo systemctl restart redis-server

Sau khi khởi động lại, cảnh báo biến mất.

2. Giới hạn bộ nhớ

Mặc định maxmemory là 0, tức không giới hạn, và chính sách là noeviction. Redis sẽ lấy RAM cho đến khi máy chủ hết. Đặt mức trần và quyết định chuyện gì xảy ra khi chạm tới:

redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE

Chúng tôi thử cả hai chính sách với giới hạn 64 MB và 400.000 lần ghi:

  • noeviction (mặc định): bộ nhớ dừng ở 63 MB và các lần ghi mới thất bại với OOM command not allowed when used memory > 'maxmemory'. Phù hợp cho hàng đợi hoặc bất cứ thứ gì bạn không thể mất.
  • allkeys-lru: Redis loại bỏ các khóa lâu nhất chưa được dùng, tổng cộng 48.606 khóa, và mọi lần ghi đều thành công. Phù hợp cho bộ nhớ đệm.

CONFIG REWRITE lưu các thiết lập đang chạy vào /etc/redis/redis.conf để chúng còn sau khi khởi động lại. Nó còn thêm một dòng bạn cần biết trước bước 4.

3. Chọn cách lưu xuống đĩa

Mặc định, Redis ghi ảnh chụp (/var/lib/redis/dump.rdb) sau 1 thay đổi trong một giờ, 100 trong năm phút hoặc 10.000 trong một phút. Chúng tôi thử ba cách dừng nó:

Redis dừng thế nàoChỉ ảnh chụp (mặc định)Có tệp AOF
systemctl restartKhông mất gì: lưu khi tắtKhông mất gì
Bị giết bằng kill -9Khóa ghi sau ảnh chụp cuối đã mấtKhóa ghi 2 giây trước vẫn còn

Cả hai lần, systemd đều tự khởi động lại Redis trong vài giây.

Nếu Redis giữ dữ liệu bạn sẽ tiếc khi mất, hãy bật tệp AOF (append-only file). Nó ghi lại mọi thao tác ghi và đẩy xuống đĩa mỗi giây một lần. Hãy làm trên máy chủ đang chạy, đừng sửa tệp:

redis-cli CONFIG SET appendonly yes
redis-cli CONFIG REWRITE
redis-cli INFO persistence | grep aof_

Lúc đầu chúng tôi thử cách kia, và mất dữ liệu. Chúng tôi đổi appendonly no thành appendonly yes trong redis.conf rồi khởi động lại. Redis lên với một AOF rỗng và không tải gì từ ảnh chụp, nên mọi khóa có sẵn đều biến mất. Đến lần tắt sau, nó còn ghi nội dung mới, không có các khóa cũ, đè lên dump.rdb. CONFIG SET tránh được điều này: Redis ghi AOF trước từ dữ liệu trong bộ nhớ. Sau khi khởi động lại, mọi khóa của chúng tôi vẫn còn.

Nếu Redis chỉ là bộ nhớ đệm có thể khởi động trống, hãy làm ngược lại và tắt việc lưu bằng redis-cli CONFIG SET save "".

4. Đặt mật khẩu

Đây là cái bẫy thứ hai. Sau bất kỳ CONFIG REWRITE nào, Redis 7 thêm dòng này vào cuối redis.conf:

user default on nopass ~* &* +@all

Nó có nghĩa là "người dùng mặc định không cần mật khẩu". Sau đó chúng tôi thêm requirepass ở phía trên trong tệp rồi khởi động lại. Redis vẫn trả lời PONG mà không cần mật khẩu, vì dòng user được ưu tiên. Hãy đặt mật khẩu qua chính Redis:

REDIS_PASS=$(openssl rand -hex 24)
echo "$REDIS_PASS"
redis-cli CONFIG SET requirepass "$REDIS_PASS"
REDISCLI_AUTH="$REDIS_PASS" redis-cli CONFIG REWRITE

Lưu mật khẩu ở nơi an toàn. Giờ Redis giữ nó dưới dạng hàm băm SHA-256 trong cùng dòng user default. Sau khi khởi động lại, redis-cli ping trả về NOAUTH Authentication required. và chỉ mật khẩu mới dùng được. Truyền nó cho redis-cli qua biến REDISCLI_AUTH. Với -a, nó hiện trong danh sách tiến trình và redis-cli sẽ cảnh báo. Trong ứng dụng, hãy đặt nó vào địa chỉ Redis: redis://:PASSWORD@127.0.0.1:6379/0.

5. Truy cập từ máy tính của bạn

Để Redis ở 127.0.0.1 và dùng đường hầm SSH. Dùng cổng SSH của máy chủ, trên các gói NAT đó là cổng riêng của bạn:

ssh -N -L 6380:127.0.0.1:6379 deploy@YOUR_SERVER_IP -p 22

Khi đường hầm đang chạy, redis-cli -p 6380 và các công cụ trên máy tính của bạn nói chuyện với Redis trên máy chủ. Không có gì mới được mở ra internet. Với hướng dẫn khóa SSH, đường hầm đăng nhập không cần mật khẩu.

Nhanh đến mức nào

Trên máy chủ thử nghiệm Micro, redis-benchmark với 50 client cho kết quả:

Bài thửYêu cầu mỗi giâyĐộ trễ trung vị
SET30.3031,0 ms
GET35.1490,9 ms
SET, 16 lệnh mỗi lượt đi về272.1092,4 ms
GET, 16 lệnh mỗi lượt đi về414.9381,3 ms

Với bộ nhớ đệm hay hàng đợi công việc của một ứng dụng web, như vậy là dư rất nhiều. Tốc độ thêm đến từ việc gửi lệnh theo lô (pipelining).

Chọn gói nào

Redis cần RAM cho dữ liệu của bạn và gần như không cần gì khác. Nano (2 vCPU, 1 GB, $3/tháng) chạy Redis cạnh một ứng dụng nhỏ với maxmemory 256mb. Micro (2 GB, $5/tháng) để chỗ cho bộ nhớ đệm lớn hơn cùng ứng dụng. Nếu thứ khác cần kết nối thẳng vào Redis, hãy dùng IPv4 riêng (từ Nano-IP giá $8/tháng) và chỉ cho phép địa chỉ đó trong tường lửa. Tất cả các gói có trên trang VPS, thanh toán bằng USDT, USDC hoặc ETH trên mạng Base, Ethereum hoặc Polygon.

FAQ

Redis cần bao nhiêu RAM?

Bản thân Redis rất nhỏ: 13,5 MB ngay sau khi cài trên máy chủ của chúng tôi. Thứ nó cần là chỗ cho dữ liệu của bạn, vì dữ liệu nằm trong bộ nhớ. Đặt maxmemory bằng mức máy chủ có thể nhường, ví dụ 256 MB trên máy chủ 1 GB, và chọn điều gì xảy ra khi đầy.

Redis hay Valkey?

Valkey là bản fork của Redis tách ra từ Redis 7.2 và dùng cùng giao thức, nên hầu hết client chạy được với cả hai. Ubuntu 24.04 chỉ có Redis 7.0.15. Debian 13 có cả Redis 8.0 và Valkey 8.1, còn Debian 12 có Valkey 8.0 từ backports. Các bước trong hướng dẫn này áp dụng cho cả hai.

Vì sao Redis mất dữ liệu sau sự cố?

Mặc định, Redis lưu ảnh chụp xuống đĩa vài phút một lần, tùy số khóa đã thay đổi. Khi chúng tôi giết tiến trình, khóa ghi sau ảnh chụp cuối cùng đã biến mất. Hãy bật tệp AOF ghi mỗi giây, khi đó một sự cố chỉ làm bạn mất tối đa khoảng một giây dữ liệu ghi.

Tôi đã thêm requirepass vào redis.conf, sao Redis vẫn nhận lệnh không cần mật khẩu?

Có lẽ vì lệnh CONFIG REWRITE đã từng chạy. Trên Redis 7, nó thêm dòng user default on nopass ~* &* +@all vào cuối redis.conf, và dòng này vô hiệu hóa requirepass viết ở trên. Hãy đặt mật khẩu bằng CONFIG SET requirepass rồi chạy CONFIG REWRITE, Redis sẽ lưu nó vào chính dòng đó.

Tôi có thể mở cổng 6379 ra internet không?

Đừng mở. Cổng Redis mở bị quét liên tục và là lối vào máy chủ phổ biến. Hãy kết nối Redis từ máy tính của bạn qua đường hầm SSH, hoặc giữ nó trên cùng máy chủ với ứng dụng sử dụng nó.

Bình luận

Chưa có bình luận nào. Hãy là người đầu tiên.

Để lại bình luận

Bình luận được kiểm duyệt trước khi hiển thị.