Spring Redis Master/Replica

레디스 개발자 교육 신청 레디스 정기점검/기술지원
Redis Technical Support
레디스 엔터프라이즈 서버
Redis Enterprise Server

Spring Redis Master/Replica

이 문서는 Spring Data Redis를 이용해서 레디스 마스터/복제(Master/Replica) 용 Java Spring 애플리케이션을 개발하는 방법을 설명합니다.
Spring Data Redis로 레디스 마스터/복제 서버로 연결할 경우 수동 구성(Manual Config)을 해야 합니다. 자동 구성(Auto Config)는 지원하지 않습니다.


기본 사용법

① new RedisStaticMasterReplicaConfiguration(master[0],Integer.parseInt(master[1]))
RedisStaticMasterReplicaConfiguration을 마스터 IP, Port로 생성합니다.
② redisConfig.addNode(node[0].trim(), Integer.parseInt(node[1]))
복제 서버들의 IP, Port를 추가해서 구성합니다.
③ LettuceClientConfiguration.builder()
LettuceClientConfiguration을 생성/구성합니다.
readFrom, clientName, commandTimeout 등을 설정합니다.
④ new LettuceConnectionFactory(redisConfig, clientConfig)
LettuceConnectionFactory를 생성합니다.
⑤ valueOperations.set(key, value)
레디스 명령을 실행합니다.

Source code

Master/Replica 구성과 Pub/Sub과의 관계

Master/Replica 구성에서는 Pub/Sub을 사용할 수 없습니다.
자세한 내용은 여기를 보세요
사용하려면 Master에 Standalone으로 연결해서 사용하면 됩니다.


Spring Project

Spring Project 생성

Java Spring Project 생성 URL: start.spring.io

  • Project: Gradle-Groovy
  • Language: Java
  • Spring Boot: 3.1.8
  • Project Metadata
    • Group: com.redisgate
    • Artifact: MasterReplciaSpring -> Project 명칭, 이 이름으로 압축파일이 생긴다.
    • Name: Main -> Main Class Name
    • Description: Redis MasterReplcia Spring Application -> 설명
    • Package name: com.redisgate.redis -> Package Name
    • Packaging: Jar
    • Java: 17 -> Java 버전 선택
  • Dependencies에서 [ADD … CTRL + B] 버튼을 클릭해서 아래 3개를 추가합니다.
    • Spring Web
    • Lombok
    • Spring Data Redis(Access+Driver)
  • 마지막으로 [GENERATE CTRL + ⏎ ] 버튼 클릭해서 압축 파일(zip)을 다운받는다.
  • 스프링부트3.x 는 자바17 이상, 스프링부트 2.x는 자바11을 사용합니다.

이 프로젝트에 사용된 Spring, Lettuce, Redis 버전

  • Spring-Boot: 3.1.8, Spring: 6.0.16
  • Lettuce-6.2.7
  • Redis-7.2.3

Main Class

application.properties

RedisProps class

application.properties 파일을 읽어오는 클래스.

  • master는 String으로, replicas는 List<String>으로 읽어옵니다.
  • readFrom 문자열을 ReadFrom 값으로 변경하는 getReadFrom()이 추가되었습니다.

RedisConn class

Redis 서버에 연결합니다.
ConnectTimeout은 ClientOptions을 사용해서 설정합니다.

  • 주의: Spring Redis Connection을 이용하면 Application 시작할 때 레디스 서버에 연결하지 않습니다. 그러므로 레디스 서버가 시작되지 않았어도 Application은 시작됩니다.
    첫 명령(SET)이 실행되면 Application은 각 레디스 서버(마스터,복제1,복제2)에 다음 명령을 실행합니다.
    마지막에 SET 명령 실행용 연결은 종료하지 않고 유지합니다.
    다음에 입력 명령이 실행되면 해당 연결(connection)으로 명령을 실행합니다.
    connFactory.setShareNativeConnection(true);
  • 1차 연결
    HELLO 3 AUTH default redisgate SETNAME redisgate
    ROLE
    1차 연결 종료
  • 2차 연결
    HELLO 3 AUTH default redisgate SETNAME redisgate
    CLIENT SETNAME lettuce#MasterReplicaTopologyRefresh
    PING NODES
    2차 연결 종료
  • 3차 연결(마스터에만)
    HELLO 3 AUTH default redisgate SETNAME redisgate
    SET key01 value-key01
    3차 연결 유지
  • connFactory.setShareNativeConnection(false);
    1,2,3차 연결을 하고 3차 연결도 종료합니다. 따라서 매 명령 실행마다 1,2,3차 연결을 합니다.
    Connection Pool을 사용해서 연결별로 별도 스레드를 사용할 경우 설정합니다. 하지만 이 경우에도 성능상 이점은 없습니다.

RedisController class

  • SET 테스트: http://localhost:8080/set/key01
  • GET 테스트: http://localhost:8080/get/key01
    GET 명령이 복제서버에 실행되는 것을 확인하기 위해서 아래와 같이 redis-cli를 실행 후 위 get 명령을 실행합니다.
    $ bin/redis-cli -p 6001 -a redisgate --stat
  • PING 테스트: http://localhost:8080/ping -> 마스터에서 실행됩니다.


<< Pub/Sub Master/Replica Sentinel >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.