Redis 서버 연동 방안

Redis를 이용한 시스템 개선

확인 사항

Redis는 인 메모리 데이터 저장소로, 빠른 속도와 다양한 데이터 구조의 지원, 고 가용성과 복제, 분산 처리 기능들을 제공한다.

CAP (Consistency, Availability, Partition Tolerance)

CAP 개념은 분산 서버에서 일관성이 유지되지 못한다는 개념으로, CAP 즉, 일관성 (Consistency), 가용성 (Availability), 파티션 내구성(Partition Tolerance) 중에서 두 가지를 동시에 만족할 수 없다는 것을 제시하고 있다.

  1. 일관성 (Consistency)
    1. 모든 클라이언트가 항상 동일한 데이터를 보도록 보장
    2. 어떤 클라이언트가 데이터를 수정하면, 모든 클라이언트는 즉시 반영하여 항상 일관성을 유지해야 한다.
  2. 가용성 (Availability)
    1. 모든 요청에 대해 응답을 제공할 수 있는 상태이며,
    2. 서버는 클라이언트의 요청에 항상 유효한 데이터를 반환 받을 수 있어야 한다.
  3. 파티션 내구성 (Partition Tolerance)
    1. 네트워크 분할이 발생하더라도 시스템이 계속 운영될 수 있는 능력이며,
    2. 일부 노드가 서버로 통신할 수 없는 상황에서도 시스템이 계속 작동해야 한다.

이에 따라 적절한 합의점을 도출하고 있으며,

  1. NoSQL 데이터베이스의 경우, 가용성과 파티션 내구성을 우선시하여, 일관성을 느슨한 모델을 사용하고 있으며,
  2. RDBMS의 경우, 강력한 일관성을 제공하지만, 네트워크 파티션이 발생하면, 일부 요청이 차단되는 모델을 사용하고 있다.

분산 시스템의 일관성은 항상 유지되지 않을 수 있으며, 이는 CAP정리에 의해 설명된다. 시스템 설계 시 요구되는 특성에 따라 일관성, 가용성, 파티션 내구성 중 어떤 것을 우선시 해야 할지를 결정해야 한다.

Redis의 CAP모델

Redis는 주로 일관성과 가용성 모델을 따르며, 특히 최종 일관성 (Eventual Consistency)개념을 기반으로 운영된다.

CAP정리에 따른 Redis의 특징은 다음과 같다.

  1. 일관성
    1. Redis는 기본적으로 단일 스레드 모델을 사용하여 요청을 순차적으로 처리합니다. 이를 통해 기본적인 일관성을 보장합니다. 그러나 클러스터 모드에서는 데이터 복제가 발생하며, 리더-팔로워 구조를 사용할 경우, 마스터 노드의 데이터 변경이 모든 팔로워에게 즉시 반영되지 않을 수 있어 eventual consistency를 따르게 됩니다
  2. 가용성
    1. Redis는 높은 가용성을 목표로 설계되었습니다. Redis Sentinel이나 Redis Cluster를 사용하여 장애 조치(failover) 기능을 제공하며, 장애 발생 시 다른 노드로 요청을 자동으로 전환할 수 있습니다. 그러나 노드가 분리되면 가용성이 저하될 수 있습니다.
  3. 분할 허용성
    1. 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툴은 다음과 같다.

  1. RedisInsignt : Redis Lab에서 제공하는 GUI 툴로, 데이터베이스를 시각적으로 관리할 수 있다. (Windows Store를 통해 설치 가능)
  2. Medis: Mac, Windows에서 사용할 수 있는 오픈 소스 Redis GUI클라이언트로, 직관적인 인터페이스가 장점이다.
  3. 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

 

 

Redis Cache

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다