[입 개발] Redis 서버가 MISCONF Redis is configured to save RDB snapshots 에러를 내며 동작하지 않아요?

가끔식 Redis를 사용하는 분들에게 다음과 같은 질문을 받을 때가 있습니다. “갑자기 Redis 가 동작을 하지 않고 죽은거 같아요? ” 그럴 때, 실제로 Redis가 장애가 났을 때도, 나지 않았을 때도 있지만, 주로 다음과 같은 에러를 낼 때가 많습니다. “-

MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

Redis 가 언제나 에러가 없고 stable 하면 좋을 텐데, 성능을 떨어뜨리는 몇가지 요소가 있습니다. 그 중에서 가장 큰 원인 중의 하나가 persistent 를 위해서 BGSAVE로 rdb를 만들어내는 것입니다. 그런데 기본적으로 이 BGSAVE가 실패하게 되면 Redis는 설정에 따라서 Write 커맨드를 전부 거부 해버리게 됩니다.

redis.c 를 보시면 processCommand에 다음과 같은 코드가 있습니다.


if (server.stop_writes_on_bgsave_err &&
server.saveparamslen > 0
&& server.lastbgsave_status == REDIS_ERR &&
c->cmd->flags & REDIS_CMD_WRITE)
 {
flagTransaction(c);
addReply(c, shared.bgsaveerr);
return REDIS_OK;
 }

여기서 보면 stop_writes_on_bgsave_err 이 true 이면 RDB 생성에 실패했을 때 Write는 전부 거부하는 것을 볼 수 있습니다. 그렇다면, 이 것을 어떻게 해결해야 할까요? 이부분은 Redis를 어떤 용도로 쓰고 있는가에 달려있습니다. 캐시용도로만 쓰시는 곳은, 그냥 RDB를 끄거나 config set stop-writes-on-bgsave-error no 를 통해서 해당 설정을 꺼두면 됩니다. 

RDB 저장에 실패하는 이유는 다양해서 뭐라고 말씀드리긴 힘들지만, 간혹 vm_overcommit_memory 정책이 문제일 수도 있고,  디스크 이슈일 수도 있습니다. 그렇지만, RDB가 꼭 필요하지 않지만 이런 이유로 고생하시는 분들에게는 도움이 되면 좋겠습니다.