クバネティス(Kubernetes) 環境で 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(ノートPC) dir 例)
    ① app\IntelliJ\workspace\KubeRedisClusterApp\build\libs\KubeRedisClusterApp-0.0.1-SNAPSHOT.jar
    ② app\IntelliJ\workspace\KubeRedisClusterApp\Dockerfile
  • 3) Docker イメージビルド (サーバで作業)
    [~/kube/app/cluster/] $ docker build -t spring-redis-cluster-app:1.0 .
  • 4) 生成した Docker イメージを 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 ポッド(Pod) を生成したので、Failover(障害対応)テストに行きましょう。


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

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