서적/실전 Redis

CHAPTER 05 레디스 운용 관리 [PART 02 실전]

Mo_bi!e 2025. 6. 24. 10:00

I. 데이터 영속성

1. 스냅숏 (RDB)

  • (1) 개요
    스냅숏은 Redis의 메모리 상태를 일정 시점에 RDB 파일 형태로 저장하는 방식이다
    일반적으로 save 설정을 통해 특정 시간 동안 일정 횟수 이상의 변경이 발생했을 경우 자동으로 수행된다
  • (2) 장점
    1. 저장 속도가 빠르며 실행 중인 인스턴스의 상태를 간단히 백업할 수 있다
    2. 재시작 시 복구 속도가 빠르며 운영 중단 시간을 최소화할 수 있다
  • (3) 단점
    1. 마지막 저장 이후 발생한 데이터는 손실될 수 있다
    2. 저장 시점에 따라 일관성 없는 상태가 저장될 가능성도 존재한다

2. AOF (Append Only File)

  • (1) 개요
    AOF는 Redis의 모든 쓰기 명령어를 순차적으로 기록하여 영속성을 보장하는 방식이다
    재시작 시 해당 로그를 순서대로 재실행함으로써 데이터를 복구한다
  • (2) 장점
    1. 데이터 유실을 최소화할 수 있으며 RDB보다 내구성이 높다
    2. 로그 기반 구조로 인해 문제 발생 시 디버깅이나 복구가 용이하다
  • (3) 단점
    1. 모든 명령을 기록하므로 파일 크기가 커지기 쉽고 성능이 저하될 수 있다
    2. 주기적인 리라이트(rewrite) 작업이 필요하며 설정에 따라 서버 부하가 발생할 수 있다

3. 스냅숏과 AOF 비교

  • (1) RDB는 특정 조건에서 전체 데이터를 한 번에 저장하는 방식이며, AOF는 모든 명령을 순차적으로 기록한다
  • (2) RDB는 빠른 저장과 복구가 가능하지만 일부 데이터 손실이 발생할 수 있으며, AOF는 상대적으로 느리지만 데이터 손실이 적다
  • (3) Redis에서는 두 방식을 함께 사용할 수 있으며, 일반적으로 AOF를 기본 복구 수단으로 사용하고 RDB는 보조 백업으로 사용하는 형태가 권장된다

II. 캐시 서버로서 레디스 아키텍처

1. 읽기 관점 아키텍처

  • (1) 개요
    읽기 중심의 아키텍처에서는 클라이언트 요청이 캐시 서버(Redis)를 우선적으로 조회하고, 캐시에 값이 없을 경우에만 백엔드 데이터 저장소(RDBMS 등)로 요청을 전달한다
    이 방식은 응답 속도를 향상시키고 백엔드 시스템에 가해지는 부하를 줄이는 데 효과적이다
  • (2) 장점
    1. 대부분의 요청이 Redis에서 처리되므로 지연 시간이 매우 짧다
    2. 스케일 아웃이 용이하며, 로드 밸런서와 조합하여 처리량을 유연하게 확장할 수 있다
  • (3) 단점
    1. 캐시에 없는 데이터는 백엔드로 요청되므로 캐시 미스 비율에 따라 성능 편차가 발생할 수 있다
    2. 데이터 갱신 시점에 대한 관리가 필요하며, 불일치(Inconsistency) 문제가 발생할 수 있다

2. 쓰기 관점 아키텍처

  • (1) 개요
    쓰기 중심의 아키텍처에서는 데이터 갱신이 발생할 때 Redis와 백엔드 저장소에 대한 처리를 동시에 고려해야 한다
    보통은 백엔드에 쓰기를 완료한 후 Redis를 갱신하거나 삭제하여 일관성을 맞추는 방식이 사용된다
  • (2) 전략
    1. Write-through 방식은 쓰기 요청이 Redis와 백엔드 저장소에 동시에 들어가도록 하며, 쓰기 일관성을 보장하지만 지연이 늘어날 수 있다
    2. Write-back 방식은 우선 Redis에만 반영하고, 백그라운드로 영속 저장소를 갱신한다
    3. Write-around는 백엔드에만 쓰고 Redis에는 갱신하지 않으며, 다음 읽기 요청 시 다시 캐시에 로드하는 방식이다
  • (3) 주의점
    1. 동시성 이슈에 취약할 수 있으며, 재시도 로직이 필요하다
    2. 쓰기-읽기 타이밍이 어긋나면 구버전 데이터가 읽히는 현상이 발생할 수 있다

