쿠버네티스 환경에서 Redis-Cluster Java App 구축 ①


  개 요  

Redis-Cluster 용 Java(Spring) App

Kubernetes pod 환경에서 구축한 Redis-Cluster 용 Java(Spring) App를 작성해서 테스트합니다.


Java Spring Project

Java Spring Project 생성

Java Spring Project를 생성해서 애플리케이션을 작성해 봅니다.
Spring initializr를 사용해서 Java Spring Project를 생성하는 URL: start.spring.io

Java Spring Project 생성
  • Project: Gradle-Groovy
  • Language: Java
  • Spring Boot: 4.1.1     ➡📍IntelliJ build.gradle 파일에서 3.4.3으로 변경합니다.
  • Project Metadata
    • Group: com.redisgate
    • Artifact: KubeRedisClusterApp -> Project 명칭, 이 이름으로 압축파일이 생긴다.
    • Package name: com.redisgate.KubeRedisClusterApp -> Package Name
    • Packaging: Jar
    • Configuration: Properties
    • Java: 21 -> Java 버전 선택
  • Dependencies에서 [ADD … CTRL + B] 버튼을 클릭해서 아래 3개를 추가합니다.
    • Spring Web
    • Lombok
    • Spring Data Redis(Access+Driver)
  • 마지막으로 [GENERATE CTRL + ⏎ ] 버튼 클릭해서 압축 파일(zip)을 다운받는다.

🖥️ File/Class 구성

💾 build.gradle 파일

  • 위치: workspace\KubeRedisClusterAsync\build.gradle
  • 'org.springframework.boot' version '4.1.0' -> '3.4.3' 수정
  • 'webmvc' -> 'web' 2곳 수정 -> '3.4.3'으로 낮추면 'webmvc'가 에러 발생해서 'web'으로 수정해야 함
  • 아래 2개 라이브러리 추가
    implementation 'org.springframework.retry:spring-retry' // Spring Retry 라이브러리를 추가
    implementation 'org.springframework:spring-aspects' // AOP 지원
  • IntelliJ 화면 오른쪽 상단 '코끼리(Gradle)' 아이콘 클릭 -> 메뉴 중 '새로 고침' 아이콘 '모든 Gradle 프로젝트 다시 로드(Reload All Gradle Projects)' 클릭
  • 하단 상태 표시줄에 빌드가 끝날 때까지 기다림
📄 build.gradle

💾 Dockerfile 파일

• 위치: workspace\KubeRedisClusterAsync\Dockerfile

📄 Dockerfile

💾 application.properties 파일

• 위치: workspace\KubeRedisClusterAsync\src\main\resources\application.properties
• 'spring.data.redis.cluster.nodes'에 아래와 같이 'redis-cluster-0부터 5까지 모두 기록하세요.

📄 application.properties

💾 KubeRedisClusterAppApplication.java 파일

📄 KubeRedisClusterAppApplication.java

💾 RedisClusterConfig.java 파일

주요 설정에 📍 표시했음(주석 참조)

📄 RedisClusterConfig.java

✅ commandTimeout()과 timeoutOptions()은 무엇이 다른가?

  • 1. Spring 설정: commandTimeout(Duration.ofSeconds(1))
    • 적용 위치: `LettuceClientConfigurationBuilder` (Spring Data Redis의 상위 설정)
    • 주요 역할: Spring Data Redis가 Lettuce 클라이언트를 통해 명령을 보낼 때 사용하는 기본 동기적 커맨드 실행 타임아웃 입니다.
    • 동작 방식: `RedisTemplate`이나 `StringRedisTemplate`을 사용할 때 Redis 서버로부터 1초 이내에 응답(Response)이 오지 않으면 `QueryTimeoutException` 또는 `RedisCommandTimeoutException`을 발생 시킵니다.
    • 특징: 가장 표준적인 기본 설정값으로, 특별한 TimeoutOptions가 정의되어 있지 않다면 Lettuce가 내부적으로 이 값을 기본 타임아웃으로 사용하여 명령을 취소합니다.
  • 2. Lettuce 설정: timeoutOptions(TimeoutOptions.enabled(Duration.ofSeconds(1)))
    • 적용 위치: `ClientOptions` (Lettuce 드라이버 자체 Native 옵션)
    • 주요 역할: Lettuce 내부 엔진 레벨에서 각 커맨드의 수명 주기(Lifecycle) 및 타임아웃 처리 전략을 정밀 제어합니다.
    • 동작 방식: Lettuce의 비동기/반응형(Reactive) 파이프라인 내부에서 명령(Command)이 발송된 후 1초 동안 결과 응답이 없거나 네트워크 지연으로 응답을 못 받으면 해당 커맨드 커스텀 타임아웃 스케줄러가 개입하여 명령을 강제 취소(Cancel)합니다.
    • 특징:
      - 더 정밀한 실패 제어: `disconnectedBehavior(REJECT_COMMANDS)` 옵션과 조합되었을 때, 서버와의 연결이 끊기거나 재연결(Reconnect) 중일 때 큐(Queue)에 대기 중인 커맨드들이 무한정 갇히지 않고 1초 만에 즉시 취소 처리되도록 강력하게 강제합니다.
      - 동적 타임아웃(Dynamic Timeout) 가능: `TimeoutOptions`는 단일 `Duration` 뿐만 아니라 커맨드 종류(READ/WRITE)나 상황에 따라 타임아웃을 다르게 적용할 수 있는 `TimeoutSource`를 지원합니다. (예: `GET`은 500ms, `FLUSHALL`은 5s 등)

💾 RedisOperationService.java 파일

📄 RedisOperationService.java

💾 RedisFailoverTestService.java 파일

📄 RedisFailoverTestService.java

App Docker 이미지 빌드, YAML 파일

App Docker 이미지 빌드

  • 1) 컴파일(make)
    IntelliJ [KubeRedisClusterApp]> ./gradlew clean bootJar
  • 2) 'KubeRedisClusterApp-0.0.1-SNAPSHOT.jar', 'Dockerfile': 2개 파일을 서버(~/kube/app/cluster/)로 전송한다.
    Local PC(노트북) dir 예)
    ① app\IntelliJ\workspace\KubeRedisClusterApp\build\libs\KubeRedisClusterApp-0.0.1-SNAPSHOT.jar
    ② app\IntelliJ\workspace\KubeRedisClusterApp\Dockerfile
  • 3) 도커 이미지 빌드 (서버에서 작업)
    [~/kube/app/cluster/] $ docker build -t spring-redis-cluster-app:1.0 .
  • 4) 생성된 도커 이미지를 k3s 내부(containerd)로 직접 임포트
    [~/kube/app/cluster/] $ docker save spring-redis-cluster-app:1.0 | sudo k3s ctr images import -

💾 app-deployment.yaml 파일

서버 "~/kube/app/cluster/" dir에 작성

📄 app-deployment.yaml

➡ 이제 Java App 파드 생성했으니 Failover(장애 조치) 테스트하러 갑시다.


<< K8s Redis-Cluster 테스트 ③ K8s Redis-Cluster App ② >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.