Redis를 이용한 시스템 개선
확인 사항
Redis는 인 메모리 데이터 저장소로, 빠른 속도와 다양한 데이터 구조의 지원, 고 가용성과 복제, 분산 처리 기능들을 제공한다.
CAP (Consistency, Availability, Partition Tolerance)
CAP 개념은 분산 서버에서 일관성이 유지되지 못한다는 개념으로, CAP 즉, 일관성 (Consistency), 가용성 (Availability), 파티션 내구성(Partition Tolerance) 중에서 두 가지를 동시에 만족할 수 없다는 것을 제시하고 있다.
-
일관성 (Consistency)
- 모든 클라이언트가 항상 동일한 데이터를 보도록 보장
- 어떤 클라이언트가 데이터를 수정하면, 모든 클라이언트는 즉시 반영하여 항상 일관성을 유지해야 한다.
-
가용성 (Availability)
- 모든 요청에 대해 응답을 제공할 수 있는 상태이며,
- 서버는 클라이언트의 요청에 항상 유효한 데이터를 반환 받을 수 있어야 한다.
-
파티션 내구성 (Partition Tolerance)
- 네트워크 분할이 발생하더라도 시스템이 계속 운영될 수 있는 능력이며,
- 일부 노드가 서버로 통신할 수 없는 상황에서도 시스템이 계속 작동해야 한다.
이에 따라 적절한 합의점을 도출하고 있으며,
- NoSQL 데이터베이스의 경우, 가용성과 파티션 내구성을 우선시하여, 일관성을 느슨한 모델을 사용하고 있으며,
- RDBMS의 경우, 강력한 일관성을 제공하지만, 네트워크 파티션이 발생하면, 일부 요청이 차단되는 모델을 사용하고 있다.
분산 시스템의 일관성은 항상 유지되지 않을 수 있으며, 이는 CAP정리에 의해 설명된다. 시스템 설계 시 요구되는 특성에 따라 일관성, 가용성, 파티션 내구성 중 어떤 것을 우선시 해야 할지를 결정해야 한다.
Redis의 CAP모델
Redis는 주로 일관성과 가용성 모델을 따르며, 특히 최종 일관성 (Eventual Consistency)개념을 기반으로 운영된다.
CAP정리에 따른 Redis의 특징은 다음과 같다.
-
일관성
- Redis는 기본적으로 단일 스레드 모델을 사용하여 요청을 순차적으로 처리합니다. 이를 통해 기본적인 일관성을 보장합니다. 그러나 클러스터 모드에서는 데이터 복제가 발생하며, 리더-팔로워 구조를 사용할 경우, 마스터 노드의 데이터 변경이 모든 팔로워에게 즉시 반영되지 않을 수 있어 eventual consistency를 따르게 됩니다
-
가용성
- Redis는 높은 가용성을 목표로 설계되었습니다. Redis Sentinel이나 Redis Cluster를 사용하여 장애 조치(failover) 기능을 제공하며, 장애 발생 시 다른 노드로 요청을 자동으로 전환할 수 있습니다. 그러나 노드가 분리되면 가용성이 저하될 수 있습니다.
-
분할 허용성
- Redis는 네트워크 파티션이 발생하면, 일부 노드와의 연결이 끊길 수 있습니다. 이 경우, Redis 클러스터는 특정 노드가 불능 상태일 때 해당 노드에 대한 쓰기 작업이 실패할 수 있으며, 읽기 작업 또한 제한될 수 있습니다. 따라서, 분할 허용성은 Redis의 중요한 고려사항 중 하나입니다.
결론적으로, Redis는 CP (Consistency and Partition Tolerance) 또는 AP (Availability and Partition Tolerance) 모델로 운영될 수 있다.
Redis 설치
Redis Server – Docker 설치
Docker Container 생성
$ docker run –p 6379:6379 –name docker_redis redis
Docker Container 상태 확인
$ docker ps –a
Docker를 통한 redis 접속
$ docker exec –it docker_redis /bin/bash
root@redis:/data# redis-cli
Redis-cli를 통한 redis 접속
Redis-cli는 독립적인 설치 파일을 제공하지 않는다. (Windows) 다만, 비슷한 기능을 제공하는 GUI툴을 통한 접속을 진행할 수 있다. 유사 기능을 제공하는 GUI툴은 다음과 같다.
- RedisInsignt : Redis Lab에서 제공하는 GUI 툴로, 데이터베이스를 시각적으로 관리할 수 있다. (Windows Store를 통해 설치 가능)
- Medis: Mac, Windows에서 사용할 수 있는 오픈 소스 Redis GUI클라이언트로, 직관적인 인터페이스가 장점이다.
- Another Redis DeskTop Manager (ARDM): Windows, Mac, Linux에서 사용할 수 있는 크로스 플랫폼 Redis GUI 클라이언트로, 다양한 기능을 제공하며 Redis 데이터를 쉽게 관리할 수 있다.
Redis – Distributed Lock
다중 스레드 환경에서, 특정 자원에 대해 동시에 한 작업만 접근이 가능하도록 강제하도록 설정하는 기능을 Lock (Mutex, 상호 배제) 이라고 한다.
다만, 분산 환경에서 구현을 위해서는, 서버 간의 상호 배제성을 확보해야 한다. Redisson 은 이런 분산된 서버 환경에서, Redis 서버를 활용하여, 분산된 서버 환경 내에서의 상호 배제성을 확보할 수 있는 기능을 제공한다.
Redisson 구현
아래와 같이 Redisson 라이브러리를 implementation 구문을 통해 Dependency를 추가해 준다.
implementation ‘org.redisson:redisson-spring-boot-starter’
application.settings를 통한 Redis 설정
Spring boot 3.X +
spring:
data:
redis:
database:
host:
port:
password:
ssl:
timeout:
connectTimeout:
clientName:
cluster:
nodes:
sentinel:
master:
nodes:
Spring boot 2.7.X
spring:
redis:
database:
host:
port:
password:
ssl:
timeout:
connectTimeout:
clientName:
cluster:
nodes:
sentinel:
master:
nodes:
외부 파일을 통한 Redisson 설정
spring:
redis:
redisson:
file: classpath:redisson.yaml
인라인 문장을 통한 Redisson 설정
spring:
redis:
redisson:
config: |
clusterServersConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
설정 클래스를 통한 Redisson 설정
/*
* RedissonClient Configuration
*/
@Configuration
public class RedissonConfig {
@Value(“${spring.redis.host}”)
private String redisHost;
@Value(“${spring.redis.port}”)
private int redisPort;
private static final String REDISSON_HOST_PREFIX = “redis://”;
@Bean
public RedissonClient redissonClient() {
RedissonClient redisson = null;
Config config = new Config();
config.useSingleServer().setAddress(REDISSON_HOST_PREFIX + redisHost + “:” + redisPort);
redisson = Redisson.create(config);
return redisson;
}
}
참고 사이트
https://redisson.org/docs/integration-with-spring/#spring-boot-starter
답글 남기기