Bối cảnh vấn đềTrong khi quản lý một instance Redis, việc thay đổi cấu hình trực tiếp (on the fly) bằng lệnh CONFIG SET là điều rất phổ biến. Ví dụ, bạn có thể tăng maxmemory hoặc thay đổi trạng thái appendonly mà không muốn khởi động lại dịch vụ. Để lưu các thay đổi này vĩnh viễn, cách làm tiêu chuẩn là chạy:
127.0.0.1:6379> CONFIG REWRITE
Tuy nhiên, bạn có thể gặp phải thông báo lỗi cụ thể sau:
(error) ERR The server is running without a config file
Điều này xảy ra do Redis được khởi động như một tiến trình đơn thuần mà không trỏ đến một tệp redis.conf vật lý nào. Nếu Redis không biết tệp cấu hình của nó nằm ở đâu, nó không thể ghi đè (rewrite) để lưu các thay đổi của bạn.
Tại sao lỗi này xảy raRedis có thể khởi động theo hai cách. Cách thứ nhất là chỉ định đường dẫn tệp cấu hình làm đối số. Cách thứ hai là chỉ chạy tệp thực thi (binary) đơn lẻ, điều này khiến Redis sử dụng các giá trị mặc định có sẵn. Nếu bạn sử dụng phương pháp thứ hai, Redis sẽ hoạt động hoàn toàn trên bộ nhớ đối với phần cấu hình. Khi bạn kích hoạt CONFIG REWRITE, engine sẽ tìm kiếm đường dẫn tệp mà nó đã được khởi tạo cùng. Do không tìm thấy, nó sẽ báo lỗi vì không có tệp đích nào để cập nhật.
Các tình huống phổ biến dẫn đến lỗi này:
- Khởi động server thủ công qua
redis-serverthay vìredis-server /path/to/redis.conf.- Docker containers trong đó lệnh chỉ làredis-servervà cấu hình không được ánh xạ (mapped) hoặc chỉ định.- Các tệp unit Systemd thiếu đối số tệp cấu hình trong chỉ thịExecStart.## Kiểm tra thiết lậpTrước khi áp dụng bản sửa lỗi, hãy xác nhận xem tiến trình Redis của bạn đã được khởi động như thế nào. Trên hệ thống Linux, hãy sử dụngpsđể kiểm tra tiến trình đang chạy:
ps aux | grep redis-server
Nếu kết quả trả về trông như thế này, bạn đã xác nhận được vấn đề:
redis 1234 0.1 0.5 150000 10000 ? Ssl 10:00 0:01 /usr/bin/redis-server *:6379
Lưu ý rằng không có đường dẫn tệp nào sau cổng (port). Một instance được cấu hình đúng sẽ trông như thế này:
redis 1234 0.1 0.5 150000 10000 ? Ssl 10:00 0:01 /usr/bin/redis-server /etc/redis/redis.conf
Giải pháp### Cách 1: Khởi động lại với tệp cấu hình (Khuyên dùng)Cách khắc phục hiệu quả nhất là đảm bảo Redis khởi động cùng với một tệp cấu hình. Nếu bạn chưa có, bạn có thể tải xuống tệp redis.conf mặc định cho phiên bản của mình từ kho lưu trữ GitHub chính thức của Redis.
- Tạo hoặc xác định vị trí tệp cấu hình của bạn (thường tại
/etc/redis/redis.conf).- Dừng instance Redis hiện tại:redis-cli shutdown- Khởi động Redis đồng thời trỏ rõ ràng đến tệp cấu hình:redis-server /etc/redis/redis.confNếu bạn đang sử dụng Systemd, hãy kiểm tra tệp service tại/etc/systemd/system/redis.servicehoặc/lib/systemd/system/redis.service. Đảm bảo dòngExecStartbao gồm đường dẫn:
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
Cách 2: Khắc phục trong môi trường DockerTrong Docker, lỗi này thường xảy ra do container khởi động với entrypoint mặc định. Để khắc phục, bạn phải gắn (mount) một tệp cấu hình cục bộ vào container và yêu cầu Redis sử dụng tệp đó trong tệp docker-compose.yml hoặc lệnh docker run.
Ví dụ đoạn mã docker-compose.yml:
services:
redis:
image: redis:latest
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
Cách 3: Giải pháp tạm thời không cần khởi động lạiNếu bạn không thể dừng hệ thống để khởi động lại Redis nhưng thực sự cần lưu cấu hình đang chạy hiện tại, bạn có thể tạo một tệp thủ công từ trạng thái hiện tại. Đây là một mẹo nhỏ nhưng hiệu quả trong các tình huống khẩn cấp.
- Kết nối với Redis và lấy tất cả các cấu hình hiện tại:
redis-cli CONFIG GET * > current_config.txt- Kết quả này không ở định dạngredis.conf(đó là các cặp key-value trên các dòng mới). Bạn sẽ cần định dạng lại thủ công hoặc qua một script thành định dạngkey value.- Sau khi đã tạo một tệpredis.confhợp lệ, bạn vẫn phải khởi động lại Redis với tệp đó để cho phépCONFIG REWRITEhoạt động trong tương lai. Không có cách nào để "gắn" một tệp cấu hình vào một tiến trình Redis đang chạy mà không khởi động lại.## Xác minhSau khi bạn đã khởi động lại Redis với đường dẫn tệp cấu hình, hãy xác minh xem bản sửa lỗi có hoạt động hay không: - Kết nối qua
redis-cli.- Thay đổi một tham số giả định:127.0.0.1:6379> CONFIG SET loglevel notice- Thực hiện ghi đè:127.0.0.1:6379> CONFIG REWRITENếu nó trả vềOK, việc sửa lỗi đã thành công. Bạn cũng có thể kiểm tra dấu thời gian (timestamp) của tệpredis.conftrên hệ thống tệp; nó sẽ phản ánh thời điểm bạn chạy lệnh.