3. 아키텍처 안티 패턴

  • (1) 단일 인스턴스에 모든 요청 집중
    Redis를 하나의 인스턴스로 구성하고 읽기/쓰기/백업까지 전부 처리하도록 설정하는 경우, 장애 시 전체 서비스 중단 위험이 커진다
    읽기/쓰기 분리 또는 샤딩을 통해 부담을 분산하는 구조가 필요하다
  • (2) 캐시와 영속 저장소 역할을 동시에 수행
    Redis를 캐시 겸 영속 저장소로 사용하는 경우, 캐시의 일관성, 데이터 유실, 복구 전략 등에 대한 고려 없이 구성하면 영속성을 보장하지 못하는 위험이 존재한다
    이러한 설계는 테스트 환경이나 단순 구조에는 유리할 수 있으나, 운영 환경에서는 권장되지 않는다
  • (3) TTL 없이 무한 저장
    캐시로 사용하는 키에 TTL 설정이 없는 경우, 메모리를 계속 소비하게 되어 메모리 부족, eviction, OOM(Out of Memory)으로 이어질 수 있다

4. 데이터 저장소로서의 레디스 아키텍처

  • (1) 개요
    Redis를 단순 캐시가 아닌 주요 데이터 저장소로 사용하는 방식은 가능하지만 몇 가지 제한사항과 고려사항이 존재한다
    예를 들어 영속성 확보를 위한 AOF/RDB 설정, 복제 및 클러스터 구성, 백업 체계 등은 필수적으로 갖추어야 한다
  • (2) 권장 패턴
    1. TTL 정책과 결합하여, 오래된 데이터는 자동으로 제거되도록 구성한다
    2. 복제본 노드를 별도로 구성하여 읽기 부하를 분산시킨다
    3. 페일오버 및 장애 감지 기능이 있는 Sentinel 또는 Redis Cluster를 활용하여 고가용성을 확보한다

III. 운영 모범 사례

1. TTL 설정

  • (1) 개요
    Redis는 메모리 기반 데이터 저장소이므로 용량이 한정되어 있으며 필요하지 않은 데이터를 장기간 유지하면 메모리 부족으로 이어질 수 있다
    따라서 각 키에 대해 TTL(Time To Live)을 설정하여 일정 시간이 지나면 자동으로 제거되도록 구성하는 것이 바람직하다
  • (2) 권장 방식
    1. 캐시 데이터에는 기본적으로 TTL을 설정하는 습관을 들여야 한다
    2. TTL이 없는 키는 점차적으로 메모리를 점유하므로, 전체 키 중 TTL이 없는 키 비율을 주기적으로 모니터링하는 것이 좋다

2. 제거 정책 설정

  • (1) 개요
    Redis는 maxmemory 설정을 통해 사용할 수 있는 최대 메모리를 제한할 수 있으며, 이 설정을 초과할 경우 eviction 정책에 따라 키를 제거한다
  • (2) 정책 종류
    1. volatile-lru, allkeys-lru 등은 자주 사용되지 않은 키부터 제거하는 방식으로 효율적인 메모리 관리가 가능하다
    2. noeviction은 설정된 메모리 초과 시 새로운 데이터를 저장하지 않고 오류를 발생시키므로, 신중하게 사용해야 한다
  • (3) 권장 설정
    일반적인 캐시 용도에서는 allkeys-lru 또는 volatile-lru 설정이 자주 사용되며, 서비스 특성에 따라 TTL과 함께 조합하여 적용하는 것이 바람직하다

