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
On the other hand, Persib is certain to be in the same group with 1 team each from Pot 1 to 3 in the East Region. Pot 1 East is filled by Shandong Taishan (China)/Bangkok United (Thailand), Sanfrecce Hiroshima (Japan), Jeonbuk Hyundai Motors (South Korea), and Zhejiang (China).
https://www.nobartv.co.id/berita-terkini , https://en.nobartv.co.id/berita-terkini , https://ko.nobartv.co.id/berita-terkini , https://ja.nobartv.co.id/berita-terkini , https://ar.nobartv.co.id/berita-terkini , https://hi.nobartv.co.id/berita-terkini
Next, Pot 2 East contains Port (Thailand), Sydney (Australia), Selangor (Malaysia), and Nam Dinh (Vietnam). While Pot 3 East is occupied by Lee Man (Hong Kong), Kaya FC-Iloilo (Philippines), Lion City Sailors (Singapore), and Muangthong United (Thailand).
https://ru.nobartv.co.id/berita-terkini , https://es.nobartv.co.id/berita-terkini , https://th.nobartv.co.id/berita-terkini , https://fr.nobartv.co.id/berita-terkini
After being drawn into 8 groups (4 East and 4 West), each team will play 6 group stage matches. The matches consist of 3 home matches and 3 away matches. The top two teams in each group will advance to the last 16.