Database/Redis

[실전 레디스] 5-4. 레디스 운용 관리: 관리

noahkim_ 2025. 3. 21. 23:28

하야시 쇼고 님의 "실전 레디스" 책을 정리한 포스팅 입니다.

 

1. 보안

  • 신뢰할 수 없는 환경에서 레디스에 접근할 때 사용자 접근 제한 기능을 제공함

 

설정

네트워크 보안
bind 127.0.0.1 192.168.1.100
  • bind 지시자로 접속 호스트 제한

 

tls-enabled yes
tls-cert-file /etc/redis/redis.crt
tls-key-file /etc/redis/redis.key
tls-ca-cert-file /etc/redis/ca.crt

-------------------------------------

redis-cli --tls -h my-secure-redis.com
  • tls 통신 지원
  • 클라이언트에서 --tls 옵션으로 접속 필요

 

protected-mode yes
  • 보호 모드
  • 루프백 인터페이스와 유닉스 도메인 소켓만 접근 가능

 

명령어 제한
rename-command FLUSHALL ""
rename-command CONFIG myconfig
  • rename-command
  • 특정 명령 비활성화를 목적으로 사용됨

 

인증
requirepass mystrongpassword

------------------------------------

redis-cli
127.0.0.1:6379> AUTH mystrongpassword
OK
  • requirepass
  • 설정 파일에 접근하는데 패스워드를 요구하도록 설정
  • 클라이언트에서는 AUTH 명령어를 사용하여 패스워드를 지정하고 연결함 (단, 암호화되지는 않음)

 

외부 클라이언트에서 공격
set-random-seed yes
  • 의사 난수 함수의 시드 설정 (실행할 때마다)

 

client-output-buffer-limit normal 256mb 64mb 60
  • 너무 많이 요청하는 클라이언트를 감지하여 차단 가능
  • 클라이언트가 일정 크기 이상의 데이터를 쌓으면 강제로 연결을 종료함
  • DoS 공격 방지

 

import redis

r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)

# 안전한 키 설정
key = "user:1001:name"
value = "Noah's Key; DROP TABLE users;"  # 위험한 입력

# Redis에 안전하게 저장
r.set(key, value.replace(";", "").replace("DROP", ""))
  • 문자열 이스케이핑

 

ACL (Access Control List)

  • 신뢰할 수 없는 클라이언트는 접근 차단
  • 신뢰할 수 있는 클라이언트는 최소한의 접근 권한만 부여

 

접근 권한 확인
acl list
user default on nopass sanitize-payload ~* &* +@all

 

 

항목 설명
default
사용자 이름 (기본 사용자)
on
계정 활성화 여부 (on이면 활성화)
nopass
패스워드 없이 인증 가능 (nopass가 없으면 AUTH 명령 필요)
sanitize-payload
RDB 파일 복원 시 페이로드 검사 수행
~*
모든 키에 대한 접근 허용 (~keypattern 형식으로 특정 키만 허용 가능)
&*
모든 Pub/Sub 채널에 접근 허용 (&channelpattern 형식으로 제한 가능)
+@all
모든 명령어 사용 허용 (+command 형식으로 특정 명령만 허용 가능)

 

설정
ACL SETUSER testuser on >mypassword ~cache:* +get +set -flushall -flushdb
user admin on >adminpass ~* +@all
user readonly on >readonlypass ~* +@read -flushall -flushdb
user limited on >limitedpass ~cache:* +get +set
aclfile /etc/redis/users.acl

 

