Redis RDB 파일 저장 설정(stop-writes-on-bgsave-error)

에러 문구

Redis 서버 운용시 아래와 같은 에러가 발생하였다.

(error) MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.


원인

Redis는 특정 시점에 데이터를 디스크로 저장하여 파일로 보관이 가능하다. 이러한 기능으로 장애 발생시 복구가 가능하고, 파일로 저장하는 경우 RDB 파일로 저장하게 된다.

Redis sanpshot

만일 Redis에서 RDB 파일 저장 실패할 경우, Redis의 데이터 쓰기가 모두 불가능하게 되고, Redis를 이용하고 있는 서비스들은 심각한 장애가 발생하게 된다. 이 때 상단의 에러가 발생하게 되는 것이다.

Redis snapshot fail


해결책

Redis의 설정 중 stop-writes-on-bgsave-error라는 파라미터가 있다.

RDB 파일 저장이 실패했을 경우 데이터를 받아들일지 말지 정하는 파라미터이다. RDB 파일 저장이 되지 않으면 관리자에게 문제 상황을 빨리 알리기 위해 기본값은 yes 로 데이터를 받아들이지 않는 것이다.

고로, 해당 에러를 해결하기 위해선 stop-writes-on-bgsave-error의 설정을 바꿔주거나, RDB 파일 저장이 실패한 원인을 찾아 해결하는 것이다.

redis-cli에서 또는 redis.conf 파일에서 설정하는 방법 이 있다.

방법1. stop-writes-on-bgsave-error 설정 변경

redis-cli에서 변경하는 명령어는 아래와 같다.

> config set stop-writes-on-bgsave-error no

redis.conf 파일에서는 아래 설정을 바꿔주면 된다.

# vi /etc/redis/redis.conf
stop-writes-on-bgsave-error no


방법2. RDB 파일 저장 실패 원인 파악

RDB 파일 저장이 실패하는 경우는 일반적으로 아래와 같다.

  • 디렉토리 쓰기 권한 문제
  • 여유 디스크 공간 부족

해당 문제를 해결하고 RDB 저장이 성공하면 Redis 서버는 데이터를 받아들인다.


info persistence명령으로 RDB 관련 정보를 얻을 수 있다.

127.0.0.1:6379> info persistence
# Persistence
loading:0
async_loading:0
current_cow_peak:0
current_cow_size:0
current_cow_size_age:0
current_fork_perc:0.00
current_save_keys_processed:0
current_save_keys_total:0
rdb_changes_since_last_save:1
rdb_bgsave_in_progress:0
rdb_last_save_time:1676004747
rdb_last_bgsave_status:err
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_saves:360
rdb_last_cow_size:0
rdb_last_load_keys_expired:0
rdb_last_load_keys_loaded:0
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_rewrites:0
aof_rewrites_consecutive_failures:0
aof_last_write_status:ok
aof_last_cow_size:0
module_fork_in_progress:0
module_fork_last_cow_size:0

rdb_last_bgsave_status : 마지막 저장이 성공인지 실패인지를 표시한다.

rdb_last_bgsave_time_sec : 마지막 저장 소요 시간을 보여준다. 이 시간을 참고해서 save 설정 시간(초)를 정하면 될것이다.

rdb_bgsave_in_progress : RDB 파일 백그라운드 저장이 진행중이면 1로 표시된다.

Tags:

Categories:

Updated:

Leave a comment