래디스(Redis)
Redis는 오픈소스인 키-값(key-value)기반의 인-메모리 데이터 저장소
- 쿼리가 필요없고 메모리에서 데이터처리하기(DB는 디스크에 데이터를 씀) 때문에 속도가 빠름
- Single Thread이기 때문에 원자성(atomic)을 보장하여 Race condition에 빠지는 것을 방지
- 다양한 데이터 구조(Collection) 제공 (Strings, Lists, Sets, Sorted Sets, Hashes)_다양한 용도로 사용가능
사용처: Remote Data Store(여러 서버의 Data공유를 위해), 인증 토큰 저장 , Ranking Board에 주로 사용.
캐시(Cache)
Cache란 나중에 요청할 결과를 미리 저장해둔 후 빠르게 서비스 해주는 것을 의미
- cache hit : 캐시서버에 데이터가 있어서 DB에 요청하지않고 바로 클라이언트에 데이터를 반환하는 경우
- cache Miss: 캐시서버에 데이터가 없어서 DB에 해당데이터를 요청하는 경우
캐시서버 : 사용자가 늘어나 WEB-WAS-DB 구조의 서비스에서 DB만으로는 부하를 견딜 수 없기에 도입
유의점: 캐시서버는 빠른 속도를 위해 주로 메모리를 사용하기 때문에 서버장애시 데이터 손실가능
< Cache의 작업 플로우>
- Client로 부터 요청을 받는다.
- Cache와 작업을 한다.
- 실제 DB와 작업한다
- 다시 Cache와 작업한다.
REDIS의 캐싱전략
look aside cache (Lazy Loading) 전략
레이지 로딩은 클라이언트에게서 데이터가 필요로 해질 때 Cache에 로딩하는 전략
→ 최신 데이터가 아닐 가능성이 있지만 캐싱 미스가 발생했을 때 심각한 오류를 발생 X
Write-Through전략
write-through 전략은 데이터를 추가하거나 업데이트할 때 캐시에 동시에 업데이트하는 전략
→ 항상 최신의 데이터를 유지하지만 캐싱 미스가 발생 했을 경우 잘못된 경우가 발생할 수 있으며 불필요한 메모리를 사용하여 낭비가 발생 가능
각 전략에 TTL(key가 자연스럽게 만료되어 없어지게 하는 시간(Redis의 경우 Integer 당 1밀리초 단위))을 설정하여 단점을 보완할 수 있다.
Redis 메모리관리
Max Memory
Redis는 Redis가 아는, 자기가 사용하는 메모리의 크기를 max memory로 설정 (메모리를 줄이기 위해)
메모리 파편화
메모리를 페이지단위로 반환하기때문에 실제 요청보다 훨씬 큰 용량을 할당받게 되는 경우
- Redis에서는 max memory를 설정하더라도 메모리 파편화는 어쩔수없이 발생
완화방법 : 1) 다양한 사이즈를 가지는 데이터보다는 유사한 크기의 데이터를 가지도록 관리 2) 큰 메모리를 사용하는 instance 하나보다는 적은 메모리를 사용하는 instance 여러개 사용
COW(copy on write)방식
Redis는 쓰기요청 발생시 copy on write 방식으로 작동(fork() 수행)
ex) 8GB Instance 를 썼을때 write → fork() 하면 32GB Instance (8GB * 3 + 8GB) 가 되는데, 24GB Instance 1개 였을때 fork() 하면 최종적으로는 48GB 의 메모리를 사용해야 함
→ 인스턴스를 쪼개서 운영하고 관리하는 것이 유리
Redis Failover
failover : 시스템 장애시 대체본으로 자동으로 변경되어서 장애를 극복하는 것
Redis Replication
eader follower replication (: master-slave ) 형태로 구성 → failover 상황 대비가능
Master server: 읽기,쓰기 전용
Slave server: master의 모든 데이터를 미러링 하고 있는 읽기 전용
운영모드(센티넬_Sentinel/클러스터_cluster)
레디스는 단일 인스턴스만으로도 충분히 운영이 가능하지만, 물리 머신이 가진 메모리의 한계를 초과하는 데이터를 저장하고 싶거나, failover에 대한 처리를 통해 HA를 보장하려면 센티넬이나 클러스터 등의 운영 모드를 선택해서 사용
데이터 영속성 (Data Persistence)
redis의 경우 기본적으로 disk persistence가 설정되어있기 때문에, 프로세스를 재시작 하더라도 셧다운 되기 전의 마지막 상태와 거의 동일한 (약간의 손실은 있을 수 있다) 상태로 돌려놓음
- RDB persistence
- AOF (append only file)
트랜잭션 모델(Transaction model)
Redis는 single threaded model이고 요청이 들어온 순서대로 처리