안녕세계
[AWS] Amazon ElastiCache Valkey 업그레이드 (feat. Redisson) 본문
[AWS] Amazon ElastiCache Valkey 업그레이드 (feat. Redisson)
Junhong Kim 2025. 3. 30. 19:46지난, 2024년 10월 8일 Amazon ElastiCache에서 Valkey 버전 7.2에 대한 지원이 발표되었습니다. Valkey 캐시 리소스의 Serverless 가격은 Redis OSS 대비 33% 낮은 가격, 자체 설계(노드 기반)의 Cluster 가격은 Redis OSS 대비 20% 낮은 가격으로 이용할 수 있다고 합니다.

Valkey에 대해 처음들어 보시는 분들도 있을 것 같은데요. Valkey는 Linux Foundation에서 구축한 오픈 소스이며, Redis OSS 7.2 버전과 완벽하게 호환됩니다. Valkey는 Redis OSS를 대체하는 제품으로 Valkey 전환시 캐시 비용을 절감하고, 최신 ElastiCache 기능의 이점을 누릴 수 있다고 합니다. 캐시 비용 절감을 위해 많은 분들이 Redis OSS에서 Valkey로 전환을 고려하고 있을 것 같은데요. 본 포스팅에서는 Redis OSS에서 Valkey로 전환하는 과정에 대해 시행 착오와 전환 방법을 다룹니다.

Redis OSS용 ElastiCache에서 Valkey용 ElastiCache로 업그레이드
AWS 공식 블로그에서 Redis OSS용에서 Valkey용으로 전환하는 방법을 상세하게 소개하고 있습니다. 이미, AWS 공식 블로그에 전환 방법에 대한 글이 있으므로 본 포스팅에서는 간략하게 다루겠습니다. Redis OSS의 기존 사용자 분들은 다운타임 없이 Valkey로 빠르게 업그레이드할 수 있다고 되어있는데요. 기존 Redis OSS를 Valkey로 전환하기로 결정하신 분들은 콘솔에서 다음 화면에서 손 쉽게 Valkey로 업그레이드 할 수 있습니다.
업그레이드 환경
- Redis OSS 7.1.0 -> Valkey 8.0


Valkey 업그레이드시 순단 테스트
운영 환경 Valkey 업그레이드 전, 베타 환경 Valkey 업그레이드를 먼저 실행했습니다. 앞서 소개한 것처럼 ElastiCache에서 Valkey로 업그레이드 하기 위한 방법은 쉬웠지만, 업그레이드시 순단이 5분~10분 간 발생했습니다. 따라서, Redis OSS 엔진을 사용하면서 Redisson Client를 사용하는 기능들에서 에러가 발생하며 순단이 발생하는 것을 알 수 있었습니다. 다행히도 베타 환경이기 때문에 문제가 없었지만, 이 상태로는 운영 환경에서 Valkey로 업그레이드 하기는 어려운 상황이므로, 순단을 해결하기 위해 Redisson Client의 다양한 설정을 바꿔보며 순단 테스트를 해보았습니다.
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
순단 테스트1
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
- 노드 엔드포인트 사용
- 커넥션 풀 미사용
결과
- 순단 발생 ⚠️
순단 테스트를 위해서, 매 초당 많은 커넥션 연결을 새로하고 CMD 작업을 하는 기능을 추가했습니다. (즉, 커넥션 풀을 사용하지 않은 상태로 테스트했습니다) 그리고 운영 환경의 Redisson Client 설정을 보니, node endpoint를 사용하는 것을 사용하는 것을 확인했고, 동일하게 node endpoint를 사용하여 순단을 재현했습니다.

