밤 늦게 알람 울렸다. Redis 연결 에러 ECONNREFUSED 127.0.0.1:6379
. 급하게 RedisInsight 켜려고 했는데 Wine 실행 에러나고 개짜증남. 그래서 redis-cli
쳤는데 바로 들어가짐. 아 진짜 왜 처음부터 이거 안 썼나 싶었음.
Redis 깔면 redis-cli도 같이 깔린다. 터미널에서 Redis 바로 건드릴 수 있다.
CLI 쓰는 이유 - 실제 경험담
4시간 삽질하고 깨달은 교훈
작년에 Redis 6점 몇 버전에서 갑자기 OOM command not allowed when used memory > 'maxmemory'
에러가 계속 나왔다. GUI 툴로는 메모리 사용량이 80% 좀 넘는다고 나오는데 뭐가 문젠지 몰랐음. redis-cli INFO memory
로 보니까 used_memory_rss
가 실제로는 거의 다 먹고 있었음.
## 진짜 메모리 상태 확인 (1초)
redis-cli INFO memory | grep used_memory
## GUI 툴보다 정확함
redis-cli --bigkeys # 큰 키들 바로 찾음
## 실시간 latency (GUI는 5초마다 업데이트)
redis-cli --latency-history
CI/CD에서 삽질한 경험
Jenkins에서 Redis health check 하려고 RedisInsight API 쓰려다가 이틀인가 삽질했음. 그냥 redis-cli PING
이면 끝나는 걸 왜 복잡하게 했나 싶었다. exit code 0이면 OK, 1이면 문제 있는 거. 개간단함 ㅋㅋ
실시간 모니터링이 진짜 중요한 이유
Docker 컨테이너에서 Redis 7점 뭔가에서 갑자기 메모리가 계속 늘어났음. --stat
옵션으로 보니까 evicted_keys:0
이었는데 used_memory
는 계속 증가. maxmemory 설정 안 된 거였음. GUI로는 이런 실시간 변화 추적이 존나 힘들다.
실제로 써보면 알게 되는 기능들
Interactive 모드 - 주의사항 있음
그냥 redis-cli
치면 localhost:6379로 들어간다. 근데 Redis 4.x에서는 INFO
명령어 결과가 좀 다르고, 6.x부터는 ACL 기능 있어서 AUTH
먼저 해야 할 수도 있음. TAB 자동완성은 Redis 5.0부터 제대로 됨.
대량 처리 - 잘못하면 서버 죽음--pipe
모드로 백만 개 키 넣다가 Redis 서버 메모리 터뜨린 적 있음. 한 번에 10만 개씩 나눠서 넣는 게 안전함. 그리고 파이프 형식 잘못 만들면 ERR Protocol error
나니까 주의.
모니터링 - 각각 언제 쓰는지 알아야 함
--latency
: 실시간 ping 측정. 5ms 넘으면 뭔가 문제 있는 거--bigkeys
: 큰 키 찾기. 근데 데이터 많으면 오래 걸림 ㅋㅋ--memkeys
: 정확한 메모리 측정. 존나 느림. production에서 쓰면 죽음--monitor
: 모든 명령어 보기. 로그 폭탄 주의. 오래 키면 개짜증
Cluster - 삽질 포인트 많음
Redis Cluster 쓸 때 -c
옵션 안 붙이면 MOVED
에러 계속 나옴. 그리고 cluster 노드 중 하나만 죽어도 해당 slot range 접근 안 됨. 이런 건 GUI에서 잘 안 보임.
작년에 겪은 실제 장애들
메모리 90% 넘어가서 서비스 멈춘 사건
어느 날 갑자기 (error) OOM command not allowed when used memory > 'maxmemory'
에러 떴음. redis-cli --bigkeys
로 보니까 user:session:*
키들이 엄청 크게 먹고 있었음. 개발자가 세션에 통째로 JSON 박아놨더라. GUI로는 큰 키 찾는데 오래 걸렸는데 CLI는 금방 끝남.
## 메모리 터지기 전에 미리 확인 (30초 소요)
redis-cli --bigkeys
## 이거는 하지 마라 (production에서 15분 걸림)
redis-cli --memkeys
새벽에 connection refused 에러로 깨어난 날ECONNREFUSED 10.0.1.50:6379
에러로 알람 받고 일어났음. AWS ElastiCache 인스턴스가 failover 된 거였는데, 새 primary 주소로 바로 redis-cli -h new-host PING
쳐서 확인했음. GUI 켜고 connection 설정하는데 시간 엄청 걸렸을 거임.
Redis 반응 개느려서 타임아웃나는 문제
갑자기 응답속도가 엄청 느려지면서 앱에서 timeout 에러 나기 시작함. redis-cli --latency-history
로 보니까 밤에부터 느려졌음. MONITOR
켜서 보니 KEYS user:*
명령어가 계속 실행되고 있었음. 어떤 개발자가 production에서 키 찾는다고 KEYS
써서 서버 블로킹 시킨 거였다. 개머리 아픔
## 언제부터 느려졌나?
redis-cli --latency-history
## 뭔 명령어가 문제인가?
redis-cli MONITOR
한국 회사에서 실제로 겪는 개짜증나는 일들
NCP에서 bastion 거쳐야 하는 지옥
네이버 클라우드 Redis는 private subnet에 있어서 매번 bastion 서버 거쳐야 함. SSH 터널링으로 포트포워딩 하고 redis-cli -h localhost -p 6379
로 연결하는데, 이거를 GUI로 하려면 설정이 존나 복잡함. 그냥 터미널이 낫다.
Docker 환경에서 네트워크 개꼬인 상황
## Docker container 안에서 (항상 됨)
docker exec -it redis-container redis-cli
## 호스트에서 Docker Redis 연결 (포트 매핑 확인 필요)
docker port redis-container # 실제 포트 확인
redis-cli -h localhost -p 32768 # 랜덤 포트일 수 있음
대기업 보안정책이 개빡센 곳들
삼성, LG, 은행 같은 곳은 GUI 프로그램 설치하려면 보안팀 승인받아야 함. 근데 redis-cli
는 패키지 관리자로 깔면 승인 없이 됨. 그래서 개발자들 몰래 다 CLI 쓰고 있음 ㅋㅋ
Windows에서 WSL 쓸 때 또 다른 지옥
Windows 환경에서 Redis 쓰려면 WSL2 켜야 하는데, 여기서 redis-cli
치면 바로 됨. 근데 Windows용 GUI 프로그램은 WSL 안의 Redis 연결이 잘 안 될 때가 많음.
redis-cli 한 번 익숙해지면 새벽에 서버 터져도 5분 안에 문제 찾을 수 있다. GUI는 예쁘긴 한데 진짜 급할 때는 터미널이 생명줄임.