메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

Redis(레디스), 고성능 인메모리 데이터 저장소의 특징과 활용

한빛미디어

|

2024-07-03

|

by 하야시 쇼고

6,819

레디스 REmote DIrectory Server (Redis)는 인메모리 데이터 구조 저장소로써 인메모리에서 빠르게 동작하고, 자료형과 기능이 다양한 비관계형 데이터베이스입니다. 이 데이터베이스는 속도가 빠르고 다양한 자료형과 기능을 이용해서 데이터를 표현할 수 있으므로 최근 웹 시스템 등에서 널리 사용하고 있습니다.

 

 

레디스를 사용하기까지

 

레디스는 BSD 라이선스의 오픈소스 소프트웨어입니다.* ANSI C로 작성했으며, 아주 작은 메모리로도 데이터를 유지할 수 있습니다. 이 인메모리 데이터베이스는 뛰어난 성능과 간단하고 유연한 데이터베이스 기능, 그리고 간편한 설정이라는 장점이 있어 널리 사용하고 있습니다.

 

2010년쯤 NoSQL이라는 키워드가 유행했습니다. NoSQL은 KVS나 열 지향 데이터베이스, 문서 데이터베이스, 그래프 데이터베이스 같이 SQL 데이터베이스가 아닌 종류를 일컫습니다. MongoDB나 멤케시디 등이 대표적인 NoSQL이죠. 

 

NoSQL은 특정 데이터 모델 전용 설계, 빠른 속도 등의 장점으로 인기를 끌었습니다. RDBMS의 특성상 구현하기 어려운 부분도 있으므로 NoSQL과 RDBMS는 우열을 가리는 관계라기보다 트레이드오프Trade-Off라고 할 수 있습니다. 또한 사용할 데이터베이스는 비즈니스의 요구사항에 따라 결정됩니다.

 

레디스는 특성상 주로 NoSQL 범주로 분류되며, 최근에는 용도에 따라 RDBMS와 레디스등 데이터베이스를 함께 사용하는 방식이 늘고 있습니다. 

 

*2024년 3월부로 레디스는 기존 BSD 라이선스에서 Redis Source Available License(RSALv2)와 Server Side Public License(SSPLv1)의 듀얼 라이선스로 변경되었습니다.

 

 

레디스의 특징

 

레디스는 고속 메모리에서 처리를 수행하며, 메모리 사용량 최소화 등의 기술을 사용합니다. RDBMS를 사용할 때도 메모리에서 처리하는 경우가 많지만, 레디스는 특히 인메모리 처리에 최적화되어 있어 더 빠르게 동작합니다. 이러한 이유로 빠른 응답이나 실시간 데이터 교환이 중요한 최근 웹 애플리케이션에서는 레디스를 높은 선택지로 평가하고 있습니다.

 

물론 트레이드오프도 고려해야 합니다. 레디스가 동작하는 메모리는 SSD/HDD에 비해 가격이 높아 용량을 확보하기 어렵다는 문제가 있습니다. 또한 SQL처럼 표현력이 뛰어난 수단이 없으며, 일부 트랜잭션 기능을 지원하지 않습니다. 이처럼 레디스는 범용성이 높은 RDBMS와 비교했을 때 용도가 제한되기도 하므로, 주로 RDBMS 등과 함께 조합하여 사용합니다.

 

예를 들어, 웹서비스에서는 MySQL(마스터 데이터베이스) + 레디스(캐시)와 같이 구성하는 것이 대표적입니다. 구체적으로는 MySQL의 앞단에 레디스를 배치해서 레디스의 인메모리에서 데이터를 가져오는 구성으로 사용하는 것입니다.

 

3-1의 경우, 캐시를 찾은 후 바로 결과를 응답하고 끝납니다. 3-2의 경우, 4-2,5-2로 이어집니다.

 

