k8s_redis_sentinel_java_app_1
クバネティス(Kubernetes) 環境で 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(ノート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 プロジェクトを再ロード' アイコンをクリック
📄 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
返事がかかってなれば、メールでお知らせします。
