목차
Redis 란?
Redis는 REmote Dictionary Server 의 약자로 오픈소스 DBMS 입니다.
인메모리 데이터 저장소이며 key-value 기반의 비정형 데이터를 저장하고 관리하는 NoSQL DBMS 입니다.
Redis는 빠른 성능과 다양한 데이터 타입을 지원하며 DB, 캐싱, 메시지 브로커 등 다양한 용도로 활용됩니다.
Redis 사용 이유
기존의 DB는 디스크에 데이터를 저장했습니다. 이는 서버에 문제가 생겨도 데이터가 손상되지 않는 장점이었습니다.
운영 초반이거나 규모가 작은 서비스는 사용자가 많지 않아 DB에 무리가 가지 않았습니다.
하지만 사용자가 많아져 부하가 높아진다면 DB에 과부하가 걸려 느려지는 문제가 발생할 수 있습니다.
이 때 Redis가 인메모리 데이터 저장소로 빠른 읽기, 쓰기 성능을 제공해 캐시 서버 역할을 수행하여 DB의 과부하를 줄이고 시스템 응답 시간을 개선하는데 도움을 줄 수 있습니다.
이 처럼 Redis는 주로 캐시로 사용되지만 그 밖에도 메시징 큐, 세션 저장소 등 다양한 용도로 사용합니다.
캐싱이란 무엇인가요?
캐시란 데이터를 빠르게 가져오기 위해 사용하는 중간 저장소를 말합니다. 주로 메모리에 저장되며 디스크나 DB 보다 빠른 접근 시간을 가집니다.
캐싱은 어떨때 사용하나요?
데이터를 직접 계산하거나 원격 서버에서 가져오는 것은 시간과 리소스가 많이 드는 작업입니다. 캐시는 이러한 연산을 최소화하기 위해 사용합니다. 처음에는 데이터를 일반적인 방법으로 가져오고 그 값을 캐시에 저장합니다. 그 후로 동일한 데이터가 필요할 때 마다 빠른 접근 속도를 가진 캐시에서 가져옵니다. 이런 방식으로 데이터 접근 시간을 단축시킬 수 있습니다.
Redis 특징
Redis의 주요 특징들은 다음과 같습니다.
- 인메모리 데이터 저장소
- 다양한 데이터 타입 지원
- master - slave 복제 기능
- sharding 지원
- 영속성 지원
하나씩 알아보도록 하겠습니다.
인메모리 데이터 저장소
Redis는 모든 데이터를 메모리에 저장하므로 데이터에 빠른 접근 속도를 가지고 있습니다.
그 이유는 디스크보다 메모리에 접근하는게 훨씬 빠르기 때문입니다.
Redis를 사용하면 데이터에 대한 읽기, 쓰기 작업을 빠르게 수행할 수 있습니다.
하지만 모든 데이터를 메모리에서 처리하면서 메모리 용량 이상의 데이터를 저장할 수 없다는 제한이 따릅니다.
다양한 데이터 타입 지원
Redis는 key -value 형식 뿐만 아니라 List, Set, HashMap 등 다양한 데이터 타입들을 지원합니다.
다양한 자료구조를 지원하여 개발의 편의성을 증가시킵니다.
예시로 데이터를 정렬해야 하는 상황을 가정해보겠습니다.
DBMS를 사용하면 DB에 데이터를 저장하고 저장된 데이터를 정렬하여 읽는 과정을 거칩니다. 이 과정은 디스크에 직접 접근해야 해서 시간이 오래 걸립니다.
Redis를 사용하면 Redis에서 제공하는 Sorted-set 이라는 자료구조를 사용하여 더 빠르고 간단하게 정렬된 데이터를 받을 수 있습니다.
master - slave 복제 기능
Redis는 master - slave 복제 기능을 통해 데이터 읽기 성능을 향상시킬 수 있습니다.
일반적으로 한 서버에서 모든 읽기, 쓰기 요청을 처리하면 서버에 부담이 가며 성능 저하로 이어질 수 있습니다.
이러한 문제를 해결하기 위해 Redis는 master - slave 복제를 지원합니다.
master - slave 복제는 master 서버가 모든 쓰기 작업을 처리하고 이 변경 사항들을 slave 서버들에게 복제하는 것 입니다.
읽기 요청은 slave 서버에서 처리하므로 읽기 요청에 대한 부하를 여러 서버로 분산시켜 읽기 성능을 향상시킵니다. 또한 만약 master 서버에 문제가 생겨도 slave 서버는 작업을 계속 수행하므로 데이터 가용성을 보장할 수 있습니다.
Sharding 기능
Sharding(샤딩)이란 큰 데이터베이스를 여러 개의 작은 부분(shard)로 분할하는 것 입니다.
각 shard는 독립적인 데이터 세트를 가지며 별도의 서버에서 처리됩니다.
클라이언트가 쓰기 요청을 할 때 어느 shard에 저장할지 결정할 수 있습니다.
이를 통해 서버의 부하를 분산시키고 여러 서버를 병렬로 사용하여 쓰기 성능을 향상시킬 수 있습니다.
이는 위에 언급한 master - slave와 같이 쓰일 수 있습니다.
Sharding으로 데이터베이스를 shard로 나눈 다음 각 shard에 master - slave 노드가 있는 구조로 사용할 수 있습니다.
각 shard에 master 노드가 쓰기 작업을 처리하여 해당 shard에 slave 노드들로 복제됩니다.
이를 통해 쓰기, 읽기 성능을 높일 수 있습니다.
영속성 지원
Redis는 시스템 가용성과 데이터 지속성을 유지하기 위해 영속성을 지원합니다.
Redis는 인메모리 구조로 서버가 내려가면 데이터가 모두 없어지게 됩니다.
이를 방지하기 위해 Redis는 디스크에 저장하는 기능, 영속성을 지원합니다.
이를 통해 서버가 내려가도 디스크에 저장된 데이터를 읽어서 메모리에 있는 데이터를 복구할 수 있게 해줍니다.
데이터를 디스크에 저장하는 방식은 RDB, AOF 두 가지 방식이 있습니다.
RDB(Redis Database) 방식
이 방식은 특정 시점에 데이터 스냅샷을 디스크에 저장하는 방식입니다.
예를 들면 지정된 시간 동안 특정 수의 쓰기 연산이 발생하면 스냅샷을 생성해 저장합니다.
RDB 방식은 데이터 복구 속도가 빠르다는 장점이 있지만 스냅샷 이후의 데이터를 잃을 위험이 있다는 단점도 있습니다.
AOF(Append Only File) 방식
이 방식은 Redis의 모든 쓰기 명령을 디스크에 로그 형태로 저장하는 방식입니다.
이 로그 파일들은 Redis 서버가 다시 시작될 때 재실행되어 마지막 상태를 복원합니다.
AOF 방식은 완전하게 데이터를 복구하는 장점이 있지만 파일 크기가 크고 복구 시간이 오래 걸린다는 단점이 있습니다.
Redis 단점
Redis의 단점들은 다음과 같습니다.
- 메모리 사용량
- 복잡한 쿼리 미지원
메모리 사용량
Redis는 모든 데이터를 메모리에 저장하므로 대용량의 데이터를 다룰 경우 많은 메모리가 필요합니다.
이에 따라 메모리 비용이 증가할 수 있습니다.
복잡한 쿼리 미지원
Redis 는 간단한 데이터 읽기, 쓰기는 빠르지만 SQL 같은 복잡한 쿼리나 조인 기능을 제공하지 않습니다.
따라서 복잡한 데이터 조작이 필요한 경우 Redis 보다 관계형 DB가 더 적합할 수 있습니다.
보안 문제
Redis는 기본적으로 암호화되지 않은 통신을 사용합니다. 이는 SSL/TLS를 사용하여 어느 정도 보완할 수 있지만 추가적인 설정이 필요합니다. 또한 Redis는 기본적으로 암호 없이 바인딩되어 외부로부터 접근이 가능하므로 보안 설정이 중요합니다.
(실제로 프로젝트를 진행하면서 데이터가 날아간 적이 있었습니다.)