3. 백업

  • (1) 개요
    Redis는 기본적으로 인메모리이기 때문에 장애나 시스템 다운 시 데이터 손실 가능성이 있다
    따라서 정기적인 백업 정책을 수립하는 것이 필수적이다
  • (2) 방법
    1. RDB 파일을 주기적으로 백업하고, AOF 파일을 함께 보관하여 재해 복구 시 활용할 수 있도록 한다
    2. 중요한 서비스에서는 서버 외부의 안전한 위치에 백업 데이터를 저장하는 것이 권장된다

4. 커넥션 풀링

  • (1) 개요
    Redis는 연결마다 소켓 리소스를 사용하므로 다수의 클라이언트가 직접 연결을 유지할 경우 리소스 낭비가 발생할 수 있다
    이를 방지하기 위해 커넥션 풀을 활용하는 것이 안정적인 운영에 유리하다
  • (2) 장점
    1. 매 요청마다 연결/해제를 반복하지 않아 네트워크 오버헤드가 줄어든다
    2. Redis 서버의 동시 연결 수를 제어할 수 있으므로, 서버 부하를 예측 가능하게 만든다

5. 재시도 처리

  • (1) 개요
    일시적인 네트워크 지연이나 서버 부하로 인해 Redis 명령이 실패하는 경우가 있을 수 있다
    이러한 상황을 고려하여 클라이언트 측에서 재시도 로직을 구현하는 것이 좋다
  • (2) 권장 방식
    1. 지수 백오프(Exponential Backoff) 전략을 통해 재시도 간 간격을 조절함으로써 과도한 부하를 방지할 수 있다
    2. 실패 시 즉시 실패 처리하지 않고, 제한된 횟수 내에서 재시도하도록 구성한다

6. 기타 모범 사례

  • (1) 모니터링
    INFO 명령이나 Redis Exporter를 활용해 메모리 사용량, 커넥션 수, keyspace hit/miss 등을 지속적으로 모니터링해야 한다
  • (2) 키 설계
    key 이름은 명확하게 구분되는 접두사를 붙여 네임스페이스처럼 사용할 수 있으며, 복잡한 연산이 필요할 경우 자료형 설계를 충분히 고려한다
  • (3) 운영 중 명령어 사용 주의
    운영 환경에서 KEYS, FLUSHALL 등은 피해야 하며, 대안으로는 SCAN, UNLINK 등의 명령어를 사용하는 것이 권장된다

IV. 캐시 노드 크기 조정

1. 크기 조정 기준

  • (1) 개요
    Redis는 인메모리 기반 시스템이므로 노드의 크기를 어떻게 설정하느냐에 따라 시스템의 안정성과 비용 효율성이 달라진다
    따라서 전체 데이터의 특성과 부하 수준에 맞게 노드 크기를 결정하는 것이 중요하다
  • (2) 고려 요소
    1. 캐시에 저장되는 데이터 수, 크기, TTL, 접근 패턴 등을 종합적으로 고려해야 한다
    2. 레디스는 키 수와 값의 크기에 따라 메모리 사용량이 비선형적으로 증가할 수 있기 때문에, 정확한 용량 산정은 필수적이다
    3. TTL이 길거나 없는 경우, 캐시의 누적이 계속 발생하므로 eviction 비율과 메모리 사용량의 추이를 기준으로 리사이징 필요 여부를 판단할 수 있다
  • (3) 측정 방법
    1. 실제 트래픽 조건에서 redis-benchmark 또는 실제 사용자 요청 기반의 부하 테스트를 수행하는 것이 좋다
    2. INFO memory 명령을 활용해 메모리 점유 현황을 모니터링하고, used_memory_peak_human 등을 참고하여 최댓값을 예측한다

