k8s_redis_sentinel_java_app_1
쿠버네티스 환경에서 Redis-Sentinel Java App 구축 ①
개요
Redis-Sentinel 용 Java(Spring) App
Kubernetes pod 환경에서 구축한 Redis-Sentinel 용 Java App를 작성해서 테스트한다.
- Java 21
- Spring Boot 3.4.3
- Redis 8.8.2 🔗 Redis-Sentinel은 여기서 구축한 것을 이용한다.
- PC(노트북) IntelliJ에서 Java(Spring) app 개발
- 서버: Linux(Rocky9.6), Redis-Sentinel 실행 중임
Java Spring Project
Java Spring Project 생성
Java Spring Project를 생성해서 애플리케이션을 작성해 봅니다.
Spring initializr를 사용해서 Java Spring Project를 생성하는 URL: start.spring.io
- Project: Gradle-Groovy
- Language: Java
- Spring Boot: 4.1.0 ➡📍IntelliJ build.gradle 파일에서 3.4.3으로 변경합니다.
- Project Metadata
- Group: com.redisgate
- Artifact: KubeRedis -> Project 명칭, 이 이름으로 압축파일이 생긴다.
- Package name: com.redisgate.KubeRedis -> 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 파일
- Dockerfile 파일
- application.properties 파일
- KubeRedisApplication.java 파일
- RedisSentinelConfig.java 파일
- RedisOperationService.java 파일
- RedisFailoverTestService.java 파일
💾 build.gradle 파일
- 'org.springframework.boot' version '4.1.0' -> '3.4.3' 수정
- 'webmvc' -> 'web' 2곳 수정
- 아래 2개 라이브러리 추가
implementation 'org.springframework.retry:spring-retry' // Spring Retry 라이브러리를 추가
implementation 'org.springframework:spring-aspects' // AOP 지원 - 화면 오른쪽 상단 '코끼리(Gradle)' 아이콘 클릭 -> 메뉴 중 첫 번째 '모든 Gradle 프로젝트 다시 로드' 아이콘 클릭
💾 Dockerfile 파일
💾 application.properties 파일
'spring.data.redis.sentinel.nodes'에 아래와 같이 'sentinel-0부터 2까지 모두 기록하세요.
💾 KubeRedisApplication.java 파일
💾 RedisSentinelConfig.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 파일
💾 RedisFailoverTestService.java 파일
App Docker 이미지 빌드, YAML 파일
App Docker 이미지 빌드
- 1) 컴파일(make)
IntelliJ [KubeRedis]> ./gradlew clean bootJar - 2) 'KubeRedis-0.0.1-SNAPSHOT.jar', 'Dockerfile': 2개 파일을 서버(~/kube/app/sentinel/)로 전송한다.
app\IntelliJ\workspace\KubeRedis\build\libs\KubeRedis-0.0.1-SNAPSHOT.jar
app\IntelliJ\workspace\KubeRedis\Dockerfile - 3) 도커 이미지 빌드 (서버에서 작업)
[~/kube/app/sentinel/] $ docker build -t spring-redis-sentinel-app:1.0 . - 4) 생성된 도커 이미지를 k3s 내부(containerd)로 직접 임포트
[~/kube/app/sentinel/] $ docker save spring-redis-sentinel-app:1.0 | sudo k3s ctr images import -
💾 app-deployment.yaml 파일
서버 "~/kube/app/sentinel" dir에 작성
➡ 이제 Java App 파드 생성했으니 Failover(장애 조치) 테스트하러 갑시다.
| <<K8s Redis-Sentinel 테스트 ③ | K8s Redis-Sentinel App ② >> |
|---|
Email
답글이 올라오면 이메일로 알려드리겠습니다.
