사내 ElasticCache Redis 엔진 버전을 업데이트를 위해 체크했던 포인트와 과정을 설명하고자 합니다.
다른 분들도 도움이 되었으면 좋겠습니다.
결론 부터 말하자면 ElasticCache 엔진 업데이트 시 서비스의 다운타임 및 데이터 유실은 발생하지 않으며
ElasticCache 파라미터 그룹을 체크하면 되겠습니다.
1. 라이브러리 의존도 체크
기본 적으로 사용하는 프로젝트내의 Redis 7 버전에 대한 지원과 의존도를 체크해봅니다.
저희 프로젝트는 아래 4가지의 라이브러리의 Redis의존도가 있었으며 이는 Document나 관련 로직을 수정하면 되겠습니다.
- Spring data redis
- Jedis
- Redis-session-manager
- Spring data Redis Session
2. 파라미터 그룹 체크
버전 별 파라미터 그룹을 체크해봅니다.
여기서 databases 파라미터는 값이 달라지면 바로 마이그레이션이 안됨으로 서비스 이관이 필요..
참고 AWS 도큐먼트 : https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/ParameterGroups.Redis.html#ParameterGroups.Redis.7
사내의 변경점은 ziplist 자료구조가 Listpack으로 대체가 되었단 점 (사내에는 해당자료구조를 쓴 로직이 없었기에 바로 가능)
3. 서비스의 다운타임 및 데이터 유실을 검증해보자
다운타임이나 데이터 유실은 발생되지 않음을 알고는 있었으나 확실한 검증이 필요했었습니다.
이에 따라 JAVA 레투스를 이용하여 검증을 진행하였습니다.
while (true) {
RedisClient client = null;
try {
//커넥션 1초 연결
Thread.sleep(1000);
client = RedisClient.create(REDIS_URL);
try (StatefulRedisConnection<String, String> connect = client.connect()) {
//타임아웃 설정 2초
client.setDefaultTimeout(Duration.ofMinutes(2));
RedisCommands<String, String> syncCommands = connect.sync();
String value = syncCommands.get("key");
//이미 데이터를 Hello, Redis!를 가진상태 체크
if ("Hello, Redis!".equals(value)) {
System.err.println(LocalDateTime.now() + "value is not correct!");
} else {
System.out.println(LocalDateTime.now() + "OK");
}
} catch (Exception e) {
System.err.println(LocalDateTime.now() + "Error");
e.printStackTrace();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (client != null) {
client.shutdown();
}
}
}
검증 콘솔 예시
정상
유실 발생
검증 결과 다운타임, 데이터 유실이 발생하지 않았습니다.
4. 버전 업그레이드
파라미터 그룹을 해당 버전에 맞추어 작성 후 AWS 콘솔에서 해당 클러스터를 수정 누르고 엔진 버전만 바꾸면 끝
마무리
제가 진행했던 버전 업그레이드 시 체크사항들을 공유해 드렸습니다.
상황에 맞게 적용하고 도움이 되었으면 좋겠네요 😄