로그인 시 사용 및 발급되는 Access Token, Refresh Token 저장에 Redis를 사용하고 있었으며, Google Cloud의 관리형 쿠버네티스 서비스 GKE에서 Deployment로 배포하여 사용 중이었다.
문제는 Redis의 Persistence 설정을 주지 않아 클라우드 벤더사(Google)의 노드 관리 작업으로 인해 Pod가 노드에서 추출될 때 Redis 메모리의 데이터가 소실되었다.(사실 당연히 발생할 수 밖에 없는 문제였다.)
문제는 JWT 형식의 Access Token의 유효 기한이 30분이라, 최대 30분 뒤에는 모든 클라이언트의 로그인이 풀린다는 점이었다.
위 문제 상황으로 인해 Redis Persistence는 필수로 설정하고, Cluster 단위의 설정까지 필요한지 확인해보기로 했다.
일정 주기마다 메모리 내의 데이터셋을 스냅샷으로 백업하는 방식이다.
장점
단점
모든 쓰기 작업 명령을 파일로 저장하는 백업 방식이다.
장점
단점
RDB, AOF 중 하나만 선택해야 하는게 아니고 둘 다 사용할 수도 있다.
일반적으로 Redis Image를 그대로 Deployment로 배포하는 경우 StandAlone으로 작동하며, Redis 인스턴스를 하나만 사용해 Write, Read가 같은 단일 엔드포인트를 사용하게 된다.
장점
단점
Master 인스턴스와 그 복제본인 Replica 인스턴스를 분리하여 읽기 전용으로 사용하는 운영 모드이다.
읽기/쓰기 두 개의 엔드포인트를 두어 쓰기 작업과 읽기 작업의 트래픽 분리가 가능하다.
RedisClient client = RedisClient.create();
RedisURI uri = RedisURI.Builder
.sentinel("sentinel-host", "mymaster")
.withSentinel("sentinel-host2")
.withSentinel("sentinel-host3")
.build();
StatefulRedisConnection<String, String> conn = client.connect(uri);장점
단점
Failover도 시간이 소요되기 때문에 완전한 무중단 운영은 불가능하다.
데이터를 여러 노드에 분산 저장(샤딩)하면서, 다중 Master-Replica 구조로 고가용성까지 지원하는 Redis의 확장형 모드이다.
장점
단점
아래의 이유로 Redis StandAlone에 Persistence는 AOF + RDB로 대응하기로 결정했다.
추후 트래픽 증가나 다른 데이터 저장 용도로 Redis를 확장하게 된다면 Replication 또는 Cluster로 전환을 고려해야할 듯 싶다.