クバネティス(Kubernetes) 環境で Redis-Sentinel Java App 構築 ①


  概要  

Redis-Sentinel 用 Java(Spring) App

Kubernetes ポッド(Pod) 環境で構築した Redis-Sentinel 用 Java 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.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 ファイル

  • '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 プロジェクトを再ロード' アイコンをクリック
📄 build.gradle

💾 Dockerfile ファイル

📄 Dockerfile

💾 application.properties ファイル

'spring.data.redis.sentinel.nodes' に、次のように sentinel-0 から 2 まですべて記録してください。

📄 application.properties

💾 KubeRedisApplication.java ファイル

📄 KubeRedisApplication.java

💾 RedisSentinelConfig.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 ファイル

📄 RedisOperationService.java

💾 RedisFailoverTestService.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) Docker イメージビルド (サーバで作業)
    [~/kube/app/sentinel/] $ docker build -t spring-redis-sentinel-app:1.0 .
  • 4) 生成した Docker イメージを 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 に作成

📄 app-deployment.yaml

➡ Java App とポッド(Pod) 生成 YAML を準備したので、Failover(障害対応) テストに行きましょう。


<<K8s Redis-Sentinel テスト ③ K8s Redis-Sentinel App ② >>

Email 返事がかかってなれば、メールでお知らせします。