[DB] Redis란? HA를 위한 Redis 아키텍처

김진회·2023년 1월 4일
0

DB

목록 보기
7/8

1. Redis란?

Key-Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 DBMS이다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소이다.


2. 대표적인 특징

  • 여러 자료구조 지원한다.
    • String, Set, Sorted Set, Hash, List...
      👉 개발 편의성 향상
  • 빠른 속도
    • 인메모리 DB로 ram을 사용해서 빠르다.
       인메모리 DB는 메모리에만 데이터가 저장되어 장애가 발생하면 데이터가 사라질 수 있다.
       하지만, 레디스는 영속성을 보장하기 위해 데이터를 DISK에 저장할 수 있다.
       서버가 내려가더라도 DISK에 저장된 데이터를 읽어서 메모리에 로딩한다.
       
       데이터를 DISK에 저장하는 방식은 크게 두 가지 방식이 있다.
       - RDB(Snapshotting) 방식
         순간적으로 메모리에 있는 내용을 DISK에 전체를 옮겨 담는 방식
       - AOF (Append On File) 방식
         Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태
  • 싱글스레드
    • Redis는 싱글 쓰레드이기 때문에, 1번에 1개의 명령어만 실행할 수 있다.
  • 트랜잭션 기능 지원
  • 서버 복제 지원
    • Master - slave 구조로, 여러개의 복제본을 만들 수 있다. 데이터베이스 읽기를 확장할 수 있기 때문에 높은 가용성, 클러스터를 제공한다.
  • 샤딩 지원
  • Pub / Sub messaging
    • Publish(발행)과 Sub(구독)방식의 메시지를 패턴 검색이 가능하다. 따라서 높은 성능을 요구하는 채팅, 실시간 스트리밍, SNS 피드에 사용할 수 있다.
  • 위치기반 데이터 타입 지원
    • Redis는 실시간 위치기반데이터를 지원한다. 두 위치의 거리를 찾거나, 사이에 있는 요소 찾기등의 작업을 수행할 수 있다.

3. Redis 아키텍처

1) Standalone : No HA, 마스터

  • 레디스 서버 1대로 구성하며 이를 마스터 노드라고 한다.
  • 서버 다운시 AOF 또는 Snapshot 파일을 이용해 재시작한다.

2) Replication : Half HA, 마스터-슬레이브

  • 레디스 서버 2대(마스터-슬레이브)로 구성한다. 슬레이브는 마스터의 데이터를 실시간으로 전달받아 보관한다.
  • 마스터 다운 시 슬레이브 서버가 이를 대체한다. 하지만, 이때는 수동으로 슬레이브 서버를 마스터로 변경해야한다.
  • 한 마스터에 슬레이브를 여러 대 구성할 수 있다.

3) 이중화 + 센티널(Sentinel) : HA, 무중단 서비스 가능

  • 마스터-슬레이브 구성에 센티널을 추가해서 각 서버를 감시하도록 하며, 센티널은 마스터 서버를 감시하고 있다가 다운되면 슬레이브를 마스터로 승격시킨다.
  • 다운된 마스터가 다시 시작되면 센티널이 슬레이브로 전환시킨다.
  • 레디스 마스터 노드가 모든 데이터를 가지고 있으며 슬레이브는 마스터에 대한 복제본을 유지하고 있으며, 데이터를 분산하지 않는다.
  • 일반적으로 레디스 센티널은 레디스 서버마다 하나씩 설치하며, 레디스 서버와 분리된 프로세스이며 다른 포트를 사용한다. (센티널이 데이터 처리 X)
  • 레디스 센티널은 높은 가용성과 자동 fail over을 해결하지만 데이터 분산 문제를 해결하지 못한다.
    👉 Redis Sentinel Docker 보기

4) 레디스 클러스터(Cluster) : HA, 무중단 서비스 가능


👆 머신 하나가 죽었을 시 해결된다. 단, 두개가 죽으면 해결이 안 된다.


👆 위의 문제를 해결하는 방법이다.

  • 샤딩
    • 레디스 클러스터는 샤딩 방식이다.
    • 전체 데이터를 여러 마스터 서버에 분산 저장한다.
  • 해시 함수
    • 데이터를 나누는 방식은 키에 해시 함수를 적용해서 값을 추출하고 마스터 서버에 할당한다.
    • 예로 클러스터 구성시 해쉬 함수를 통해서 1~33까지를 1번 서버, 34~ 66번까지를 2번 서버, 3번 서버에 나머지를 할당한다.
  • 해시 슬록
    • 레디스에서 hash 값의 개수는 16384(0~16383)이고 슬롯이라고 한다.
  • 해시 태그
    • 해시 태그는 레디스 클러스터에서 다중키를 사용할 수 있는 유일한 방법이다. 다중키 작업을 진행하려면 동일 노드에 저장될 모든 키가 필요하다.
    • 해시 함수를 적용해 동일한 해시 슬롯에 여러 개의 키 이름을 저장할 수 있도록 사용된다.
  • 레디스 클라이언트
    • 클라이언트는 서버와 동일한 해시 함수를 가지고 있으며 마스터 서버에 접속해서 각 서버에 할당된 슬롯 정보를 가지고 있다.
    • 키가 입력되면 해시 함수를 적용해서 어느 마스터에 할당될지 판단하고 저장한다.
  • 데이터 서버 + 센티널
    • 각 마스터 서버는 데이터의 처리와 센티널의 역할을 같이수행한다.
    • 1번 마스터 서버가 다운되면 나머지 살아있는 마스터들 중에서 리더를 선출하고 리더가 1번 마스터의 슬레이브를 마스터로 승격시킨다.
  • 최소 3대
    • 마스터 서버는 최소 3대로 구성하고 각각은 슬레이브를 가질 수 있다.
  • 마스터를 관리하는 마스터는 없다. 이는 또 하나의 장애점이다.
  • 레디스가 사용하는 포트는 2개이며 하나는 클라이언트 하나는 노드 간의 통신을 위한 버스로 사용된다.

4. JWT를 사용할 때, Redis를 쓰는 이유

  • redis는 인메모리 데이터구조저장소로 ram을 사용해서 빠르다.
  • expire을 redis에서 설정가능해서 토큰 만료를 편하게 할 수 있다.

Reference

요약 이미지 출처: https://architecturenotes.co/redis/
https://azderica.github.io/01-db-nosql-redis/
https://sudo-minz.tistory.com/101
https://devlog-wjdrbs96.tistory.com/374
http://redisgate.kr/redis/configuration/redis_overview.php

profile
SSAFY 7기. HMG. 협업, 소통, 사용자중심

0개의 댓글