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

2023. 9. 18. 15:04·개발중/Redis
목차
  1. Helm
  2. 1. Web Pod 재시작/업그레이드 테스트
  3. 2. Redis Master Pod 다운 테스트
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

 

 

  • values-custom.yaml 생성 후 작성 
    • helm 에서 내려받은 chart 를 Ha 구성 방식으로 custom 합니다.
    • 각자 구성방식에 따라 다를 수 있습니다. ( 원하시는 속성은 공식사이트에서 찾아서 설정합니다. )
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 에서 설정하는 방법이 두 가지가 존재합니다. ) 
    • 트러블 슈팅 1
/**
 * 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
반응형
저작자표시 (새창열림)

'개발중 > Redis' 카테고리의 다른 글

Redis Pub/Sub 에 대해서 알아보기.  (0) 2024.09.24
[트러블 슈팅] Headless Service 에 대한 오해 (1)  (0) 2023.09.18
[트러블슈팅] Could not connect to Redis at 127.0.0.1:6379: Connection refused  (0) 2023.09.12
[Redis 트러블슈팅] OOM command not allowed when used memory > 'maxmemory'.  (0) 2023.09.12
k8s Redis 구성방식에 대해서 고민하는 중입니다.  (0) 2023.09.08
  1. Helm
  2. 1. Web Pod 재시작/업그레이드 테스트
  3. 2. Redis Master Pod 다운 테스트
'개발중/Redis' 카테고리의 다른 글
  • Redis Pub/Sub 에 대해서 알아보기.
  • [트러블 슈팅] Headless Service 에 대한 오해 (1)
  • [트러블슈팅] Could not connect to Redis at 127.0.0.1:6379: Connection refused
  • [Redis 트러블슈팅] OOM command not allowed when used memory > 'maxmemory'.
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (930)
      • 개발중 (632)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (87)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (16)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Git 저장소
    네트워크 관리사 실기
    redis
    리눅스 1급 요약
    REST API
    파이썬 알고리즘
    리눅스 마스터 1급 정리
    docker
    리눅스 마스터 1급 요약
    BackendDevelopment
    알고리즘
    스프링
    리눅스 마스터 1급
    네트워크 관리사 요약
    리눅스 마스터 요약
    jpa
    네트워크 관리사 2급 실기
    쿠버네티스
    네트워크 관리사 자격증
    네트워크 관리사
    파이썬
    리눅스 마스터
    쿠버네티스 스터디
    VUE
    네트워크 관리사 학점
    git
    Spring
    springboot
    java
    네트워크 관리사 2급
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
고성능을 위한 Redis (High Availability, HA)와 Kubernetes 구축 마스터 가이드 (Spring Session storage 설정까지)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.