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 Multi Data Source project

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 기능으로 메시지를 보내서 알려줍니다.
  • 클러스터: 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 답글이 올라오면 이메일로 알려드리겠습니다.