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