remote dictionart server, 직역하면 외부의 딕셔너리 구조로 이루어진 서버이다.
KeyWord
Redis 를 사용하는 이유에 대해 접근을 해보려면 우선 메모리별 속도의 차이를 알아야 합니다.
다음 그림과 같이 메모리에는 계층이 존재 합니다. (메모리라고 다 같은 메모리가 아닙니다.)
일반적으로 위로 올라갈수록 속도가 빨라지며, 속도와 가격은 비례하며, 가격과 용량은 반비례 합니다.
보통 자료를 저장하거나 상태를 저장할때 DB에 저장한다고 합니다.
이 DB는 일반적으로 HDD(하드디스크), SSD 와 같은 비교적 용량에 비해 가격이 저렴하고 속도는 느린 메모리를 사용하게 됩니다.
거기에 캐시는 속도가 매우 빠르지만 저장할 수 있는 용량이 하드디스크에 비해 턱없이 작아서 많은 데이터를 저장하기엔 무리가 있습니다.
(그래서 캐시를 최대한 활용하기 위해 캐시에 hit되는 횟수를 늘리기 위해 캐싱알고리즘이 중요한 이유이기도 합니다.)
이제 그러면 캐시 아래에 있는 Main Memory에 눈이 가게 됩니다.
컴퓨터를 살 때 주요 스펙 중 하나인 RAM입니다.
당연히 하드디스크보다는 속도가 월등히 빠르며, 우리가 빠른 결과값, 수시로 변하는 데이터값 (주식차트, 코인차드 등등)을 DB를 이용해 처리를 하게 되면 속도 때문에 문제가 생길 수도 있습니다.
그러면 RAM이 짱이고 하드디스크는 쓸모 없는거 아니냐? 라는 의문이 들 수 도 있습니다.
RAM의 가장 치명적인 단점? 차이점?은 휘발성 메모리라는 점입니다. 전원이 꺼지면 모든 데이터가 휘발됩니다. (NVRAM이라는 비휘발성 메모리도 있기는 합니다!)
정리하자면, redis는 하드디스크를 사용하는 DB의 고질적인 속도 문제때문에, RAM을 캐시처럼 사용하기 위한 라이브러리라고 이해하면 될 것 같습니다.
여담: Redis는 오픈소스 라이브러리지만 메모리를 할당하는 알고리즘은 (jemalloc)을 사용합니다.
redis 변수
Redis는 In-Memory Data Store 이기 때문에 물리적인 메모리 용량 이상을 사용하면 문제가 발생합니다.
즉 넘치는 데이터를 저장하기 위해 SWAP을 진행 하게 되는데 이러한 SWAP이 있다면 SWAP으로 인한 속도가 늦어집니다. (Redis를 사용하는 목적을 생각하면 치명적입니다.)
=> 그러면 MaxMemory를 설정하고 때려박으면 알아서 관리해주지 않을까?
Redis가 아는 메모리 용량과 물리적인 메모리 용량은 다르다.. 성능이 중구난방으로 튀게 됩니다.
(jemalloc 보다 더 효율적인 메모리 할당 알고리즘을 짤 수 있다면, 직접 짜보시면 될수도?)
메모리가 만약 부족하다면?
Redis Replication은 redis를 복사하는 작업입니다.
위에서 언급했듯이 RAM은 기본적으로 휘발성 메모리이기 때문에, 서버가 다운되거나, 전원이 종료되면 모든 데이터가 휘발됩니다.
개인 컴퓨터의 RAM이 휘발되면 보통은 자소서가 날라가거나, 짜던 코드가 날라가거나.. 치명적인 문제이긴 하지만..
한 기업의 서버가 다운되어서 Redis의 데이터가 모두 휘발되면 엄청난 손해가 발생하게 됩니다.
즉 이런 휘발되는 단점때문에 Redis 데이터 자체를 이중화하는 작업이라고 이해하시면 쉽습니다.
기존의 서비스가 운영중이던 마스터 노드를 다른 레디스 노드에 복사하는 작업을 redis replication 이라고 이해하시면 됩니다.
redis replication 의 특징
결정적으로 redis에 관심을 가지게 된 이유입니다.
Redis는 단순히 DB보다 빠른 캐시 DB라고 단순하게 생각했었는데, 이를 Docker, Kubernatis와 연결하여 사용하는 Kafka vs Redis를 키워드로 많은 포스팅 글이 있어서 이를 계기로 학습을 하게 되었습니다.
메시지 브로커를 이해하기 위해 필요한 개념인 메시지 지향 미들웨어입니다.
그러면 메시지 브로커는 왜? 필요할까요?
그냥 클라이언트끼리 메시지를 주고받으면 안될까요?
클라이언트 끼리 메시지를 주고받으면 단일 서버에선 큰 문제가 안생길지도 모릅니다.
매우 많은 문제를 야기합니다.
이러한 메시지간 어플리케이션 의존성을 제거함으로서 여러가지 문제를 해결합니다.
서버 수가 유동적이어도 정상적으로 동작합니다.
수신 측 서버가 문제가 생겨도 정상적으로 동작합니다.
그럼, 만약 메시지 브로커 자체가 죽으면 어떻게 될까요?
이를 redis에서는 특징으로 Point-to-point messaging 로 설명합니다.
Pub/Sub
https://hevodata.com/learn/redis-message-queue/
https://binux.tistory.com/74
https://youtu.be/Gimv7hroM8A (우아한 테크톡)
https://youtu.be/mPB2CZiAkKM (우아한 테크세미나)