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 병행 사용
       

 

'Backend' 카테고리의 다른 글

카프카의 고급 기능  (0) 2025.02.13
카프카  (5) 2025.02.13
시스템 확장  (0) 2025.02.08
분산 시스템  (0) 2025.02.03
대규모 트래픽 처리  (0) 2025.02.03

+ Recent posts