Redis

Redis 와 Cache 에 대해서

Redis

Redis (Remote Dictionary Server)는 메모리 기반의 다양한 구조 데이터를 메모리에 저장이 가능하여 높은, Read, Write 성능을 보장하는 비관계형 데이터베이스 이다. 그래서 Caching Solution 으로 많이 사용중인데, 그렇다면 Caching Solution 는 왜 필요할까?


Cache

Cache 는 여러가지의 의미와 정의가 있지만, 요청에 대한 응답을 빠르게 서비스하기 위해 미리 저장해두는 저장소라고 정리할 수 있다. 같은 요청과 응답에 대해 DB 접근 없이 메모리 접근만으로도 빠르게 응답 처리할 수 있을 것이다.

이러한 Cache 정보를 저장하는 Caching 처리를 할 때, 다양한 자료 구조 형태(String, Set, List 등)로 관리를 해주는 것이 Redis 이다.


Redis 의 특징

  • 영속성을 지원하는 In-Memory 데이터 저장소이다.
  • 메모리에 데이터를 저장하기 때문에 처리 속도가 빠르다.
  • 디스크에도 저장되기 때문에 데이터 복구가 가능하다.(Memcached 와 차이점)
    • 복구를 위한 디스크 저장 방식도 2가지로 나눠진다.
  • 만료일을 지정하는 방식에 따라 다양한 데이터 삭제 처리가 가능하다.
  • 저장소의 메모리 재사용하지 않는다.
  • 다양한 데이터 타입을 지원한다.
    • Redis 가 지원하는 데이터 타입
      1. Strings : 단순한 key-value 구조
      2. Sets : 중복이 없는 순서가 없는 Strings 데이터 구조
      3. Sorted Sets : Sets 구조의 순서를 보장하는 구조
      4. Hashs : key-value 의 다중 구조 Object 를 저장할 수 있는 데이터 구조
      5. Lists : Array 형태의 데이터 구조
  • Master-Slave 구조의 Server 복제를 지원한다.
    • version 5.0.0 부터는 slave 용어보단 secondary 로 변경
  • Write 성능을 위해 Client 에 Sharding 을 지원한다.
    • Sharding ? 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법

Redis 의 장점

  • 다양한 자료구조의 데이터 처리 가능
  • List 형 데이터의 입력과 삭제의 성능은 MySQL에 비해 10배 정도 빠른 성능 차이를 발휘
  • 메모리를 활용하면서 영속적인 데이터 보존 가능
    • 삭제, expries 설정이 아니라면 데이터가 삭제되지 않음
    • SNAPSHOT 스냅샷 기능을 제공하여 메모리의 내용을 별도 파일로 저장가능하여 복구 기능 제공
  • 1개의 Single Thread 로 수행 되기 때문에, 서버 하나에 여러개의 서버 운용이 가능하다.

Redis Caching 전략

Look aside cache

일반적인 Caching 처리 전략

  1. Client 으로부터 요청을 받아, 먼저 Cache 에서 데이터가 있는지 확인한다.
  2. Cache 에 요청에 대한 데이터가 있는 경우 해당 데이터를 응답해준다.
  3. Cache 에 데이터가 없는 경우, DB 조회 후 응답 처리한다.

Write back

데이터를 일단 Cache 에 모두 저장하고, 특정 시점마다 한번씩 DB 에 insert 하는 전략

  • ex) 500건 데이터를 추가할 때,
    • insert를 500건씩 하는 것보단, 500건을 모아서 한번에 insert 하는 것이 빠르다.

하지만, 메모리 공간에 데이터 저장은 유실이 될 가능성이 높기 때문에, 재생 가능한 데이터 혹은 insert 하기 heavy 한 데이터를 추가할 때 유용한 전략


Redis 관리

Redis Key

  • Redis 의 Key 는 문자열이기 때문에 모든 이진 시퀀스를 키로 사용 가능하고, 빈 문자열까지도 Key 가 될 수 있다. 최대 Key 크기는 512MB 이다.
  • Redis 의 Key 설계는 매우 중요하며, 설계에 따라 Redis 의 성능 차이가 발생할 수 있다.

