Redis는 데이터를 메모리에 두고 1밀리초 안팎으로 응답하기 때문에 캐시, 큐, 세션 저장소로 수많은 앱 뒤에서 쓰입니다. 설치는 명령 하나면 됩니다. 일은 기본 설정에서 생깁니다. 메모리 제한이 없고, 스냅샷은 최근 쓰기를 잃을 수 있으며, 데이터를 조용히 지우거나 비밀번호를 꺼 버리는 흔한 실수가 두 가지 있습니다. 이 가이드는 Ubuntu 24.04에서 이 모두를 다룹니다. 모든 단계를 저희 이미지에서 직접 실행했고, 수치는 Micro 서버(2 vCPU, 2 GB)에서 측정했습니다.
sudo 권한이 있는 사용자가 필요합니다. Ubuntu 설정 가이드에서 만들 수 있습니다.
1. 설치
sudo apt update
sudo apt install -y redis-server
redis-server --version
redis-cli ping
설치에 13초가 걸렸고 Redis 7.0.15가 설치됐습니다. 바로 시작되고 부팅할 때마다 자동으로 켜지며, PONG으로 응답하고, 서버 자신에서만 수신합니다. 127.0.0.1:6379와 [::1]:6379이며 protected-mode yes 상태입니다. 데이터가 없을 때 13.5 MB의 RAM을 썼습니다.
로그에는 이미 경고가 있었습니다.
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.
Redis는 fork로 만든 자기 사본에서 디스크에 저장하는데, 커널 기본 설정에서는 메모리가 부족할 때 이 fork가 실패할 수 있습니다. 한 번만 고쳐 두세요.
echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/90-redis.conf
sudo sysctl -p /etc/sysctl.d/90-redis.conf
sudo systemctl restart redis-server
재시작 후 경고는 사라졌습니다.
2. 메모리 제한하기
기본값에서 maxmemory는 0, 즉 제한이 없고 정책은 noeviction입니다. Redis는 서버의 메모리가 바닥날 때까지 계속 가져갑니다. 상한을 정하고, 상한에 닿았을 때 어떻게 할지 고르세요.
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE
64 MB 제한과 40만 번의 쓰기로 두 정책을 모두 시험했습니다.
noeviction(기본값): 메모리가 63 MB에서 멈췄고 새 쓰기는OOM command not allowed when used memory > 'maxmemory'오류로 실패했습니다. 큐나 잃어서는 안 되는 데이터에 맞습니다.allkeys-lru: Redis가 가장 오래 쓰이지 않은 키 48,606개를 버렸고, 모든 쓰기가 성공했습니다. 캐시에 맞습니다.
CONFIG REWRITE는 실행 중인 설정을 /etc/redis/redis.conf에 저장해 재시작 후에도 유지되게 합니다. 또한 4단계 전에 알아 둬야 할 줄도 하나 추가합니다.
3. 디스크 저장 방식 고르기
기본적으로 Redis는 1시간에 1번, 5분에 100번, 1분에 1만 번의 변경 중 하나가 일어나면 스냅샷(/var/lib/redis/dump.rdb)을 씁니다. 세 가지 방법으로 멈춰 보았습니다.
| Redis가 멈춘 방식 | 스냅샷만(기본값) | AOF 사용 |
|---|---|---|
systemctl restart | 손실 없음: 종료할 때 저장 | 손실 없음 |
kill -9로 강제 종료 | 마지막 스냅샷 이후의 키가 사라짐 | 종료 2초 전에 쓴 키가 남아 있음 |
두 경우 모두 systemd가 몇 초 안에 Redis를 스스로 다시 시작했습니다.
잃으면 아쉬운 데이터가 Redis에 있다면 AOF(append-only file)를 켜세요. 모든 쓰기를 기록하고 초당 한 번 디스크에 내려씁니다. 파일을 고치지 말고, 실행 중인 서버에서 설정하세요.
redis-cli CONFIG SET appendonly yes
redis-cli CONFIG REWRITE
redis-cli INFO persistence | grep aof_
처음에는 다른 방법을 시도했다가 데이터를 잃었습니다. redis.conf의 appendonly no를 appendonly yes로 바꾸고 재시작했더니 Redis가 빈 AOF로 올라와 스냅샷에서 아무것도 읽지 않았고, 기존 키는 모두 사라졌습니다. 이후 종료할 때는 옛 키가 빠진 새 내용으로 dump.rdb까지 덮어썼습니다. CONFIG SET은 이를 피합니다. Redis가 먼저 메모리에 있는 데이터로 AOF를 쓰기 때문입니다. 재시작 후에도 키가 모두 남아 있었습니다.
Redis가 비어서 시작해도 되는 순수한 캐시라면 반대로 redis-cli CONFIG SET save ""로 저장을 끄세요.
4. 비밀번호 설정하기
두 번째 함정입니다. CONFIG REWRITE를 한 번이라도 실행하면 Redis 7은 redis.conf 끝에 다음 줄을 추가합니다.
user default on nopass ~* &* +@all
"기본 사용자는 비밀번호가 필요 없다"는 뜻입니다. 그다음 파일 위쪽에 requirepass를 추가하고 재시작했지만, Redis는 비밀번호 없이도 계속 PONG으로 응답했습니다. user 줄이 우선하기 때문입니다. 비밀번호는 Redis를 통해 설정하세요.
REDIS_PASS=$(openssl rand -hex 24)
echo "$REDIS_PASS"
redis-cli CONFIG SET requirepass "$REDIS_PASS"
REDISCLI_AUTH="$REDIS_PASS" redis-cli CONFIG REWRITE
비밀번호는 안전한 곳에 보관하세요. 이제 Redis는 같은 user default 줄에 SHA-256 해시로 저장합니다. 재시작 후 redis-cli ping은 NOAUTH Authentication required.를 반환했고, 비밀번호를 줄 때만 통과했습니다. redis-cli에는 REDISCLI_AUTH 변수로 넘기세요. -a를 쓰면 프로세스 목록에 보이고 redis-cli도 경고합니다. 앱에서는 Redis URL에 넣으세요: redis://:PASSWORD@127.0.0.1:6379/0.
5. 내 컴퓨터에서 접속하기
Redis는 127.0.0.1에 두고 SSH 터널을 쓰세요. 서버의 SSH 포트를 지정하는데, NAT 요금제에서는 개인 포트입니다.
ssh -N -L 6380:127.0.0.1:6379 deploy@YOUR_SERVER_IP -p 22
이것이 실행되는 동안 내 컴퓨터의 redis-cli -p 6380과 데스크톱 도구가 서버의 Redis와 통신합니다. 인터넷에 새로 열리는 것은 없습니다. SSH 키 가이드를 따르면 터널이 비밀번호 없이 로그인합니다.
얼마나 빠른가
Micro 테스트 서버에서 클라이언트 50개로 redis-benchmark를 돌린 결과입니다.
| 테스트 | 초당 요청 수 | 지연 시간 중앙값 |
|---|---|---|
| SET | 30,303 | 1.0 ms |
| GET | 35,149 | 0.9 ms |
| SET, 왕복당 명령 16개 | 272,109 | 2.4 ms |
| GET, 왕복당 명령 16개 | 414,938 | 1.3 ms |
웹 앱의 캐시나 작업 큐로는 필요한 것보다 훨씬 많습니다. 추가 속도는 명령을 묶어서 보내는 파이프라이닝에서 나옵니다.
어떤 요금제
Redis에는 데이터용 RAM이 필요하고 그 밖에는 거의 필요 없습니다. Nano(2 vCPU, 1 GB, 월 $3)는 maxmemory 256mb로 작은 앱 옆에서 Redis를 돌립니다. Micro(2 GB, 월 $5)는 더 큰 캐시와 앱을 위한 여유가 있습니다. 다른 곳에서 Redis에 직접 접속해야 한다면 전용 IPv4(Nano-IP, 월 $8부터)를 쓰고 방화벽에서 그 주소만 허용하세요. 모든 요금제는 VPS 페이지에 있고, 결제는 Base, Ethereum, Polygon 네트워크의 USDT, USDC, ETH로 합니다.
댓글
아직 댓글이 없습니다. 첫 번째가 되세요.