본문 바로가기
Redis

[OSSCA Redis / 빅데이터 저장 및 분석을 위한 NoSQL & Redis] Part2

by 개복취 2023. 10. 26.

  1. 주요 Redis 특징
  2. Redis 사용 분야
    • Cache
    • Session Store
    • Distributed Lock
    • Rate Limiter
    • LeaderBoard
    • Queue

주요 Redis 특징

  • Redis(Remote Directory System) 는 키밸류 DB이면서 대표적인 In Memory 기반의 데이터 처리 및 저장기술을 제공한다. 다른 NoSQL 제품에 비해 상대적으로 빠른 R/W 을 지원한다.
  • 파티셔닝을 통해 동적인 스케일 아웃(Scale Out)인 수평 확장이 가능하다.
  • Expiration 기능으로 일정 시간이 지날 때 메모리 상의 데이터를 자동 삭제할 수 있다.
  • Master/Slave Replication 기능을 통해 데이터의 분산, 복제 기능을 제공하며 Query Off Loading 기능을 통해 Master은 R/W 를 수행하고 Slave는 Read만 수행할 수 있다.

Redis 의 Master / Slave 연결

 

 

Redis server, client (Standalone mode)

Redis Server, Client

redis의 기본 포트는 6379로 설정되어있다. 또한, cli에서 info 입력을 통해 Server / Client의 정보를 읽어올 수 있다.

 

 

 

Redis 사용분야

Cache (Look aside, Write back ... ), Distributed Cache

DB에 가져가지 않고 Redis에 1차적으로 저장한다. 다양한 타입의 다양한 정보를 필요에 따라 저장할 수 있다.

 

#Look aside Cache

https://tech.socarcorp.kr/dev/2023/06/27/handling-authentication-token-traffic-01.html

  • 웹서버는 데이터가 존재하는지 캐시를 먼저 확인한다.
  • 캐시에 데이터가 있으면 캐시에서 가져온다
  • 만약 캐시에 데이터가 없다면 DB에서 읽어온다.
  • DB에서 읽어온 데이터를 Cache에 다시 저장한다.

반복적인 호출이 많은 경우 적합한 전략이다.

 

#Write Back Cache

https://tech.socarcorp.kr/dev/2023/06/27/handling-authentication-token-traffic-01.html

  • 웹서버는 모든 데이터를 캐시에만 저장한다. (캐시가 큐의 역할을 한다.)
  • 캐시에 특정 시간동안의 데이터가 저장된다.
  • 캐시에 있는 데이터를 DB에 저장한다.
  • DB에 저장된 데이터를 삭제한다.

데이터 적합성이 높고 DB요청 수를 줄일 수 있지만 캐시에 장애가 발생할 경우 데이터가 유실되며 사용하지 않는 정보까지 캐시에 저장한다.

 

이외에도 cache 전략은 read through, write through, write around 가 있다.

https://tech.socarcorp.kr/dev/2023/06/27/handling-authentication-token-traffic-01.html

 

 

#Distributed Cache

  • 데이터가 많다면, 하나의 캐시 서버가 아니라 여러 캐시 서버를 구성할 수 있다.
    ex) Redis w/ Range, Redis w/ PreShard, Redis w/ Consistent Hashing

특정 키의 Range로 구분하는 Redis w/ Range, 샤딩 규칙을 정해두고 대규모 데이터를 저장해놓는 Redis w/ Preshard, 

<Consistent Hashing>

  • Consistent Hashing 을 통해서 key 를 분할
  • 없어져도 다시 만들 수 있는 Cache 형태에 적합

 

  • <Consistent Hashing 의 단점>
  • HashRing 을 균등하게 구성하더라도 부하는 균등하게 몰리지 않는다.
  • Hot Key등
  • 필요한 개수보다 더 많은 노드가 필요한 경우가 종종 발생.

 

Session Store

Session 을 개별서버나, 클러스터링이 아니라. 외부 스토리지(Redis)에 저장

웹 개발할 때 redis를 세션저장소로 사용할 수 있는 구성이다.

주로 스프링으로 개발할 때 관련 의존성을 빌드하면 레디스를 간편하게 사용할 수 있도록 지원해준다.

 

