springboot_spring_multidatasource
Spring Multi Data Source
Redis Developer Course | Redis Technical Support | Redis Enterprise Server |
---|
Spring Multi Data Source
Spring LettuceConnectionFactory, StringRedisTemplate를 이용해서 Redis Standalone, Master-Replica, Sentinel, Cluster 각 데이터 소스(서버)에 연결하고 메소드(명령)을 실행하는 방법을 설명합니다.
Project 생성: start.spring.io
Spring Boot: 3.1.4
Spring: 6.0.12
Lettuce: 6.2.6
Redis: 7.0.10
Spring: 6.0.12
Lettuce: 6.2.6
Redis: 7.0.10
application.properties
Main Class: MultidatasourceApplication
Class RedisConfig
ConnectionFactory
- application.properties에서 콤마(,)로 구분된 서버 정보(IP:Port)를 읽어 올 때는
Set<String> replicas, sentinelNodes, clusterNodes를 사용합니다.
주의: 서버 정보(IP:Port)를 String으로 읽어서 StringUtils.split(replicas, ",")를 사용해서 구분할 경우 IP 앞에 space가 붙어서 서버 연결이 되지 않습니다. - 단독 서버: RedisStandaloneConfiguration(host, port)를 사용합니다.
- 마스터-복제: RedisStaticMasterReplicaConfiguration(masterIp, masterPort)를 사용하고, 복제 노드들은 redisConfig.addNode(replicaIp, replicaPort)를 사용해서 추가합니다.
- 센티널: RedisSentinelConfiguration(sentinelMaster, sentinelNodes)를 사용합니다.
- sentinelMaster는 sentinel.conf에서 아래와 같이 지정한 마스터이름입니다.
"sentinel monitor mymaster 192.168.56.102 18520 2" -> redis.sentinel.master: mymaster
- sentinelNodes는 아래와 같은 센티널 서버 정보(IP:Port)입니다.
redis.sentinel.nodes: 192.168.56.102:18525, 192.168.56.102:18526, 192.168.56.102:18527
주의 레디스 서버의 정보를 입력하는 것이 아닙니다. 클라이언트는 센티널에 접속해서 레디스 마스터, 복제 서버 정보를 얻어서 명령을 실행합니다. 이렇게 하는 이유는 마스터, 복제 서버 역할이 바뀔 수 있기 때문입니다. 역할이 변경(마스터 -> 복제, 복제 -> 마스터)되면 센티널이 클라이언트에게 publish 기능으로 메시지를 보내서 알려줍니다.
- sentinelMaster는 sentinel.conf에서 아래와 같이 지정한 마스터이름입니다.
- 클러스터: RedisClusterConfiguration(clusterNodes)를 사용합니다. clusterNodes에는 마스터 뿐만 아니라 복제 노드들도 모두 등록합니다.
StringRedisTemplate
각 connectionFactory를 사용해서 각 StringRedisTemplate를 생성합니다.
- 단독 서버: public StringRedisTemplate stringRedisStandaloneTemplate()
stringRedisTemplate.setConnectionFactory(redisStandaloneConnectionFactory()); - 마스터-복제: public StringRedisTemplate stringRedisMasterReplicaTemplate()
stringRedisTemplate.setConnectionFactory(redisMasterReplicaConnectionFactory()); - 센티널: public StringRedisTemplate stringRedisSentinelTemplate()
stringRedisTemplate.setConnectionFactory(redisSentinelConnectionFactory()); - 클러스터: public StringRedisTemplate stringRedisClusterTemplate()
stringRedisTemplate.setConnectionFactory(redisClusterConnectionFactory());
Class RedisStandaloneRepository - 단독 서버 레파지토리
stringRedisStandaloneTemplate을 받아 사용한다.
Class RedisMasterReplicaRepository - 마스터-복제 서버 레파지토리
stringRedisMasterReplicaTemplate을 받아 사용한다.
Class RedisSentinelRepository - 센티널 레파지토리
stringRedisSentinelTemplate을 받아 사용한다.
Class RedisClusterRepository - 클러스터 레파지토리
stringRedisClusterTemplate을 받아 사용한다.
Class RedisController
- @GetMapping("/standalone/save"): 단독 서버 저장
- @GetMapping("/masterReplica/save"): 마스터-복제 저장
- @GetMapping("/sentinel/save"): 센티널 저장
- @GetMapping("/cluster/save"): 클러스터 저장
- @GetMapping("/standalone/save/{size}"): 단독 서버 멀티 스레드 저장
- @GetMapping("/masterReplica/save/{size}"): 마스터-복제 멀티 스레드 저장
- @GetMapping("/sentinel/save/{size}"): 센티널 멀티 스레드 저장
- @GetMapping("/cluster/save/{size}"): 클러스터 멀티 스레드 저장
성능 테스트
- 100개 스레드로 총 10만개 키를 입력: 단독 서버, 마스터-복제, 센티널, 클러스터 모두 12~14초 정도 걸린다.
- 클러스터는 마스터가 3대이기 때문에 좀 빠르지 않을까 생각했으나 결과는 다른 것과 같았다.
<< DB Select | Spring Multi Data Source | Lettuce Multi Data Source >> |
---|
Email
답글이 올라오면 이메일로 알려드리겠습니다.