Redis란? - ShinHeeEul/exerciseELK GitHub Wiki

Redis란?

  • Remote Dictionary Server의 약자
  • In-memory Cache Solution
  • 기본적으로 Single Thread 구조
  • Atomic한 특성이 있음
  • Critical Section에 대한 동기화 제공
  • 서로 다른 Transaction Read / Write 제공

Java의 변수를 활용해도 되잖아?

  • 서버가 여러대인 경우 Consistency 문제 발생
  • Multi-Threaded 환경에서 Race Condition이 발생할 수 있음.
  • 사실 ConCurrent 패키지가 있어서 서버가 한대 뿐이라면, Redis를 쓰지 않아도 된다.

왜 싱글 스레드로 만들어졌을까?

  • 동시성 문제 단순화 가능
  • 인 메모리 특성상 빠른 I/O 제공 가능
  • 컨텍스트 스위칭에 드는 오버헤드 최소화 가능

Redis 아키텍처 구성

Replication

  • Master와 Replica만 있음.
  • 장애 발생시 수동으로 대처

Sentinel

  • Master와 Replica 외에 센티널 노드들이 필요함.
  • 센티널 노드는 일반 노드들을 모니터링 하는 역할
  • 장애 발생 시, 자동으로 페일 오버(장애 조치) 진행

Cluster

  • 최소 3대의 마스터가 필요
  • 샤딩 기능 제공
  • 모든 노드가 서로를 감시하며 마스터가 비정상 일때 자동 페일 오버
  • 최소 3대 이상의 마스터 노드가 필요함.
  • Constant Hashing 방식으로 샤드 해시 관리
  • 스케일 아웃 + HA 구상

Redis 백업 방식?

AOF(Append Only File)

  • 들어오는 커멘드를 전부 파일에 기록하는 방법
  • 커지기만 하기 때문에 주기적으로 날려줄 필요가 있음.
  • 장애 상황 직전까지의 모든 데이터가 보장되어야 할 경우
  • everysec인 경우 최대 1초 사이의 데이터 유실 가능

RDB

  • 값 자체를 영구적인 DB에 저장하 백업
  • redis.conf 파일에서 SAVE 옵션으로 저장
  • 백업은 필요하지만 어느정도 데이터 손실이 발생해도 괜찮은 경우
  • RDB & AOF 동시 사용

Redis 꿀팁들

Redis는 싱글 스레드에서 동작한다.

  • 오래 걸리는 명령어 실행 시, 타 작업을 하지 못해 장애가 발생할 수 있다.
  • keys는 재귀적으로 key를 호출하는 scan으로 대체가 가능하다.

Hash나 SortedSet에 많은 데이터가 들어갈 시 성능 저하로 이어진다.

  • 최대 100만 이상 저장되지 않도록 잘 분산하자.

Key를 삭제할 때 delete로 하는 것보다 unlink가 더 효율적이다.

  • background에서 key를 지워주기 때문!

MAXMEMORY-POLICY = ALLKEYS-LRU

  • 데이터가 꽉찼을 떄 LRU(가장 자주 사용되지 않은 키부터 삭제) 방식으로 삭제
  • 기본은 삭제 안한다는 거임!

Duplicate Read / Duplicate Write

  • 다수의 서버가 Redis를 바라보고 있다가, 만료된 데이터를 다시 Redis에 올리기 위해, 다 같이 DB로 접근했다가 다 같이 Redis에 올리는 현상
  • 해결 책 : TTL 시간을 늘리자..? (모르겠다)

In Memory Database 특성상 메모리 파편화, 가상 메모리등의 이해가 필요하다.

  • 메모리 파편화 : 조각 공간보다 큰 데이터가 들어왔을 때 이 데이터들을 활용하지 못하는 경우가 있어, 더 크게 잡힐 수 있다.
  • 가상 메모리 : 실제 메모리보다 커지면 swap 과정이 일어날 수 있는데 단일 스레드다보니 성능 저하로 이어질 수 있다.
  • Replication - Fork : 백업을 위해 자식 노드로 복사할 때, 메모리에 먼저 Fork를 뜬 뒤 이를 복사하는 형태다. 그러다보니 메모리에 여유 공간이 있는 것이 중요하다.

참고

테코톡 - 디디의 Redis NHN Forward 2021 - Redis 야무지게 사용하기 매일메일 - Redis