From f3b1f3d4179f4e8123541f25dbe1ba55534f77f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B2=BD=EB=8F=84?= Date: Mon, 26 May 2025 11:23:30 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20redis=20=EC=84=A4=EC=A0=95=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 21 +++++++-- dockerfile | 5 ++ sentinel1/sentinel.conf | 14 +++--- sentinel2/sentinel.conf | 16 ++++--- sentinel3/sentinel.conf | 18 +++---- .../com/redis/ha/api/RedisController.java | 38 +++++++++++++++ .../redis/ha/config/RedisSentinelConfig.java | 47 +++++++++++++++++++ src/main/resources/application.yml | 11 ++++- .../java/com/redis/ha/HaApplicationTests.java | 4 -- 9 files changed, 144 insertions(+), 30 deletions(-) create mode 100644 dockerfile create mode 100644 src/main/java/com/redis/ha/api/RedisController.java create mode 100644 src/main/java/com/redis/ha/config/RedisSentinelConfig.java diff --git a/docker-compose.yml b/docker-compose.yml index b87362a..2d4203f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,18 @@ version: "3.8" services: + springboot: + build: + context: . + dockerfile: Dockerfile + container_name: springboot + depends_on: + - sentinel1 + networks: + redisnet: + ipv4_address: 172.23.0.10 + ports: + - "8060:8060" redis1: image: redis:alpine container_name: redis1 @@ -50,7 +62,8 @@ services: - "redis2:172.23.0.5" - "redis3:172.23.0.6" networks: - - redisnet + redisnet: + ipv4_address: 172.23.0.7 sentinel2: image: redis:alpine container_name: sentinel2 @@ -66,7 +79,8 @@ services: - "redis2:172.23.0.5" - "redis3:172.23.0.6" networks: - - redisnet + redisnet: + ipv4_address: 172.23.0.8 sentinel3: image: redis:alpine container_name: sentinel3 @@ -82,7 +96,8 @@ services: - "redis2:172.23.0.5" - "redis3:172.23.0.6" networks: - - redisnet + redisnet: + ipv4_address: 172.23.0.9 networks: redisnet: diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..8a227ce --- /dev/null +++ b/dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:17-jdk-slim +VOLUME /tmp +ARG JAR_FILE=build/libs/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/sentinel1/sentinel.conf b/sentinel1/sentinel.conf index d5bf82f..e55a718 100644 --- a/sentinel1/sentinel.conf +++ b/sentinel1/sentinel.conf @@ -10,19 +10,19 @@ dir "/data" latency-tracking-info-percentiles 50 99 99.9 user default on nopass sanitize-payload ~* &* +@all sentinel myid f3b370a4fbcfe5cbe6b0654e81323afb3522c51b -sentinel config-epoch mymaster 1 -sentinel leader-epoch mymaster 1 -sentinel current-epoch 1 +sentinel config-epoch mymaster 7 +sentinel leader-epoch mymaster 7 +sentinel current-epoch 7 sentinel known-replica mymaster 172.23.0.6 6379 -sentinel known-sentinel mymaster 172.23.0.2 26379 4ea64b5a0885b1617010242c1e08115d00896309 +sentinel known-sentinel mymaster 172.23.0.9 26379 4ea64b5a0885b1617010242c1e08115d00896309 -sentinel known-sentinel mymaster 172.23.0.7 26379 4208d0adc5452e2de73024943c44e833807fd1d1 +sentinel known-sentinel mymaster 172.23.0.8 26379 4208d0adc5452e2de73024943c44e833807fd1d1 sentinel known-replica mymaster 172.23.0.4 6379 -sentinel known-replica mymaster 172.23.0.3 6379 - sentinel known-replica mymaster 172.23.0.2 6379 +sentinel known-replica mymaster 172.23.0.3 6379 + diff --git a/sentinel2/sentinel.conf b/sentinel2/sentinel.conf index a36af46..aeead2b 100644 --- a/sentinel2/sentinel.conf +++ b/sentinel2/sentinel.conf @@ -10,19 +10,21 @@ latency-tracking-info-percentiles 50 99 99.9 dir "/data" user default on nopass sanitize-payload ~* &* +@all sentinel myid 4208d0adc5452e2de73024943c44e833807fd1d1 -sentinel config-epoch mymaster 1 -sentinel leader-epoch mymaster 1 -sentinel current-epoch 1 +sentinel config-epoch mymaster 7 +sentinel leader-epoch mymaster 7 +sentinel current-epoch 7 -sentinel known-replica mymaster 172.23.0.2 6379 +sentinel known-replica mymaster 172.23.0.3 6379 -sentinel known-sentinel mymaster 172.23.0.2 26379 4ea64b5a0885b1617010242c1e08115d00896309 +sentinel known-sentinel mymaster 172.23.0.2 26379 4208d0adc5452e2de73024943c44e833807fd1d1 -sentinel known-sentinel mymaster 172.23.0.3 26379 f3b370a4fbcfe5cbe6b0654e81323afb3522c51b +sentinel known-sentinel mymaster 172.23.0.7 26379 f3b370a4fbcfe5cbe6b0654e81323afb3522c51b sentinel known-replica mymaster 172.23.0.4 6379 -sentinel known-replica mymaster 172.23.0.3 6379 +sentinel known-replica mymaster 172.23.0.2 6379 sentinel known-replica mymaster 172.23.0.6 6379 +sentinel known-sentinel mymaster 172.23.0.9 26379 4ea64b5a0885b1617010242c1e08115d00896309 + diff --git a/sentinel3/sentinel.conf b/sentinel3/sentinel.conf index cd934b2..62a562a 100644 --- a/sentinel3/sentinel.conf +++ b/sentinel3/sentinel.conf @@ -10,19 +10,21 @@ latency-tracking-info-percentiles 50 99 99.9 dir "/data" user default on nopass sanitize-payload ~* &* +@all sentinel myid 4ea64b5a0885b1617010242c1e08115d00896309 -sentinel config-epoch mymaster 1 -sentinel leader-epoch mymaster 1 -sentinel current-epoch 1 +sentinel config-epoch mymaster 7 +sentinel leader-epoch mymaster 7 +sentinel current-epoch 7 -sentinel known-replica mymaster 172.23.0.3 6379 +sentinel known-replica mymaster 172.23.0.4 6379 -sentinel known-sentinel mymaster 172.23.0.3 26379 f3b370a4fbcfe5cbe6b0654e81323afb3522c51b +sentinel known-sentinel mymaster 172.23.0.7 26379 f3b370a4fbcfe5cbe6b0654e81323afb3522c51b -sentinel known-sentinel mymaster 172.23.0.7 26379 4208d0adc5452e2de73024943c44e833807fd1d1 +sentinel known-sentinel mymaster 172.23.0.8 26379 4208d0adc5452e2de73024943c44e833807fd1d1 -sentinel known-replica mymaster 172.23.0.4 6379 +sentinel known-replica mymaster 172.23.0.3 6379 + +sentinel known-replica mymaster 172.23.0.6 6379 sentinel known-replica mymaster 172.23.0.2 6379 -sentinel known-replica mymaster 172.23.0.6 6379 +sentinel known-sentinel mymaster 172.23.0.3 26379 4ea64b5a0885b1617010242c1e08115d00896309 diff --git a/src/main/java/com/redis/ha/api/RedisController.java b/src/main/java/com/redis/ha/api/RedisController.java new file mode 100644 index 0000000..9ac4e20 --- /dev/null +++ b/src/main/java/com/redis/ha/api/RedisController.java @@ -0,0 +1,38 @@ +package com.redis.ha.api; + +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequiredArgsConstructor +@RequestMapping("/v1/redis") +public class RedisController { + + private final RedisTemplate redisTemplate; + + @GetMapping("/put") + public ResponseEntity putData(@RequestParam(name = "key") String key){ + + redisTemplate.opsForValue().set(key, "DATA"); + + return ResponseEntity.ok().build(); + } + + @GetMapping("/get") + public ResponseEntity getData(@RequestParam(name = "key") String key){ + + String data = redisTemplate.opsForValue().get(key); + log.info(data); + + return ResponseEntity.ok().body(data); + } + +} diff --git a/src/main/java/com/redis/ha/config/RedisSentinelConfig.java b/src/main/java/com/redis/ha/config/RedisSentinelConfig.java new file mode 100644 index 0000000..b043b9a --- /dev/null +++ b/src/main/java/com/redis/ha/config/RedisSentinelConfig.java @@ -0,0 +1,47 @@ +package com.redis.ha.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisPassword; +import org.springframework.data.redis.connection.RedisSentinelConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Configuration +@Slf4j +@RequiredArgsConstructor +public class RedisSentinelConfig { + + @Value("${spring.data.redis.password}") + private String password; + + @Bean + public RedisConnectionFactory redisConnectionFactory(){ + RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration() + .master("mymaster") + .sentinel("172.23.0.7", 26379) + .sentinel("172.23.0.8", 26379) + .sentinel("172.23.0.9", 26379) + ; + + redisSentinelConfiguration.setPassword(RedisPassword.of(password)); + + return new LettuceConnectionFactory(redisSentinelConfiguration); + } + + @Bean + public RedisTemplate redisTemplate(){ + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory()); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + + return redisTemplate; + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 32fc5bd..224e6a7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,7 +1,16 @@ spring: application: name: redis-ha - + data: + redis: + sentinel: + master: mymaster + nodes: + - 172.23.0.7:26379 + - 172.23.0.8:26379 + - 172.23.0.9:26379 + password: palnet!234 + timeout: 3000 server: port: 8060 \ No newline at end of file diff --git a/src/test/java/com/redis/ha/HaApplicationTests.java b/src/test/java/com/redis/ha/HaApplicationTests.java index 374abc6..601a10b 100644 --- a/src/test/java/com/redis/ha/HaApplicationTests.java +++ b/src/test/java/com/redis/ha/HaApplicationTests.java @@ -1,13 +1,9 @@ package com.redis.ha; -import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class HaApplicationTests { - @Test - void contextLoads() { - } }