2. 샤딩 고려

  • (1) 필요성
    하나의 인스턴스에 모든 데이터를 저장하는 구조는 확장성과 가용성 측면에서 한계가 있다
    서비스 성장과 함께 데이터가 증가하면 수평 확장(샤딩)을 통해 각 노드의 부담을 분산시키는 것이 필요하다
  • (2) 샤딩 기준
    1. 키 해싱 기반 샤딩이 일반적이며, Consistent Hashing 또는 Redis Cluster에서의 슬롯 기반 샤딩을 사용할 수 있다
    2. 단순 해시 샤딩을 사용할 경우, 데이터 불균형이 발생할 가능성이 있으므로, 접근 패턴이 균등한지 사전에 분석해야 한다
  • (3) 주의사항
    1. 샤딩된 구조에서는 cross-node 연산이 불가능하므로, 키 설계 시 같은 샤드 내에서 연산이 일어나도록 구성해야 한다
    2. 일부 복잡한 연산이 필요한 기능은 Redis에 적합하지 않으며, 이러한 경우는 백엔드 DB나 다른 처리 계층으로 위임하는 것이 좋다

V. 설정 파일 (redis.conf)

1. 개요

  • (1) redis.conf는 Redis 서버의 기본 동작과 보안, 퍼포먼스, 영속성 등을 제어하는 주요 설정 파일이다
  • (2) 운영 환경에서는 기본 설정을 그대로 사용하지 않고 서비스 특성과 목적에 맞게 일부 항목을 변경하는 것이 일반적이다
  • (3) Redis를 데몬 형태로 실행하거나 systemd로 관리할 경우에도 이 파일을 통해 초기 설정을 적용하게 된다

2. 주요 설정 항목

  • (1) 포트 및 접근 관련
    1. port는 기본적으로 6379이며, 서비스 환경에 따라 변경할 수 있다
    2. bind 항목은 접근을 허용할 IP를 설정하며, 예를 들어 127.0.0.1만 설정하면 외부 접속은 제한된다
    3. protected-mode는 기본적으로 yes이며, 외부 접속 차단을 위한 보호 모드다
      운영 환경에서 외부 접근을 허용하려면 bind와 requirepass 설정을 함께 고려해야 한다
  • (2) 보안 관련
    1. requirepass는 Redis 접속 시 사용할 비밀번호를 설정하는 항목이다
    2. rename-command를 통해 위험한 명령어를 다른 이름으로 바꿔 보안을 강화할 수 있다
      예를 들어 FLUSHALL이나 CONFIG 명령은 반드시 리네이밍하거나 비활성화하는 것이 좋다
    3. Redis 6 이상에서는 ACL 설정도 별도로 가능하며, 사용자별 권한 제어를 통해 보안을 세분화할 수 있다
  • (3) 메모리 및 퍼포먼스
    1. maxmemory는 Redis가 사용할 수 있는 최대 메모리를 제한하는 값이며, eviction 정책과 함께 설정해야 한다
    2. maxclients는 Redis가 동시에 처리할 수 있는 최대 클라이언트 수를 설정한다
      이 값이 실제 OS의 ulimit -n보다 클 경우 에러가 발생할 수 있으므로 반드시 시스템 리소스 제한과 함께 조정해야 한다
  • (4) 영속성 관련
    1. save 설정은 RDB 스냅숏 저장 조건을 의미하며, save 900 1과 같이 시간-변경 횟수 조건으로 지정할 수 있다
    2. appendonly는 AOF 사용 여부를 설정하며, yes로 설정하면 모든 쓰기 명령을 appendonly.aof에 기록하게 된다
    3. appendfsync는 AOF 기록 주기를 설정하며, always, everysec, no 세 가지 중 하나를 선택할 수 있다
  • (5) 로깅 및 모니터링
    1. logfile은 로그를 기록할 파일 경로를 지정하며, 빈 값이면 stdout으로 출력된다
    2. loglevel은 로그 상세 수준을 설정하며, debug, verbose, notice, warning 중 하나를 선택할 수 있다
    3. slowlog-log-slower-than은 슬로우 쿼리 로깅 기준 시간으로, 마이크로초 단위로 지정하며 성능 분석 시 활용된다
  • (6) 기타 운영 관련
    1. daemonize는 yes일 경우 백그라운드에서 데몬 형태로 실행되며, 일반적으로 시스템에 등록된 서비스로 실행 시에는 no로 설정한다
    2. tcp-keepalive는 커넥션 유지 주기를 조절하는 값으로, 네트워크 불안정 환경에서는 적절히 조절하는 것이 바람직하다
    3. databases는 사용할 수 있는 DB 인스턴스 수를 설정하며, 기본값은 16이지만 대부분의 서비스에서는 1개만 사용하는 경우가 많다

