YongDev
2025. 2. 9. 14:35
2025. 2. 9. 14:35
Redis란
- Remote Dictionary Server으로 메모리 기반의 고성능 데이터 저장소
- 주로 캐시, 메시지 브로커, 세션 저장소로 사용
- Key-Value 구조와 다양한 데이터 타입 지원
- 사용사례
- 캐시
- 자주 조회되는 데이터를 메모리에 저장해 빠르게 응답
- 대형 쇼핑몰에서 상품 목록을 캐시하여, 데이터베이스 조회를 줄이고 사용자에게 즉시 응답 제공
- 세션 저장소
- 세션 관리에 적합
- 로그인 상태 유지 및 쇼핑 카트 정보 저장
- 전자상거래 사이트에서 사용자의 로그인 세션과 장바구니 정보를 Redis에 저장하여 빠른 액세스 제공
- Redis의 주요 특징
- 메모리 기반
- Redis는 메모리 기반으로 동작
- 디스크 I/O에 비해 빠른 속도로 데이터 읽기쓰기 가능
- Redis가 주로 실시간 데이터 처리 및 고속 캐싱 솔루션으로 사용되는 주요 이유 중 하나
- 영속성 옵션
- Redis는 데이터를 메모리에 저장하면서도 영속성을 보장하기 위한 옵션 제공
- RDB (Redis Database) 스냅샷 : 주기적으로 전체 데이터를 디스크에 저장
- AOF : 데이터 변경 로그를 저장해 시스템 재시간 시 복구 가능
- 데이터 손실을 최소화하고 복구함
- 다양한 데이터 타입
- String, List, Set ,Sorted Set(ZSet), Hash, Bitmaps, HyperLog
- 복제
- Master-Slave 복제 구조를 지원하여 데이터 가용성을 높이고, 읽기 부하를 분산
- Master는 데이터를 쓰고, Slave는 데이터를 읽는 구조로, 읽기 성능 향상 및 데이터 백업 제공
- 고가용성
- Sentinel라는 기능을 통해 자동 복구 및 장애조치 지원
- Sentinel은 Redis 인스턴스를 모니터링하고 Master 노드에 장애가 발생하면 자동으로 Slave 노드를 승격하여 서비스의 중단 없이 운영
- 클러스터링
- Cluster 기능을 통해 데이터를 여러 노드에 분산 저장, 수평적 확장
- 대규모 데이터를 성능 저하없이 확장 가능
- 자동으로 데이터를 노드 간 분산시키며, 각 노드는 해시 슬롯을 통해 데이터를 관리
- Redis 아키텍쳐
- 싱글 스레드 모델
- 싱글 스레드로 동작, 하나의 요청 한번에 처리
- I/O성능을 극대화 하는 구조, 여러 요청 빠르게 처리
- 락경합 없고 프로세스가 경량화되어 성능 저하 없음
- 비동기 I/O
- 비동기 I/O모델을 채택하여, 네트워크 요청이나 파일쓰기와 같은 I/O작업을 논 블로킹으로 처리
- 네트워크 대기 시간을 줄이고, 많은 요청을 동시에 처리
- 데이터 영속성
- RDB 스냅샷 : 일정 간격으로 데이터베이스 상태를 스냅샷으로 저장 (dump.rdb)
- AOF 로그
- 데이터 변경사항을 지속적으로 기록, 재시작시 모든 변경사항 복구
Redis 고급 기능, 성능 최정화
- Redis Cluster
- 수평적 확장성 제공
- 여러 노드에 데이터를 분산 저장
- 대규모 데이터를 처리하는데 매우 유용, 클로스터의 각 노드가 일부 데이터를 관리
- 노드 추가로 시스템의 성능과 용량 쉽게 확장
- 데이터 파티셔닝
- 여러 노드에 분산 저장
- 데이터를 해시 슬롯이라는 개념을 분배하여 각 노드는 해시 슬롯의 일부를 관리
- 16384개의 해시 슬록 사용
- 키를 해시함수로 계간하고 그 값을 기반으로 적절한 노드에 데이터를 저장
- Redis Sentinel
- 자동 장애 복구 및 모니터링
- 고가용성 보장 : Maste 노드가 장애를 일으키면 자동으로 Failover를 실행하여 slave를 master로 승격
- Pub/Sub
- 실시간 데이터 스트리밍, 이벤트 처리, 알림 시스템에 적함
- 메시지 브로커 역할
- Lua 스크립트
- 원자적 트랜잭션 및 복잡한 로직 처리
- 복잡한 로직을 클라이언트가 아니라 서버 측에서 직접 처리해서 성능을 최적화하고 데이터 일관성 보장
- 성능 향상
- 클라와 서버간의 불필요한 왕복을 줄이고 복잡한 작업을 서버에서 실행함으로서 전체 성능을 향상
- 여러 명령을 하나의 트랜잭션으로 묶어 처리
- Pipelining
- 네트워크 왕복 횟수 감소
- 성능 최적화
- 네트워크 오버헤드 줄임, 클라 서버 간의 통신이 빈번할때 활용
성능 최적화 전략
- 메모리 최적화
- 데이터 압축 사용 및 메모리 정리 (ziplist, intset)
- LRU/LFU 정책
- 파티셔닝 활용
- 데이터를 여러 노드에 분산 저장
- 데이터를 해시 슬롯을 기반으로 분산시켜 대규모 데이터 처리
- 시스템 부하를 분산시켜 각 노드가 처리해야할 데이터량 줄임
- TTL 설정
- 자동 데이터 제거
- 각 키에 대해 TTL을 설정하여 일정시간이 지나면 자동으로 데이터를 삭제하는 기능
- 불필요한 데이터관리
- 메모리 관리 최적화
- Pipelining
- 네트워크 왕복 횟수 감소, 명령어 처리 속도 향상
Redis 잠재적인 문제와 해결방법
- 메모리 부족
- 원인
- Redis는 메모리에 데이터를 저장하므로, 저장되는 데이터의 양이 많아질수록 메모리 사용량이 증가
- 일정 메모리 한도에 도달하면 더 이상 새로운 데이터를 저장할 수 없게 되어 문제가 발생
- 메모리 부족은 주로 캐시 데이터나 대규모 키 저장소를 운영할 때 자주 발생
- 해결 방법
- maxmemory 설정
- LRU/LFU
- 데이터 압축 및 데이터 타입 최적화
- 복제 지연
- 원인
- 네트워크 지연 : Master에서 Slave로 데이터가 전송되는 동안 네트워크 지연 발생, 네트워크 대역폭이 낮거나, 여러 노드 간의 거리가 먼 경우 지연 심화
- Slave 성능 저하 : Slave 노드가 처리해야할 작업이 많거나, CPU, 메모리 등 자원 부족으로 지연 발생
- 대규모 쓰기 작업 : Master에서 대량의 쓰기 작업이 발생할때 Slave 노드가 그 작업을 처리하는데 시간이 오래 걸려 지연
- 해결방법
- 복제 압축 활성화
- 비동기 복제 사용
- Slave의 성능 최적화
- 데이터 영속성 및 복구 시간
- 원인
- AOF 파일 크기 증가 : 데이터를 변경할때 마다 AOF 파일에 기록하므로 시간이 지남에 따라 AOF 파일이 커림
- AOF 파일이 커질수록 Redis가 재시작 시 해당 로그를 모두 재생하는데 시간이 오래 걸림
- 주기적인 AOF 파일 압축 미실행 : Redis는 주기적으로 AOF 파일을 압축 재작성하여 파일 크기를 줄일 수 있지만 이 작업이 제대로 실행안되면 파일 크기 계속 증가
- 해결 방법
- AOF 파일 압축, 재작성
- AOF와 RDB 병행 사용