웹 애플리케이션 중에는 MySQL과 같은 RDBMS만을 사용해서 데이터를 영구적으로 저장 하거나 읽고 쓰는 작업을 하는 경우가 많습니다. 이러한 데이터 관리 방식은 대부분 잘 동작 하지만 서비스 규모가 커지거나 복잡해지면 예상대로 동작하지 않는 경우가 있습니다.

 

이런 문제는 대부분 RDBMS 사용법,인덱스 설정이나 쿼리 설계등을 통해 해결할 수 있습니다. 하지만 SQL의 쿼리를 다시 설계해서 튜닝하고 노드 스펙, 클러스터 대수 등을 알맞게 구성하더라도 관리 비용이 증가하는 경우가 있습니다.

 

이런 상황에서 빠른 처리 속도, 다양한 자료형 및 표현력 등 레디스의 장점들이 진가를 발휘합니다. 예를 들어, ‘마스터 데이터’는 MySQL로, 테이블 내 처리된 ‘결과 데이터’는 캐시 데이터로 레디스에 저장하도록 구성합니다. 이런 구성 방식을 통해 애플리케이션 구현이 간단해지고, 밀리 초 미만의 응답 시간이 필요한 서비스에서도 빠른 응답을 기대할 수 있습니다. 기존의 데이터 관리는 RDBMS에 맡겨 두고, 레디스 활용이 가능한 부분은 레디스로 교체하는 등 전체 구성을 바꿈으로써 작업 효율성을 높일 수 있습니다.

 

 

속도가 빠르고 기능이 많은 인메모리 데이터 저장소

 

인메모리 내에서 데이터를 처리하여 속도가 빠른 데이터 구조 저장소라는 점이 매력적인 레디스는 다음과 같은 특징도 있습니다.

 

1) 인메모리 동작 기반의 빠른 처리 속도

앞서 언급했듯이, 레디스의 빠른 처리 속도는 큰 장점입니다. 인메모리, 작은 메모리 사용량, 추후 설명할 이벤트 주도 요청 등으로 인해 아주 빠르게 동작합니다. 실행 속도는 레디스가 배포하는 redis-benchmark라는 부하 벤치마크 도구로도 측정할 수 있습니다.

 

2) 다양한 자료형과 명령어

레디스는 다양한 자료형을 통해 밀리 초 미만으로 응답하면서, 복잡한 데이터 구조를 저장할 수 있으므로 캐시 외에 다양한 용도로도 활용하기 좋습니다. 자료형이 풍부하지만 결코 어려운 내용은 아닙니다. 명령어 종류도 다양하며, 하위 명령어를 포함하면 400여 종류에 가까운 명령어를 제공합니다.

 

3) 데이터 영속성

레디스는 기본적으로 데이터의 영속성을 갖추고 있습니다. 인메모리이기 때문에 데이터의 휘발성을 고려할 수밖에 없지만, 레디스에서는 크게 두 가지 종류의 영속성을 제공합니다.

 

RDB의 스냅숏 생성 기능은 기본적으로 활성화되어 있으며, 설정한 시점에 백업을 생성합 니다. 또한 RDB 외에 장애 등이 발생했을 때 활용하기 쉬운 AOF도 있습니다. AOF는 기 본적으로 비활성화되어 있지만, RDB와 조합하여 활성화시키면 데이터의 손실 위험을 최소화하면서 레디스의 재시작 시간을 단축할 수 있습니다.

 

4) 레플리케이션 및 클러스터 기능을 통한 확장성 및 고가용성

레디스는 레플리케이션과 클러스터를 지원합니다. 설정에 따라서 확장성, 가용성 문제를 비교적 깔끔하게 해결할 수 있습니다. 이러한 기능의 확장으로 인해 레디스의 인기가 점차 많아지고 있습니다.

 

5)클라이언트/서버 모델 기반의 요청/응답 통신

레디스는 쉽게 이해할 수 있는 클라이언트/서버 모델을 채택하여 요청/응답 방식으로 통신하며, 다양한 환경에서도 사용할 수 있습니다.

 

