문제 정의
사실 수집
UnhandledPromiseRejectionWarning: ReplyError: MOVED
Redis error: ClusterAllFailedError: Failed to refresh slots cache.
원인 추론
클러스터 모드에서는 Redis가 데이터를 여러 노드에 분산해서 저장하는데 단일 노드로 연결하면 특정 키가 다른 노드에 있을 때 MOVED 에러가 발생한다고 한다.
ClusterAllFailedError는 클러스터와 통신하는 과정에서 모든 노드와의 연결 시도가 실패했을 때 발생한다. → 단일 노드의 포트로 하나의 클라이언트만 생성해서 생기는 문제.
해결 방안
해결
static createPubSubClient(config) {
const pubsubClient = new Redis({
host: 도메인,
port: 포트, // Pub/Sub 전용 포트
password: 레디스 비밀번호,
retryStrategy: (times) => {
const delay = Math.min(times * 50, 2000);
return delay;
}
});
return pubsubClient;
}
services:
# ... 기존 클러스터 노드들 ...
redis-pubsub:
image: redis:latest
container_name: redis-pubsub
command: >
redis-server
--port 포트
--requirepass 비밀번호
--bind 0.0.0.0
--protected-mode no
--cluster-announce-ip 도메인
ports:
- 포트
volumes:
- ./redis-pubsub-data:/data
networks:
- redis-net