Chuyển tới nội dung chính

Redis

Trang này tập hợp những sự cố Redis được báo nhiều nhất trên FPT Database Engine, kèm dấu hiệu nhận biết và các bước xử lý. Dùng để tự chẩn đoán, hoặc để thu thập thông tin mà FPT Support cần.

Mỗi mục theo cùng một bố cục: dấu hiệu, nguyên nhân, ảnh hưởng, rồi cách xử lý.

Các sự cố đã biết

Redis đóng kết nối bất ngờ

Dấu hiệu

Ứng dụng client kết nối tới Redis trả về:

Redis error: Server closed the connection

Kết nối kết thúc giữa chừng. Ứng dụng sau đó timeout hoặc liên tục kết nối lại.

Nguyên nhân

Redis server đã đóng kết nối từ phía nó. Các nguyên nhân thường gặp:

  • Mạng giữa ứng dụng và Redis không ổn định.
  • Redis cạn tài nguyên, dù là CPU, bộ nhớ hay số lượng kết nối.
  • Cấu hình kết nối trong ứng dụng chưa đúng.
  • Một firewall hoặc thiết bị mạng như NAT gateway hay Load Balancer đã ngắt kết nối.

Ảnh hưởng

  • Các request phụ thuộc Redis cho cache, session hoặc dữ liệu hàng đợi bị lỗi.
  • Độ trễ ứng dụng tăng do retry và kết nối lại.
  • Dữ liệu chưa kịp ghi vào Redis bị mất.
  • Hiệu năng chung giảm khi ứng dụng phải quay về database hoặc chạy lại logic.
  • Lỗi có thể lan rộng ở những nơi Redis là thành phần quan trọng, ví dụ session store hoặc message broker.

Cách xử lý

Kiểm tra kết nối mạng. Xác nhận ứng dụng tới được Redis:

redis-cli -h YOUR_REDIS_HOST -p YOUR_REDIS_PORT -a YOUR_REDIS_PASSWORD ping

Nếu phản hồi không phải PONG, vấn đề nằm ở kết nối mạng hoặc cấu hình truy cập chứ không phải ở client.

Kiểm tra hiệu năng Redis. Xem dashboard giám sát, theo dõi mức dùng CPU và bộ nhớ, số lượng kết nối và thời gian phản hồi. Xem Giám sát database với FMON.

Kiểm tra cấu hình client. Tên tham số khác nhau giữa các Redis client, nhưng hãy xác nhận đủ bốn hành vi sau đã được cấu hình:

  • Kiểm tra sức khỏe kết nối, để phát hiện kết nối hỏng và thiết lập lại. Trong redis-py là health_check_interval.
  • TCP keepalive, để kết nối không bị đóng do timeout của mạng hoặc thiết bị trung gian. Trong redis-py là socket_keepalive.
  • Retry khi timeout, để thử lại request sau khi timeout. Trong redis-py là retry_on_timeout.
  • Retry khi lỗi, để thử lại sau một lỗi tạm thời như kết nối bị rớt hoặc bị server đóng. Trong redis-py là retry_on_error.

Tra tài liệu của chính client bạn dùng để biết tên tham số chính xác:

Kiểm tra firewall và thiết bị mạng. Nếu có firewall hoặc thiết bị trung gian nằm giữa Subnet của ứng dụng và Subnet của database, hãy xem log của thiết bị đó để tìm các kết nối bị chặn hoặc bị ngắt, xác nhận không có giới hạn timeout hay số kết nối bất thường, và theo dõi traffic xem có bất ổn không.

Xem thêm tài liệu về kết nối Redis.

mẹo

Dùng connection pooling kèm keepalive sẽ ngăn được phần lớn các lần rớt kết nối này. Kết hợp với retry ở tầng ứng dụng và cảnh báo giám sát để một lỗi tạm thời không bao giờ đến tay người dùng.

Bước tiếp theo