Distributed Lock ( Lettuce - spinlock, Redisson - pubsub)

서버간 동기화된 처리가 필요하고, 여러 서버에 공통된 락을 적용하기 위해 redis를 이용하여 분산락을 이용한다.
db등 공통된 데이터 저장소를 이용해 자원이 사용중인지 확인하기 때문에 전체 서버에 동기화된 처리가 가능하다.

  • 분산 락으로 동작
    • 낙관적 락(Optimistic Lock) (=어플리케이션이 제공하는 락) 으로 동작
    • Key가 존재하면 대기하는 형태 (바로 실패로 구성할지, Spinlock 형태로 동작할지의 고민 필요)

Distributed Lock / setnx Locking algorithm

  • setnx 의 특성을 이용하여, 하나만 Key 생성이 가능.
  • setnx로 Lock을 얻을 때는 해당 프로세스에 문제가 발생할 수 있으므로 ttl(time to live)을 꼭 설정한다.(충분한 시간으로)
  • Lock 실패시에는 spin lock형태로 계속 대기하거나 해당 작업 자체를 실패시키고 다시 retry 하는 전략을 취할 수 있다.
  • Lock 획득 시간이 길어지면, ttl로 Lock이 풀려서 중복 작업이 발생할 수 있다.

ex) Lettuce : spinlock 으로 구현되어있고 lock의 타임아웃 설정이 되어있지 않음 (Redis에 과부화)

Redisson : Lock에 타임아웃이 구현되어 있다. 스핀락을 사용하지 않고 pubsub 기능을 이용,  Lua 스크립트 사용한다.

 

https://redis.io/docs/manual/patterns/distributed-locks/

https://hyperconnect.github.io/2019/11/15/redis-distributed-lock-1.html

 

https://soyeon207.github.io/db/2021/08/29/distributed-lock.html

 

Rate Limiter

서비스를 운영하면서 가용성을 유지하기 위해 클라이언트의 과도한 사용에 대해 보호해야 한다. 이러한 방안으로 Rate Limit 알고리즘을 적용할 수 있다.

  • 잦은 업데이트가 필요한 경우, 저장소로 사용되는 케이스
    • 일종의 Write back 형태 or 전용 저장소로 동작한다.
  • Rate Limiter 이외에 View Count 등을 저장할때도 사용된다.
  • 5가지의 Rate Limit 알고리즘 종류가 있다.
    1. Leaky Bucket: 네트워크로의 데이터 주입 속도의 상한을 정하고, 트래픽 체증을 일정하게 유지한다.
    2. Token Bucket: 평균 유입 속도를 제한하고 처리 패킷 손실없이 특정 수준의 버스트 요청 허용가능
    3. Fixed Window Counter: 정해진 시간 단위로 window가 만들어지고 요청 건수가 기록되어 해당 window의 요청 건수가 정해진 건수보다 크면 해당 요청은 처리가 거부된다. (구현은 쉽지만, 기간 경계의 트래픽 편향 문제가 생김)
    4. Sliding Window Log: Fixed Window Counter 의 단점인 기간 경계의 편향에 대응하기 위한 알고리즘이다. window의 요청건에 대한 로그를 관리해야하기 때문에 구현과 메모리 비용이 높은 단점이 있다.
    5. Sliding Window Counter: Fixed window counter, Sliding window log의 로그 보관 비용 등의 문제점을 보완할 수 있는 알고리즘이다.

https://www.mimul.com/blog/about-rate-limit-algorithm/

 

LeaderBoard (Sorted Set - zset)

Sorted Set(zset)이 score로 저장할 수 있으므로 이를 응용하여 리더보드로 이용가능, DBMS로 할 수 있는 부분이지만 속도가 빠르다.

 

member 추가하기

$ ZADD <key> <score> <member>

 

score 작은 순서로 순위 조회하기 (1순위부터 보고 싶으면 0으로 시작)

$ ZADD <key> <시작> <끝> REV

score 큰 순서로 순위 조회하려면 후위에 REV를 붙인다.

 

 

 

 

 

sorted set 이외로도 Redis에서 제공하는 데이터 타입에 대한 이야기는 다음에 포스팅하겠다.