VI. 보안

1. 개요

  • (1) Redis는 기본적으로 내부망에서의 사용을 전제로 설계되어 있으므로, 별도의 보안 설정을 하지 않으면 외부 공격에 취약할 수 있다
  • (2) 운영 환경에서는 인증, 권한 제어, 명령어 제한 등 보안 조치를 명확히 설정해야 하며, Redis 자체 기능뿐만 아니라 네트워크 및 시스템 레벨 보안도 함께 고려해야 한다

2. 접근 제어 (Authentication)

  • (1) requirepass
    Redis는 인증 기능을 통해 비밀번호를 설정할 수 있으며, 인증되지 않은 클라이언트는 명령 실행이 차단된다
    설정 파일에서 requirepass <password> 형식으로 지정하며, 운영 환경에서는 반드시 강력한 비밀번호를 설정해야 한다
  • (2) 제한 사항
    비밀번호 인증만으로는 IP 필터링이 없기 때문에 외부에서 접속 가능한 경우 보안이 취약할 수 있다
    따라서 반드시 방화벽 설정, bind 주소 제한, TLS 사용 등을 병행해야 한다

3. 명령어 제한 (rename-command)

  • (1) 개요
    Redis는 일부 위험한 명령어들을 다른 이름으로 바꾸는 기능을 제공하며, 이를 통해 사용자의 오용이나 악의적인 접근을 방지할 수 있다
    예를 들어 FLUSHALL 또는 CONFIG 명령은 실수로 실행될 경우 전체 데이터가 삭제되거나 설정이 변경될 수 있으므로 운영 환경에서는 반드시 제한해야 한다
  • (2) 사용 방법
    rename-command CONFIG ""처럼 빈 문자열을 지정하면 해당 명령어는 비활성화된다
    또는 rename-command FLUSHALL secure_flushall과 같이 명령어를 바꾸어 내부 관리 도구에서만 사용할 수 있게 할 수 있다

4. ACL (Access Control List)

  • (1) 개요
    Redis 6 이상부터는 ACL 기능이 도입되어 사용자 단위로 접근 권한, 키 패턴, 명령어 범위를 제한할 수 있게 되었다
    이를 통해 Redis를 여러 서비스가 공유할 경우에도 사용자 간 권한 분리가 가능해졌다
  • (2) 주요 구성
    1. 사용자 생성: ACL SETUSER <username> on >password 형식으로 사용자와 비밀번호를 설정할 수 있다
    2. 명령어 제한: +get, +set, -flushall 형식으로 허용 및 차단할 명령어를 지정한다
    3. 키 패턴 제한: ~cache:*과 같이 특정 키 패턴만 접근 가능하도록 설정할 수 있다
  • (3) 운영 팁
    ACL 설정은 redis.conf 또는 별도 ACL 파일을 통해 유지 관리할 수 있으며, 권한 변경 시 서버 재시작 없이 반영 가능하다
    관리 계정은 최소한으로 유지하고, 일반 클라이언트는 반드시 제한된 권한만 부여해야 한다

5. 기타 보안 모범 사례

  • (1) bind 설정으로 외부 접속 차단
    기본적으로 Redis는 모든 IP에서 접근 가능하므로 bind 127.0.0.1 또는 사내망 IP로 제한해야 한다
  • (2) protected-mode 활성화
    이 모드는 외부에서 인증 없이 접속하지 못하게 하며, Redis 6 이전에는 특히 필수적인 설정이다
  • (3) TLS 암호화
    Redis 6부터는 TLS를 지원하므로 네트워크 단에서 데이터 전송 시 암호화를 적용할 수 있다
    민감한 데이터를 다루는 경우 반드시 TLS 및 mTLS 인증서 기반 통신을 적용하는 것이 좋다
  • (4) 운영 접근 최소화
    운영자는 FLUSHALL, DEBUG, CONFIG 등의 고위험 명령을 리네이밍하거나 ACL로 차단하고, 해당 기능은 전용 계정을 통해서만 사용할 수 있도록 한다

