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
- 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 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
반응형
'개발중 > 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 |