개발중/Redis

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

Binsoo 2023. 9. 18. 15:04
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 soobin-redis oci://registry-1.docker.io/bitnamicharts/redis -n soobin

 

 

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 soobin-redis ./ --namespace soobin -f values-custom.yaml

 

 

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

 

 

  • 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 SoobinApplication {
	public static void main(String[] args) {
		SpringApplication.run(SoobinApplication.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 = "soobin";
        final String SERVICE_NAME = "soobin-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
반응형