본문 바로가기

개발중/Redis

고성능을 위한 Redis (High Availability, HA)와 Kubernetes 구축 마스터 가이드 (Spring Session storage 설정까지)

728x90
반응형

목표 1. Redis k8s 구성 이해

Redis Sentinel 고가용성(High Availability, HA) 클러스터 구성 방식으로 설계하였습니다.

  • Master Redis Server
    • 실제 데이터를 저장하고 처리하는 주 서버입니다.
  • Slave Redis Server
    • Master 서버의 데이터를 복제합니다.
    • 이는 고가용성을 높이고 읽기 쿼리의 부하 분산에 사용될 수 있습니다.
  • Sentinel Nodes
    • 클러스터의 상태를 모니터링하고, Master가 다운되면 새로운 Master를 선출하는 등의 작업을 수행합니다.

 

목표 2. Redis k8s 구축하기

Helm

  • helm 에서 chart 내려 받습니다.
helm install lucy3-redis oci://registry-1.docker.io/bitnamicharts/redis -n lucy3

 

 

global:
  imagePullSecrets: []
  storageClass: "openebs-hostpath" 

auth:
  enabled: true
  sentinel: false
  password: "1234"

# Replica settings
replica:
  replicaCount: 3
  podAntiAffinityPreset: hard
  priorityClassName: "devops-client-experience-priority"
  resources:
    limits:
      cpu: 100m
      memory: 300Mi
    requests:
      cpu: 100m
      memory: 300Mi
  
# Sentinel settings
sentinel:
  resources:
    limits:
      cpu: 100m
      memory: 100Mi
    requests:
      cpu: 100m
      memory: 100Mi

 

 

  • values.yaml 파일의 값을 아래와 같이 수정합니다. ( 기존에 있던 파일을 수정하면 됩니다 )
global:
  storageClass: "openebs-hostpath"
  redis:
    password: "1234"

auth:
	sentinel: false

sentinel:
  enabled: true

master:
	podAntiAffinityPreset: hard

replica:
	podAntiAffinityPreset: hard

 

 

  • k8s 에 적용합니다.
helm install lucy3-redis ./ --namespace lucy3 -f values-custom.yaml

 

 

  • 잘 생성 되었는지 확인합니다.
helm list -n lucy3

 

 

  • sentinel master 명 확인 해주세요. ( redis cmd 에서 확인 가능 )
    • name : master name
    • ip : 외부 ( ex : web application ) 에서 접근가능한 ip 주소
redis-cli -p 26379 
AUTH 1234
sentinel masters

 

목표 3. Spring 프로젝트에서 Redis Service 연결

 

  • 의존성 추가 해주세요.
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
	<version>3.1.3</version>
</dependency>
<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
</dependency>

 

 

  • @EnableRedisHttpSession 를 Application 상단에 추가함으로써 세션스토리지를 redis 에서 관리한다고 선언해주세요.
@EnableRedisHttpSession
@SpringBootApplication
public class LucyApplication {
	public static void main(String[] args) {
		SpringApplication.run(LucyApplication.class, args);
	}
}

 

 

  • Config 설정 해주세요. ( application.yaml 파일에서 설정하는 방법과 Java 에서 설정하는 방법이 두 가지가 존재합니다. ) 
/**
 * Redis Configuration
 * @author soobin@naver.com
 */
@EnableRedisRepositories
@Configuration
@Deprecated
public class RedisConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {

        /** redis info **/
        final String MASTER_NAME = "mymaster";
        final String PASSWORD = "1234";
        
        /** k8s info **/
        final String NAME_SPACE = "lucy3";
        final String SERVICE_NAME = "lucy3-redis";
        final String SENTINEL_HOST = SERVICE_NAME + "." + NAME_SPACE + ".svc.cluster.local";
        final int SENTINEL_PORT = 26379;

        RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
                .master(MASTER_NAME)
                .sentinel(SENTINEL_HOST, SENTINEL_PORT);

        sentinelConfig.setPassword(RedisPassword.of(PASSWORD));
        return new LettuceConnectionFactory(sentinelConfig);
    }

    @Bean
    public RedisTemplate<String, ?> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(this.redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

 

TEST

1. Web Pod 재시작/업그레이드 테스트

  • 목표: 웹 어플리케이션의 Pod가 재시작되거나 업그레이드되더라도 사용자의 로그인 상태가 유지되어야 합니다.
  • 시나리오: 웹 어플리케이션의 Pod를 재시작하거나 업그레이드합니다.
  • 검증 항목: 사용자가 로그아웃되지 않고, 로그인 상태가 유지되는지 확인합니다.

2. Redis Master Pod 다운 테스트

  • 목표: Redis Master Pod 가 다운되더라도, Sentinel이 새로운 Master를 선출하고 세션 정보가 유지되어야 합니다.
  • 시나리오: Redis Master 파드를 강제 종료합니다.
  • 검증 항목: Sentinel이 새로운 Master를 선출하고, 사용자의 로그인 상태가 유지되는지 확인합니다.
728x90
반응형