k8s_redis_cluster_java_app_1
クバネティス(Kubernetes) 環境で Redis-Cluster Java App 構築 ①
概 要
Redis-Cluster 用 Java(Spring) App
クバネティス(Kubernetes) ポッド(Pod) 環境で構築した Redis-Cluster 用 Java(Spring) App を書いてテストします。
- Java 21
- Spring Boot 3.4.3
- Redis 8.8.2 🔗 Redis-Cluster はここで構築したものを使います。
- PC(ノートPC) IntelliJ で Java(Spring) app 開発
- サーバ: Linux(Rocky9.6)、Redis-Cluster 実行中
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.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 ファイル
- Dockerfile ファイル
- application.properties ファイル
- KubeRedisClusterAppApplication.java ファイル
- RedisClusterConfig.java ファイル
- RedisOperationService.java ファイル
- RedisFailoverTestService.java ファイル
💾 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
返事がかかってなれば、メールでお知らせします。