Expire Set 기능

  • 적절한 만료일을 지정해야 메모리 부하 조절이 가능하다.

Maxmemory policy

Redis 의 memory 도 한계가 있기 때문에 서비스 운영할 때, 모니터링과 관리는 필요하다. 만약 memory 의 한계에 도달하여 서비스의 지연을 방지하기 위해 Redismaxmemory policy 를 적절하게 이용하여 메모리 확보를 하는 것이 중요하다.

  • noeviction : 기존의 데이터를 그대로 유지하는 정책. 결국 OOM(Out Of Memory) 오류를 반환하고 새로운 데이터를 삭제
  • allkeys-lru : LRU(Least Recently Used) 페이지 교체 알고리을 통해 데이터를 삭제하여 메모리르 확보
  • volatile-lur : expire set 을 가진 데이터 중 lru 에 의해 삭제하여 메모리 확보
  • allkeys-random : random 으로 데이터를 삭제하여 메모리 확보
  • volatile-random : expire set 을 가진 데이터 중 random 으로 데이터를 삭제하여 메모리 확보
  • volatile-ttl : expire set 을 가진 데이터 중 ttl(time to live) 값이 제일 작은 데이터 순으로 삭
  • allkeys-lfu : 가장 적게 access 된 데이터부터 삭제하여 메모리 확보
  • volatile-lfu : expire set 을 가진 데이터 중 가장 적게 access 된 데이터부터 삭제

Redis Replication

Redis 의 Read 분산과 데이터 이중화를 위한 Master - Slave 구조를 사용할 수 있다. Master 에서 Read/Write 모두 수행하지만, SlaveRead 만 가능하다. 그래서 Slave 에도 같은 데이터가 존재해야하기 때문에 Redis Replication 이 발생하게 된다.

Redis의 Replication 과정

  1. 먼저 Slave 설정에서 replcaof <master ip> <master port> 을 통해 Master 에 데이터 sync 를 요청한다.
  2. Master 에서 .rdb 파일을 생성하기 위해 fork 를 통해 메모리를 복사하여 디스크에 저장한다. 이 과정에서 들어오는 데이터는 모두 Buffer 에 저장한다.
  3. Master 에서 생성된 .rdb 파일을 Slave 에 전달하고 디스크에 저장한 후 메모리에 로드한다.
  4. MasterBuffer 모아둔 데이터는 다시 Slave 로 전달한다.

Replication 시 주의할 점은, 위 과정에서 Master 에서 메모리 데이터를 복제하기 위해서는 그만큼의 동일한 크기 메모리 저장이 필요하다.

또한, 만약에 Master 가 장애가 발생하게 되면, Client 를 Slave 를 통한 Read 만 가능하다. 그래서 Slave 를 승격시켜줘야한다. 이러한 failover 를 대비한 Redis 만의 방식이 있다.


Redis Failover 처리 방식

Redis Cluster 기반 Failover

Redist Cluster 는 Redis 의 여러 노드들이 각자 Hash 기반의 Slot 를 가지고 있기 때문에, 여러개의 Master - Slave 구조를 구성할 수 있다. 이런 구조는 Master 1 장애를 Slave 1 이 책임질 수 있는 구조를 만들 수 있다.

Coordinator 기반 Failover

zookeeper, etcd, consul 등의 Coordinator 를 활용한 failover 방식이다. Health Checker 를 통해 각 Redis 의 상태를 감지하고, 장애가 발생한다면 다른 Redis 를 Master 로 승격하는 방식이다.

VIP or DNS 기반 Failover

Redis 서버마다 Virtual IP 를 설정하고 Health Checker 가 Redis 상태 변경할 때마다 VIP 변경하여 장애에 대응한다. (DNS 방식은 DNS 를 변경해주는 차이점이 있다.)


Redis 관련 다른 Post

Reference