val config = Config()
config.useReplicatedServers()
// 노드 엔드포인트 사용
.addNodeAddress(
"redis://jhk-elasticache-001.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
"redis://jhk-elasticache-002.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
"redis://jhk-elasticache-003.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
)
ElastiCache Redis를 생성하면 primary 노드 1개와 replica 노드 2개로 총 3개의 노드가 생성되는데. 이때,
primary 노드가 기본 엔드포인트에 매핑됩니다. 만약 Redis 노드 장애가 발생할 경우 failover로 primary 노드가 바뀌며 새롭게 선출된 primary 노드가 기본 엔드포인트에 매핑됩니다. 따라서, primary나 replica 엔드포인트가 아닌 기본 엔드포인트를 사용해야합니다. (참고로 DataGrip에서 직접 replica 엔드포인트로 접속하려고하면 연결에 실패하고 primary 엔드포인트에 접속하면 정상 접속된다.)
순단 테스트2
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
- 기본 엔드포인트 사용
- 커넥션 풀 미사용
결과
- 순단 미발생 ✅
ElastiCache Redis OSS 엔진을 클러스터 캐시로 생성하면 primary 노드 1개와 replica 노드 2개로 총 3개의 노드가 생성됩니다. 이때, primary 노드가 기본 엔드포인트에 매핑됩니다. 만약 Redis 노드 장애가 발생할 경우 failover로 primary 노드가 바뀌며 새롭게 선출된 primary 노드가 기본 엔드포인트에 매핑됩니다. 따라서, primary나 replica 엔드포인트가 아닌 기본 엔드포인트를 사용해야합니다.
참고: DataGrip에서 직접 replica 엔드포인트로 접속하려고하면 연결에 실패하고 primary 엔드포인트에 접속하면 정상 접속됩니다.
따라서, 이번에는 기본 엔드포인트를 사용하고, 커넥션 풀을 사용하지 않고 테스트해보았습니다. 그 결과 순단이 발생하지 않는 것을 확인했습니다. 하지만, 운영 환경에서는 커넥션 풀을 사용하고 있으므로 완전히 동일한 환경에서의 테스트라고 보기는 어려웠습니다.

val config = Config()
config.useReplicatedServers()
// 기본 엔드포인트 사용
.addNodeAddress(
"redis://master.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
)
순단 테스트3
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
- 기본 엔드포인트 사용
- 커넥션 풀 사용
결과
- 순단 발생 ⚠️
세 번째 테스트에서는 기본 엔드포인트와 커넥션 풀을 사용하고, Valkey 업그레이드를 하자 순산 테스트1과 동일하게 순단이 발생했습니다. 이 부분에서 DBA 분과 함께 순단 발생과 순단 복원의 원인을 발견했습니다.
- 업그레이드 과정에서 신규 Valkey 노드가 기존 Primary에 replication에 붙습니다.
- failover가 진행되면 기존 master 노드가 valkey primary에 slave로 연결 됩니다.
- 기존 master 노드가 삭제됨과 동시에 순단이 복원됩니다.
- 즉, 커넥션 풀을 사용하기 떄문에 기존 master 에 연결된 노드들은 failover 이후 노드가 replica 된 이후에도 기존 master 노드를 바라보고 있는 것을 확인했습니다. 따라서, 애플리케이션에서는 다음과 같은 에러 메시지를 반환했습니다.
InvalidDataAccessApiUsageException: READONLY You can't write against a read only replica
기존 master 노드가 업그레이드 프로세스에 의해 물리적으로 삭제되면, 연결이 유효하지 않음을 인지하고 커넥션을 끊고 재연결이 되면서 순단이 해소됩니다. 이러한 과정이 기존 업그레이드시 5분~10분이 소요된 것으로 파악되었습니다.
순단 테스트4
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
- 기본 엔드포인트 사용
- 커넥션 풀 사용
- timeout 설정 변경
결과
- 순단 발생 ⚠️
타임아웃 설정을 바꿔서 순단을 줄여보려고 했지만, 동일하게 순단이 발생했습니다. 그리고 신규 마스터에서 기존 마스터 삭제되는 시점에 맞춰 순단 복원 되는 것을 한 번 더 확인했습니다.
Config config = new Config();
config.useReplicatedServers()
// 기본 엔드포인트 사용
.addNodeAddress(
"redis://master.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
)
.setScanInterval(3_000) // default 5_000 -> 3_000
.setRetryAttempts(10) // default 5 -> 10
.setRetryInterval(3_000) // default 1_500 -> 3_000
.setConnectTimeout(5_000); // default 10_000 -> 5_000
순단 테스트5
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
- 기본 엔드포인트 사용
- 커넥션 풀 사용
- timeout 설정 변경
- failedSlaveNodeDetector 설정 변경
결과
- 순단 발생 ⚠️
failedSlaveNodeDetector 설정 값을 FailedCommandsDetector로 변경하여 커맨드 오류 개수를 기준으로 오류 노드를 감지를 위해 테스트해보았습니다. 그러나 애플리케이션에서 CMD 오류 개수에 대한 새로운 에러가 출력되지만, 기존 master 노드에 맺어진 커넥션이 끊어지지 않고 유지됨을 확인했습니다.
Config config = new Config();
config.useReplicatedServers()
// 기본 엔드포인트 사용
.addNodeAddress(
"redis://master.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
)
.setScanInterval(3_000) // default 5_000 -> 3_000
.setRetryAttempts(10) // default 5 -> 10
.setRetryInterval(3_000) // default 1_500 -> 3_000
.setConnectTimeout(5_000) // default 10_000 -> 5_000
.setFailedSlaveNodeDetector(new FailedCommandsDetector(10_000, 3));
순단 테스트6
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
- 기본 엔드포인트 사용
- 커넥션 풀 사용
- failedSlaveNodeDetector 설정 변경
결과
- 순단 발생 ⚠️
기존 노드에 연결이 물려있는게 문제가 된다는 것을 파악했으므로, 수동으로 DBA 분이 커맨드를 실행해서 기존 마스터에 남아있는 커넥션을 kill 해보았습니다.
> CLIENT KILL TYPE normal
하지만, kill 이후 다시 연결이 새로 생성되고 애플리케이션에서는 새로운 에러가 발생했습니다.
RedisTimeoutException: Command execution timeout for command: (INFO REPLICATION)
순단 테스트7
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
- 기본 엔드포인트 사용
- 커넥션 풀 사용
- monitorIPChanges 설정 변경
결과
- 순단 미발생 ✅
monitorIPChanges
Default value: false
Check each Redis or Valkey hostname defined in the configuration for IP address changes during the scan process.
Redisson Client에 보면 monitIPChanges 라는 것이 있는데, 기본 값이 false 인 것을 확인할 수 있었습니다. 따라서, 이 설정을 true로 변경하여 테스트해 보았습니다. 그 결과 Redis에서도 기존 마스터에 연결 바로 빠지는것 확인하고 애플리케이션에서도 순단 없이 바로 넘어가는것 확인할 수 있었습니다.
Config config = new Config();
config.useReplicatedServers()
// 기본 엔드포인트 사용
.addNodeAddress(
"redis://master.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
)
.setMonitorIPChanges(true); // default false -> true
순단 테스트8
업그레이드 환경
- Redis 7.1 -> Valkey 8.0
- Redisson Client 사용
- 노드 엔드포인트 사용
- 커넥션 풀 사용
- monitorIPChanges 설정 변경
결과
- 순단 미발생 ✅
운영 환경에서는 노드 엔드 포인트를 사용하고 있었으므로, 노드 엔드포인트를 사용할 때에는 순단이 발생하는지 파악하기 위해 한 번 더 테스트를 진행했습니다. 그 결과 이번에도 순단 없이 바로 새로운 노드로 재연결되는것을 확인했습니다. 따라서, 운영 환경에서 엔드포인트를 변경할 필요없이 setMonitorIPChanges(true) 설정 추가만으로 업그레이드 시 발생하는 순단을 해결할 수 있음을 확인할 수 있었습니다.
Config config = new Config();
config.useReplicatedServers()
// 노드 엔드포인트 사용
.addNodeAddress(
"redis://jhk-elasticache-001.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
"redis://jhk-elasticache-002.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
"redis://jhk-elasticache-003.jhk-elasticache.8vqaql.apn2.cache.amazonaws.com:6379",
)
.setMonitorIPChanges(true); // default false -> true
결론