명령어
명령어 설명 예제
ACL LIST 현재 Redis에 설정된 ACL 목록 조회 ACL LIST
ACL USERS 등록된 사용자 목록 조회 ACL USERS
ACL WHOAMI 현재 인증된 사용자 확인 ACL WHOAMI
ACL SETUSER <사용자명> <설정> 특정 사용자 권한 설정 ACL SETUSER testuser on >mypassword ~cache:* +get +set -flushall
ACL DELUSER <사용자명> 특정 사용자 삭제 ACL DELUSER testuser
ACL GETUSER <사용자명> 특정 사용자 권한 조회 ACL GETUSER testuser
ACL CAT [category] 특정 명령어 카테고리 조회 ACL CAT @read
ACL GENPASS [길이] 랜덤 비밀번호 생성 (기본 64자) ACL GENPASS 16
`ACL LOG [count/reset] ACL 관련 보안 로그 조회 or 초기화 ACL LOG 5
ACL SAVE 현재 ACL 설정을 aclfile에 저장 ACL SAVE
ACL LOAD aclfile의 ACL 설정을 다시 불러오기 ACL LOAD

 

2. 벤치마크

  • Redis 서버의 성능을 측정하는 도구
  • 다양한 작업을 시뮬레이션하여 응답 성능을 평가함
  • 어떻게 튜닝해야 할지 결정할 때 사용함

 

redis-benchmark 명령어 옵션

옵션 설명 예제
-h 도움말 출력 redis-benchmark -h
-p Redis 서버 포트 지정 (기본값: 6379) redis-benchmark -p 6380
-c 클라이언트의 수 지정 (기본값: 50) redis-benchmark -c 100
-n 수행할 명령어의 총 횟수 지정 redis-benchmark -n 100000
-q 결과를 간단하게 출력 (통계만 출력) redis-benchmark -q
-d 각 요청에 대한 데이터 크기 (기본값: 2) redis-benchmark -d 512
-t 벤치마크할 명령어 유형 지정 (여러 명령어도 지정 가능) redis-benchmark -t set,get
-r 값의 범위 지정 (SET 명령어에서 사용) redis-benchmark -r 1000
-P 파이프라이닝의 크기 지정 redis-benchmark -P 16
-k 키 이름의 접두사를 지정 (기본값: 없음) redis-benchmark -k user:
-l 로깅 레벨 (일반적으로 사용되지 않음) redis-benchmark -l
-v 벤치마크 결과를 더 상세하게 출력 redis-benchmark -v

 

 

예시

redis-benchmark -h 192.168.0.1 -p 6379 -n 10000 -r 1000 -P 10 -c 100 -d 15
옵션 설명 예시
-h Redis 서버의 호스트 IP 주소
192.168.0.1 (테스트할 Redis 서버의 IP 주소)
-p Redis 서버의 포트 번호 6379 (기본 포트 번호 사용)
-n 총 요청 수
10000 (10,000번의 요청을 보내 성능 측정)
-r SET 명령어에서 값의 범위
1000 (값은 0~1000 범위 내에서 랜덤하게 선택)
-P 파이프라이닝 크기
10 (한 번에 10개의 요청을 파이프라이닝 방식으로 처리)
-c 동시 클라이언트 수
100 (100개의 클라이언트가 동시에 요청을 처리)
-d 요청당 데이터 크기
15 (각 요청에 대해 15바이트의 데이터 전송)

 

 

3. 멀티 스레드 처리

개념

Redis는 기본적으로 싱글 스레드로 동작하지만, 일부 작업은 멀티스레드로 처리 가능

I/O 관련 작업과 삭제 작업을 비동기적으로 처리하여 성능 향상

 

삭제

명령어
  • UNLINK: 삭제할 키를 백그라운드 큐에 넣고, 다른 스레드가 비동기적으로 삭제함

 

지시자
  • lazyfree-lazy-user-del : DEL 명령어를 비동기적으로 수행

 

I/O 멀티스레드 처리

과정
  1. 메인 스레드가 클라이언트 연결 요청을 받음
  2. 소켓 생성 및 읽기 작업을 대기하는 큐에 추가
  3. 메인 스레드가 읽기 이벤트 처리 후 I/O 스레드에 작업 할당
  4. I/O 스레드가 소켓에서 요청을 읽고, 분석된 명령을 메인 스레드에 전달
  5. 메인 스레드가 명령을 실행 후, I/O 스레드가 응답을 소켓에 저장
  6. 메인 스레드가 큐에서 요청을 삭제하고 다음 요청을 받음

 

지시자
  • io-threads: I/O 작업을 담당할 스레드 개수 설정
  • io-threads-do-reads: 요청 내용을 여러 스레드가 분담하여 소켓에서 읽어올 수 있도록 설정

 

고려사항

  • 동기화 처리를 해야 하므로 복잡성이 증가
  • 싱글 스레드는 간단하고 빠르게 처리가 가능함

 

4. DEBUG 명령어

명령어 설명
DEBUG ERROR <message> 지정한 오류 메시지를 강제로 발생
DEBUG SEGFAULT
강제적으로 서버 충돌을 발생 (테스트용)
DEBUG SLEEP <seconds> 지정된 시간 동안 서버를 일시 중지
DEBUG CRASH-AND-RECOVER 서버 충돌 및 복구를 시뮬레이션
DEBUG OOM
메모리 부족(Out Of Memory) 상태를 시뮬레이션
DEBUG MEMORY 메모리 사용량과 관련된 정보 출력
DEBUG RELOAD
RDB/AOF 데이터를 디스크에서 다시 로드
DEBUG POPULATE <count> 테스트를 위해 다량의 키를 생성
DEBUG FLUSHALL 모든 데이터베이스의 데이터를 삭제
DEBUG FLUSHDB 현재 데이터베이스의 데이터를 삭제