Please enable JavaScript.
Coggle requires JavaScript to display documents.
Redis를 활용한 캐싱 - Coggle Diagram
Redis를 활용한 캐싱
Redis란?
Redis(Remote Dictionary Server)는 메모리 내 데이터 구조 저장 및 검색을 위한 데이터베이스로 사용되는 메모리 기반의 고성능 key-value 저장소.
NoSQL 데이터베이스 중 하나로, 문자열, 리스트, 해시, Set, Sorted Set 등 다양한 내장 데이터 구조 지원과 원자성(atomicity)이 강점.
운영 구조 개요
Redis Sentinel
복제 기반의 고가용성 관리도구. Redis 마스터-슬레이브 구조에서 장애 감지 및 자동 Failover를 수행하는 컴포넌트.
- 하나의 데이터 셋을 다루며, 샤딩은 불가능하다
- 수평 확장보다 고가용성에 초점
- 비교적 설정과 운영이 단순
-
-
-
-
Redis Cluster
샤딩 기반의 수평 확장 구조
- 운영은 Sentinel보다 복잡하지만, 대규모 트래픽/데이터 처리에 유리하다
- 클라이언트가 Cluster를 지원해야 사용 가능 (Cluster-aware Client 필요)
-
-
-
-
장점
캐싱
Redis는 주로 데이터베이스 쿼리나 계산 결과를 캐싱하는 사용되는데, 이때 많은 쿼리 작업을 메모리에 저장하여 테이터베이스에 대한 부하를 줄일 수 있다. 이를 통해 빠른 응답 시간을 제공하고 애플리케이션의 성능을 향상시킬 수 있다.
캐싱 전략
Write-Through
- 애플리케이션이 DB 갱신 시점에 캐시에도 동시에 쓰기
- 읽기 시 항상 캐시에서 응답
- 장점: 읽기 일관성 확보
- 단점: 쓰기 지연 증가, 캐시 쓰기 오버헤드
Write-Back
- 애플리케이션이 캐시에 먼저 쓰고, 백그라운드에서 DB에 비동기 반영
- 장점: 쓰기 성능 극대화, 배치 처리 효율화
- 단점: 장애 시 데이터 손실 위험, 복잡한 오류 처리 필요
Read-Through
- 캐시 미스 시, 자동으로 원본 DB에서 로드 후 반환 (캐시 미들웨어 기능)
Cache-Aside (Lazy Loading)
- 애플리케이션이 캐시에서 키 조회
- 캐시 미스 시 원본 DB에서 조회 후 캐시에 저장
- 이후 요청 시 캐시에서 직접 응답
- 장점: 필요한 데이터만 캐시, 컨트롤 용이
- 단점: 첫 요청 지연, 캐시 일관성 관리 필요
높은 성능
- 모든 데이터를 메모리에 저장하므로 디스크 I/O 오버헤드가 없고,
이로 인해 매우 빠른 읽기/쓰기 작업 수행이 가능.
- 단일 스레드 모델을 사용해 데이터베이스 작업을 순차적으로 처리하므로
복잡한 동시성 문제를 피하고 데이터 일관성 유지 가능.
다양한 데이터 구조 지원
단순한 키-값 구조 외에도 문자열, 해시, 리스트, 셋, 정렬된 집합 등 다양한 데이터 유형을 지원함으로써, 많은 응용 프로그램에서 데이터 구조를 효과적으로 모델링할 수 있다
분산환경 지원
마스터-슬레이브 복제, 클러스터링 등의 기능을 제공해 데이터의 가용성과 확장성을 높일 수 있다.
여러 서버에 데이터를 분산 저장하고 복제하여 고가용성을 보장하고, 수평적인 확장이 가능하다.
간편한 사용 및 다양한 언어 지원
간단하고 직관적인 명령어를 제공하며, 다양한 프로그래밍 언어에서 접근할 수 있는 클라이언트 라이브러리를 지원한다. 이를 통해 다양한 환경과 언어로 개발된 애플리케이션과 통합할 수 있다는 장점을 가진다.
데이터 안정성 보장
주로 메모리에 데이터를 저장하고, 필요에 따라 스냅샷이나 AOF 로그 파일을 사용하여 데이터의 영구 저장과 복구를 지원한다. 이를 통해 레디스는 빠른 응답 시간과 고성능을 유지하면서도 데이터의 안정성을 보장할 수 있다.
특징
인메모리 구조 -> 높은 성능
영구적인 디스크 저장소를 갖지 않고, 모든 데이터를 메모리에 유지.
이로 인해 데이터에 대한 빠른 액세스 속도와 높은 처리량 제공 가능.
선택적 영속화 기능 제공
RDB 스냅샷 또는 AOF(Append-Only File) 형태로 선택적 영속화 제공.
따라서, 캐시뿐 아니라 다양한 용도로 활용된다.
활용 예시
메시지 브로커
레디스는 Pub/Sub 모델을 지원해 메시지 브로커로 사용할 수 있음. 다양한 컴포넌트나 서비스 간의 비동기 통신을 위해 사용되며, 실시간 채팅, 이벤트 기반 시스템, 실시간 분석 등에 적합하다.
-
실시간 데이터 분석
스트림(Stream) 데이터 구조를 활용해 이벤트 시퀀스를 저장하고, 소비자가 실시간으로 이벤트를 처리하고 분석할 수 있어, 이를 통해 실시간 대시보드, 실시간 알림, 로그 분석 등 다양한 실시간 데이터 처리 시나리오가 구현 가능하다.
대기열 관리
레디스는 메시지 큐 시스템으로도 사용 가능하다. 작업 처리를 비동기적으로 관리하기 위해 레디스의 리스트 데이터 구조를 활용하여 작업을 대기열에 추가하고, 워크 프로세스가 해당 작업을 처리하는 방식으로 사용 가능하다. 이를 통해 작업의 순서와 우선순위를 조절하고, 작업 처리량을 제어할 수 있다.
Single Threaded
싱글 스레드 구조로 한 번에 하나의 명령만 처리할 수 있어, 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤의 명령어 들은 앞에 있는 명령어가 처리될 때까지 대기 필요
주의 및 보안 고려 사항
운영상 유의점
키 삭제
한 번 생성한 키를 선택적으로 삭제하기 어렵고,
특별한 조치를 취하지 않으면 서버 재시작 시에도 키가 계속해서 보관될 수 있다
일정 시간 이후 삭제
각각의 키를 저장할 때 set에 저장해 특정 시간이나 조건에 따라 삭제하는 방법으로,
실제 삭제를 사용한다기 보다는 밀어내기를 한다고 이해할 수 있다.
기간 만료 후 삭제
- 가장 많이 사용되는 방식으로, 키를 추적할 필요 없이 쉽게 관리 가능
- 키-값을 SET 커맨드로 저장해 EXPIRE 커맨드로 만료 시간을 정하는 방법을 사용하거나, Redis 버전 2.0.0 이상에서는 SETEX 커맨드(SET + EXPIRE)를 사용
-
조건 기반 삭제
하나의 키에는 하나의 데이터만 남게 되는 set의 특징과, 교집합/차집합/합집합 같은 기능이
제공되는 것을 활용해 교차되는 키만 남기거나 뺀 연산을 적용해 키를 삭제할 수 있다.
메모리 관련 이슈
- 메모리 과다 사용: 총 메모리 초과 시 디스크 스왑 발생, 성능 급락
- Eviction 정책 부적절 설정: noeviction 등 잘못된 정책 사용 시 캐시 미스 증가 또는 OOM 발생
-
영속화(Persistence) 위험
- RDB 스냅샷: 주기적 스냅샷 사용시, 주기 사이에 발생한 데이터 손실 위험
- AOF 재작성: AOF rewrite 과정 중 서버 충돌 시, 로그 손상으로 전체 데이터 손실 가능
네트워크 및 ACL 설정 부재
기본 포트(6379) 개방, ACL 미사용 시 내부망/인터넷 스캔 툴에 노출 위험
보안 취약점 및 대응책
-
외부 네트워크 노출
기본적으로 외부에서 접근 가능한 포트이며, 방치 시 누구나 접속 가능
접근 제어 강화
- bind 127.0.0.1 또는 내부 IP로 제한하여 외부접속 차단
- protected-mode yes 설정으로 안전모드 적용
- Redis 서버를 반드시 방화벽 또는 프라이빗 네트워크(VPC) 내에 배치
-
관리자 명령어 노출
FLUSHALL, CONFIG, SHUTDOWN 등 위험 명령어가 무제한 사용 가능할 경우 치명적인 문제가 발생할 수 있음
명령어 사용 제한
- ACL 기능으로 명령어별 접근 권한 제어
- 민감 명령어는 일반 사용자 계정에서 사용을 차단하고,
관리자 명령어는 특정 사용자에게만 부여
포트 노출
기본 포트 6379를 사용하며, 이를 악용한 스캔 공격이나 무차별 인증 시도 가능
접근 IP 제어
- 서버 보안 그룹 또는 방화벽 설정으로 특정 IP만 허용
- 운영 환경에서는 SSH 터널링 등을 통해 간접 접근만 허용
-
무차별 대입 공격 가능성
인증 기능을 활성화하지 않거나 약한 비밀번호를 사용할 경우,
반복적인 시도를 통한 침입 가능성 존재
접속 차단 시스템 설정
- 강력한 비밀번호 정책 적용
- 로그인 실패 횟구 제한 도구 연동으로 비정상 IP 차단
- 접근 기록 주기적 확인 및 감사
취약 버전 사용
오픈소스 특성상 보안 취약점이 수시로 발견되며, 구버전 사용 시 보안 위협에 노출될 가능성이 높음
최신 보안 패치 유지
- 보인 패치를 포함해 최신 안정 버전으로 유지
- 패키지 관리 시스템이나 자동 업데이트 도구로 정기 점검
데이터 저장소
RDBMS
- 디스크 기반 저장과 트랜잭션 보장 강점
- 데이터 무결성과 복잡한 관계가 중요한 시스템에 적합
데이터 모델 및 스키마 유연성
(고정된 스키마, 정규화된 테이블)
고정된 스키마를 기반으로 테이블 형태의 정형 데이터를 저장.
데이터 간의 관계를 명확히 정의하며, 스키마 변경이 복잡할 수 있음
확장성 및 성능
(수직 확장 용이)
주로 수직 확장(서버 성능 향상)을 통해 성능을 높이며,
수평 확장(서버 추가)은 복잡하고 비용이 많이 발생한다
-
쿼리 기능 및 조인 지원
(복잡한 쿼리 최적화)
복잡한 쿼리와 조인 연산을 효과적으로 지원하여, 다양한 데이터 분석과 보고서 생성에 적합
NoSQL
- 캐시처럼 짧은 지연 시간을 요구하는 워크로드에 월등
- 대규모 데이터 처리와 유연한 데이터 구조가 필요한 시스템에 적합
- 소셜 미디어, IoT, 실시간 분석, 로그 저장, 세션/캐시, 대규모 웹 서비스 등
데이터 모델 및 스키마 유연성
(스키마리스, 유연한 데이터 모델, 스키마 동적 변경 허용)
스키마가 유연하거나 없는 구조로,
다양한 데이터 모델(문서, key-value, 열 기반, 그래프 등)을 지원.
데이터 구조의 변경이 용이하여 빠른 개발과 확장이 가능하다.
확장성 및 성능
(수평 확장 용이)
수평 확장에 최적화되어 있어, 서버(노드)를 추가하여 쉽게 확장 가능.
대규모 데이터 처리와 높은 트래픽을 효율적으로 관리할 수 있다.
트랜잭션 및 일관성
(파티션 단위 ACID, 전체는 최종 일관성)
일부 시스템은 BASE 모델을 따르며, 일관성보다는 가용성과 확장성을 우선시.
그러나 최근에는 일부 NoSQL 시스템도 트랜잭션 지원을 강화하고 있음.
- BASE: 기본적으로 사용 가능, 부드러운 상태, 최종 일관성
쿼리 기능 및 조인 지원
(조인 불가, 간단한 키-값 조회 최적)
조인 기능이 제한적이거나 없으며, 복잡한 쿼리보다는 단순한 데이터 조회에 최적화되어 있음
-