VII. 벤치마크

1. 개요

  • (1) Redis는 인메모리 구조의 특성상 매우 빠른 성능을 제공하지만, 실제 서비스 환경에서는 네트워크, 커넥션 수, 데이터 크기 등에 따라 성능이 달라질 수 있다
  • (2) 따라서 배포 전 또는 인프라 변경 시점에 성능을 수치화하고 비교 가능하게 측정하는 작업이 필요하다
  • (3) Redis는 자체 제공 도구인 redis-benchmark를 통해 간단하게 벤치마크를 수행할 수 있으며, 실제 워크로드와 유사한 환경에서의 테스트가 권장된다

2. redis-benchmark 도구

  • (1) 기본 사용법
    redis-benchmark -h <host> -p <port> 명령으로 기본 벤치마크를 수행할 수 있으며, 기본적으로 50개의 동시 클라이언트로 100000개의 요청을 전송한다
    다양한 명령어 유형에 대해 초당 처리량, 평균 지연 시간 등을 출력해준다
  • (2) 주요 옵션
    1. -n <num>: 전체 요청 수를 설정하며, 기본값은 100000이다
    2. -c <clients>: 동시 접속 클라이언트 수를 지정하며, 실제 서비스에서의 TPS 유사 환경을 구성할 수 있다
    3. -d <size>: SET/GET 시 사용하는 값의 크기를 지정한다
    4. -t <commands>: 테스트할 명령어를 지정하며, 예를 들어 -t set,get처럼 사용할 수 있다
    5. -P <pipeline>: 파이프라이닝으로 묶을 명령 수를 지정하여 네트워크 효율성을 측정할 수 있다
  • (3) 예시
    redis-benchmark -n 100000 -c 100 -d 256 -t set,get -P 10은 256바이트 데이터를 100개의 동시 클라이언트가 10개씩 파이프라인으로 처리하는 상황을 시뮬레이션한다

3. 유의사항

  • (1) redis-benchmark는 실제 애플리케이션의 트래픽 패턴을 완전히 반영하지 못한다
    단순 명령어 반복 중심이므로 복잡한 트랜잭션, 키 분포, TTL 동작 등을 반영하려면 별도 시나리오 기반 부하 테스트가 필요하다
  • (2) 테스트 대상 서버와 클라이언트 위치가 동일하거나 네트워크가 안정적인 환경에서 진행되어야 정확한 측정이 가능하다
  • (3) 파이프라이닝과 멀티스레딩 옵션을 과도하게 사용하면 실제 서비스보다 비현실적인 수치가 나올 수 있으므로 적절히 조절해야 한다
  • (4) 클러스터 환경에서는 슬롯 분산, 샤드 간 분기, 명령 재시도 비용 등도 고려해야 하며, 단일 노드 테스트 결과만으로 판단해서는 안 된다

VIII. 멀티 스레드 처리

1. 개요

  • (1) Redis는 기본적으로 싱글 스레드 구조를 유지하고 있으며, 이는 명령 처리의 직렬성과 예측 가능한 성능을 보장한다는 장점이 있다
  • (2) 그러나 Redis 6.0부터는 I/O 처리에 한해 멀티 스레드 기능이 도입되어, 네트워크 입출력에서 병목을 줄이는 데 도움을 준다

2. 싱글 스레드 처리 구조

  • (1) Redis는 클라이언트의 요청을 하나의 메인 스레드에서 순차적으로 처리하며, 각 명령은 blocking 없이 빠르게 실행되는 것이 전제다
  • (2) 이 구조는 데이터 일관성과 간결한 코드 구조를 보장하지만, 고성능 네트워크 환경에서는 I/O 처리에서 병목이 발생할 수 있다

