Kubernetes 환경에서 Redis 데이터 조회하기: 실전 가이드

Kubernetes 환경에서 Redis 데이터 조회하기: 실전 가이드

들어가며

Kubernetes 클러스터에서 운영 중인 Redis의 데이터를 조회해야 할 때가 종종 있습니다. 디버깅, 모니터링, 또는 데이터 검증을 위해 Redis 콘솔에 직접 접속해야 하는 상황에서 이 가이드가 도움이 되길 바랍니다.

Redis Pod 접속하기

1. Redis Pod 찾기

먼저 실행 중인 Redis Pod를 찾아야 합니다:

# Redis Pod 목록 확인
kubectl get pods -n <namespace> | grep redis

2. Redis CLI로 접속

두 가지 방법으로 Redis에 접속할 수 있습니다:

# 방법 1: 직접 redis-cli 실행
kubectl exec -it <redis-pod-name> -n <namespace> -- redis-cli

# 방법 2: Pod 쉘로 접속 후 redis-cli 실행
kubectl exec -it <redis-pod-name> -n <namespace> -- /bin/bash
redis-cli

패스워드가 설정된 경우:

# 패스워드와 함께 접속
kubectl exec -it <redis-pod-name> -n <namespace> -- redis-cli -a <password>

데이터 조회 명령어

기본 조회 명령어

Redis에서 자주 사용하는 데이터 조회 명령어들입니다:

# 모든 키 조회
KEYS *

# 특정 패턴의 키 조회
KEYS user:*

# 키 타입 확인
TYPE <key>

# 데이터 타입별 조회
GET <key>                    # String
HGETALL <key>                # Hash
LRANGE <key> 0 -1           # List
SMEMBERS <key>              # Set
ZRANGE <key> 0 -1 WITHSCORES # Sorted Set
⚠️ 주의: 프로덕션 환경에서 KEYS * 명령은 성능 문제를 일으킬 수 있습니다. 대량의 데이터가 있는 경우 SCAN 명령어 사용을 권장합니다.

TTL(Time To Live) 확인

키의 만료 시간을 확인하는 것은 캐시 관리에서 매우 중요합니다:

# 남은 수명 확인 (초 단위)
TTL <key>

# 남은 수명 확인 (밀리초 단위)
PTTL <key>

TTL 명령어 반환 값의 의미:

  • 양수: 남은 시간(초)
  • -1: 만료 시간이 설정되지 않음 (영구 보존)
  • -2: 키가 존재하지 않음

모든 키의 TTL 일괄 확인

실무에서 유용한 스크립트입니다:

kubectl exec -it <redis-pod> -n <namespace> -- redis-cli --eval "
local keys = redis.call('keys', '*')
for i=1,#keys do
    local ttl = redis.call('ttl', keys[i])
    if ttl > 0 then
        print(keys[i] .. ': ' .. ttl .. ' seconds')
    elseif ttl == -1 then
        print(keys[i] .. ': no expiry')
    end
end
" 0

Redis Cluster 모드 특이사항

Redis Cluster를 사용하는 경우 몇 가지 제약사항이 있습니다:

Database 선택 불가

127.0.0.1:6379> SELECT 1
(error) ERR SELECT is not allowed in cluster mode

Redis Cluster는 오직 database 0만 사용할 수 있습니다. 만약 Spring Boot에서 spring.redis.database=1과 같이 설정했다면, 이는 Cluster 모드와 호환되지 않습니다.

해결 방법

1. 키 네임스페이스 활용

Database를 구분하는 대신 키 prefix를 사용하여 논리적으로 분리합니다:

@Service
public class RedisService {
    private static final String DB_PREFIX = "db1:";
    
    public void set(String key, String value) {
        redisTemplate.opsForValue().set(DB_PREFIX + key, value);
    }
    
    public String get(String key) {
        return redisTemplate.opsForValue().get(DB_PREFIX + key);
    }
}

2. 모든 노드 데이터 조회

Cluster 모드에서는 데이터가 여러 노드에 분산되어 있으므로, 전체 데이터를 보려면 모든 노드를 확인해야 합니다:

# 모든 Redis 클러스터 노드의 키 조회
for i in {0..5}; do
  echo "=== Node $i ==="
  kubectl exec -it my-release-redis-cluster-$i -n <namespace> -- redis-cli --scan
done

실전 팁

1. 성능을 고려한 조회

# KEYS 대신 SCAN 사용
SCAN 0 MATCH user:* COUNT 100

2. 파이프라인으로 여러 명령 실행

echo -e "INFO\nDBSIZE\nKEYS *" | kubectl exec -i <redis-pod> -n <namespace> -- redis-cli

3. 결과를 파일로 저장

kubectl exec -it <redis-pod> -n <namespace> -- redis-cli --scan > redis_keys.txt

마치며

Kubernetes 환경에서 Redis를 운영할 때는 Standalone 모드와 Cluster 모드의 차이를 이해하는 것이 중요합니다. 특히 Cluster 모드의 제약사항을 알고 있어야 예상치 못한 문제를 피할 수 있습니다.

데이터 조회 시에는 항상 프로덕션 환경에 미칠 영향을 고려하여, KEYS * 같은 무거운 명령어는 피하고 SCAN을 사용하는 것을 권장합니다.


태그: #Kubernetes #Redis #DevOps #Database #Cluster