ElastiCache는 DNS 기반 엔드포인트를 사용하기 때문에, 엔진 업그레이드나 스펙 변경 등의 작업 중에 IP 주소가 변경될 수 있습니다. 따라서, MonitorIPChanges 옵션을 true로 설정하면, IP 주소 변경 여부를 감지하여 변경이 확인될 때 자동으로 연결을 갱신해 새로운 IP 주소로 전환할 수 있었습니다.
MonitorIPChanges 옵션 변경 후 Valkey 업그레이드를 진행하여, 기존에 5분~10분 동안 순단이 발생하던 노드에서 순단 없이 즉시 전환이 가능한 것을 테스트를 통해 확인했으며, 노드 엔드포인트와 기본 엔드포인트 모두에서 순단 없이 작동하는 것으로 확인할 수 있었습니다.
참고
https://redisson.pro/docs/configuration/#replicated-settings
https://aws.amazon.com/ko/blogs/database/get-started-with-amazon-elasticache-for-valkey/
https://aws.amazon.com/ko/blogs/tech/get-started-with-amazon-elasticache-for-valkey/
'Infra > AWS' 카테고리의 다른 글
[AWS] Amazon SNS (0) | 2023.12.20 |
---|---|
[AWS] Amazon SQS (3) | 2023.11.30 |
[AWS] AmazonMQ (feat. ActiveMQ) (0) | 2023.10.31 |
[AWS] ECR에 SpringBoot Docker Image 올리기 (0) | 2021.04.17 |