EQVPS
대시보드시작하기

VPS에 Redis 설치하기: 메모리 제한, 영속성, 사라지지 않는 비밀번호

Ubuntu 24.04에 Redis를 설치하고, 서버 전체를 차지하지 않도록 메모리를 제한하고, 데이터를 지우지 않고 AOF를 켜고, 재시작해도 유지되는 비밀번호를 설정합니다. 이 중 두 단계에는 저희가 테스트 서버에서 직접 빠진 함정이 있습니다.

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를 돌린 결과입니다.

테스트초당 요청 수지연 시간 중앙값
SET30,3031.0 ms
GET35,1490.9 ms
SET, 왕복당 명령 16개272,1092.4 ms
GET, 왕복당 명령 16개414,9381.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로 합니다.

자주 묻는 질문

Redis에는 RAM이 얼마나 필요한가요?

Redis 자체는 아주 작습니다. 저희 서버에서 설치 직후 13.5 MB였습니다. 필요한 것은 데이터를 둘 공간인데, 데이터가 메모리에 있기 때문입니다. maxmemory를 서버가 내줄 수 있는 만큼, 예를 들어 1 GB 서버라면 256 MB로 정하고, 가득 찼을 때의 동작을 고르세요.

Redis와 Valkey 중 무엇을 쓸까요?

Valkey는 Redis 7.2에서 갈라져 나온 Redis 포크로, 같은 프로토콜을 쓰기 때문에 대부분의 클라이언트가 둘 다에서 동작합니다. Ubuntu 24.04에는 Redis 7.0.15만 있습니다. Debian 13에는 Redis 8.0과 Valkey 8.1이 모두 있고, Debian 12는 backports에서 Valkey 8.0을 받을 수 있습니다. 이 가이드의 단계는 둘 다에 적용됩니다.

왜 Redis는 장애 후 데이터를 잃나요?

기본적으로 Redis는 바뀐 키 수에 따라 몇 분마다 스냅샷을 디스크에 저장합니다. 프로세스를 강제로 종료했더니 마지막 스냅샷 이후에 쓴 키가 사라졌습니다. 매초 기록하는 AOF를 켜면 장애로 잃는 것은 많아야 약 1초 분량의 쓰기입니다.

redis.conf에 requirepass를 추가했는데 왜 Redis가 여전히 비밀번호 없이 명령을 받나요?

아마 어느 시점에 CONFIG REWRITE가 실행됐기 때문입니다. Redis 7에서는 이 명령이 redis.conf 끝에 user default on nopass ~* &* +@all 줄을 추가하고, 이 줄이 위쪽에 적은 requirepass를 무효로 만듭니다. CONFIG SET requirepass로 비밀번호를 설정한 다음 CONFIG REWRITE를 실행하면 Redis가 그 줄에 비밀번호를 저장합니다.

6379 포트를 인터넷에 열어도 되나요?

열지 마세요. 열린 Redis 포트는 끊임없이 스캔되며, 서버에 침입하는 흔한 경로입니다. 내 컴퓨터에서는 SSH 터널로 접속하거나, Redis를 사용하는 앱과 같은 서버에 두세요.

댓글

아직 댓글이 없습니다. 첫 번째가 되세요.

댓글 남기기

댓글은 표시되기 전에 검토됩니다.