하야시 쇼고 님의 "실전 레디스" 책을 정리한 포스팅 입니다.
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 멀티스레드 처리
과정
- 메인 스레드가 클라이언트 연결 요청을 받음
- 소켓 생성 및 읽기 작업을 대기하는 큐에 추가
- 메인 스레드가 읽기 이벤트 처리 후 I/O 스레드에 작업 할당
- I/O 스레드가 소켓에서 요청을 읽고, 분석된 명령을 메인 스레드에 전달
- 메인 스레드가 명령을 실행 후, I/O 스레드가 응답을 소켓에 저장
- 메인 스레드가 큐에서 요청을 삭제하고 다음 요청을 받음
지시자
- 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 | 현재 데이터베이스의 데이터를 삭제 |
'Database > Redis' 카테고리의 다른 글
[실전 레디스] 6-1. 트러블 슈팅: 서버 정보 (1) | 2025.03.23 |
---|---|
[실전 레디스] 5-3. 레디스 운용 관리: 셋팅 (0) | 2025.03.21 |
[실전 레디스] 5-2. 레디스 운용 관리: 아키텍처 (0) | 2025.03.21 |
[실전 레디스] 5-1. 레디스 운용 관리: 영속성 (0) | 2025.03.21 |
[실전 레디스] 3-2. 고급 기능: 주요 기능 (0) | 2025.03.21 |