많이 사용되는 CLI 클라이언트인 redis-cli 외에도 넷캣Netcat이나 텔넷Telnet에서도 사용할 수 있습니다. 또한 레디스는 다양한 언어 클라이언트용 라이브러리가 있습니다. 공식 문서에 게재되어 있는 것만 해도 50개 언어를 지원합니다. 그러므로 개발 언어에 구애받지 않고 레디스를 도입할 수 있습니다.

 

6) 루아를 통한 유연한 처리

레디스는 루아 스크립트 기능을 내장하고 있으며, 루아 스크립트로 여러 개의 레디스 명령을 한번에 수행할 수 있습니다. 데이터 추가하기와 가져오기 등 redis-cli에서 할 수 있는 작업을 스크립트를 통해 실행할 수 있습니다. 루아 스크립트를 사용함으로써 유연성이 증가하고 성능의 이점도 기대할 수 있습니다.

 

루아 스크립트는 RDBMS의 저장 프로시저Stored Procedure와 유사하므로 쉽게 이해할 수 있을 것입니다. 이와 같은 방식을 통해 데이터베이스에서 직접 처리하는 부분을 클라이언트에서 따로 프로그래밍하는 수고를 덜 수 있습니다.

 

루아 스크립트를 레디스 서버에 전달하여 일괄적으로 실행할 수 있습니다. 일련의 명령어를 하나씩 실행하지 않고, 코드를 작성해서 일괄적으로 실행하기도 합니다. 즉, 하나의 루아 스크립트는 하나의 레디스 명령어와 동일한 레벨로 수행됩니다. 이 경우, 코드의 실행은 원자적Atomic으로 수행됩니다.

 

여기서 원자적이란 용어는 일련의 트랜잭션 내 작업이 모두 성공하거나 모두 실패한다는 것을 의미합니다. 어떤 처리 도중에 다른 작업이 간섭하여 실행되면 예상한 대로 동작하지 않는 경우가 많습니다. 루아 스크립트를 사용하면 복잡한 처리를 수행하면서도, 하나의 명령어로 원자적으로 처리할 수 있습니다.

그리고 루아 스크립트를 통해 레디스에서 높은 자유도로 데이터 저장소를 처리할 수 있습니다. 조건 분기와 같은 다소 복잡한 로직을 레디스 서버 측에서 실행할 수 있습니다. 루아 스크립트 실행 방법은 이페머럴 스크립트레디스 함수 두 가지가 있습니다.

 

7) 싱글 스레드 기반 요청 이벤트 주도 처리

레디스는 싱글 스레드 주도 처리 모델을 채택하고 있습니다. 싱글 스레드지만 이벤트 루프 를 형성하여 많은 요청을 처리할 수 있으며 ae라는 고유 이벤트 주도 라이브러리를 사용합니다. 싱글 스레드로 인한 성능 문제를 우려할 수 있지만, 싱글 스레드가 다른 지표(메트릭)에 비해 CPU 전체가 병목 현상을 일으키는 경우는 비교적 드뭅니다. 레디스를 여러 인스턴스로 실행하면 성능 문제를 어느 정도 해결할 수 있는 등 적절하게 사용하면 성능 문제를 해결할 수 있습니다.

 

또한 완전한 싱글 스레드가 아니라 성능을 위해서 부분적으로 멀티 스레드를 채택하고 있습니다. 레디스 4.0 이후로는 UNLINK, FLUSHDB, FLUSHALL의 ASYNC 옵션과 같은 삭제 작업 명령어로 멀티 스레드를 처리할 수 있도록 개선되었습니다. 

 

레디스 6.0 이후로는 데이터 접근 부분은 여전히 싱글 스레드지만, 옵션을 통해 I/O 부분은 멀티 스레드 처리를 활성화할 수 있습니다. 이렇게 하면 데이터 조작, 저장 및 검색을 효율적으로 수행할 수 있습니다.

 


위 콘텐츠는 『실전 레디스』에서 내용을 발췌하여 작성하였습니다.

댓글 입력
자료실

최근 본 상품0