3. I/O 멀티 스레드 도입

  • (1) Redis 6부터는 네트워크 입출력 처리에 한해 멀티 스레드를 사용할 수 있는 옵션이 추가되었다
  • (2) 이는 실제 명령 실행은 여전히 싱글 스레드로 유지되지만, 클라이언트와의 통신에서 발생하는 데이터 수신/송신 처리를 여러 스레드로 병렬 처리함으로써 처리량을 증가시킬 수 있다
  • (3) 활성화 방법
    1. redis.conf에서 io-threads-do-reads yes 설정을 통해 읽기 작업을 멀티 스레드로 처리할 수 있다
    2. io-threads <num>을 설정하여 사용할 스레드 수를 지정하며, 일반적으로 4~8개 사이가 권장된다

4. 유의사항 및 한계

  • (1) 멀티 스레드는 명령 실행 자체를 병렬 처리하지 않기 때문에 계산량이 많은 작업에서는 성능 향상 효과가 크지 않다
  • (2) 반대로, 많은 클라이언트가 동시에 접속하여 작은 요청을 빠르게 주고받는 상황에서는 I/O 병목이 줄어들어 TPS 향상이 가능하다
  • (3) I/O 멀티 스레드는 대부분의 리눅스 배포판에서 안정적으로 동작하지만, 운영 환경에서는 CPU 코어 수, NUMA 구성 등을 고려하여 조정해야 한다
  • (4) 멀티 스레드를 사용하는 경우에는 redis-cli 등 단일 스레드 기반 도구와의 성능 비교가 왜곡될 수 있으므로 주의해야 한다

IX. DEBUG 명령어

1. 개요

  • (1) Redis는 내부 동작을 분석하거나 문제 상황을 진단하기 위해 DEBUG 계열의 명령어를 제공한다
  • (2) 이러한 명령어들은 일반적인 운영 상황에서는 거의 사용되지 않지만, 성능 분석, 메모리 구조 파악, 장애 디버깅 등의 목적으로 유용하게 활용될 수 있다
  • (3) 단, 일부 DEBUG 명령은 운영 환경에서 사용 시 Redis 인스턴스를 중단시키거나 불안정하게 만들 수 있으므로 주의가 필요하다

2. 주요 DEBUG 명령어

  • (1) DEBUG OBJECT <key>
    해당 키의 내부 메타데이터를 출력하며, refcount, encoding, idle time 등을 확인할 수 있다
    예를 들어 오래된 키를 정리하거나, 어떤 방식으로 저장되고 있는지를 확인할 때 유용하다
  • (2) DEBUG SEGFAULT
    강제로 Redis 서버에 SIGSEGV 오류를 발생시켜 core dump를 유도하는 명령이다
    운영 환경에서는 절대 실행하면 안 되며, 디버깅 테스트나 개발 환경에서만 제한적으로 사용해야 한다
  • (3) DEBUG HTSTATS <db>
    특정 DB 인덱스에 해당하는 해시 테이블의 버킷 분포 통계를 출력한다
    키의 분포 상태나 충돌 현황을 확인하고자 할 때 유용하다
  • (4) DEBUG SLEEP <seconds>
    지정한 시간 동안 Redis 서버를 강제로 정지시키는 명령으로, 테스트 환경에서만 사용해야 한다
  • (5) DEBUG POPULATE <num> <prefix> <size>
    대량의 키를 자동으로 생성해주는 명령으로, 벤치마크 테스트나 부하 테스트 전에 데이터를 준비할 때 활용할 수 있다
    예를 들어 DEBUG POPULATE 10000 foo 128foo:0, foo:1...과 같은 키를 128바이트 값으로 10000개 생성한다

3. 사용 시 주의사항

  • (1) DEBUG 명령은 공식적으로 내부 진단용으로만 제공되는 것이며, API 문서에도 일부는 명시되지 않을 수 있다
  • (2) 운영 환경에서는 특히 DEBUG SEGFAULT, DEBUG SLEEP 같은 명령을 실행하지 않도록 보호 장치를 마련하는 것이 좋다
  • (3) 만약 DEBUG 명령을 제한하고 싶다면, redis.conf에서 rename-command를 활용해 이름을 변경하거나, Redis 6 이상에서는 ACL을 통해 명령 권한을 제한하는 것이 권장된다