본문 바로가기

IT Note/Infrastructure

실시간 데이터 처리를 위한 Redis: 인메모리 DB의 개념과 설치 과정

안녕하세요, 여립입니다.

이번에는 Redis를 공부하고 설치하며 정리한 인메모리 데이터베이스의 개념과 Redis에 대해 작성해보려고 합니다.


Redis 로고

인메모리 데이터베이스란?

인메모리 데이터베이스는 기존의 디스크가 아닌 컴퓨터 메모리(RAM)에서 데이터를 저장하고 관리하는 데이터베이스입니다.

 

 

과거보다 큰 용량의 메모리를 사용할 수 있게 되면서, 메모리 활용에 긍정적인 환경이 되었습니다. 더불어 대용량 데이터의 증가와 함께 실시간 고성능 처리 수요가 높아지며, 인메모리 데이터베이스가 개발되었습니다.

 

Mysql, PostgreSQL, Oracle 등 일반적으로 많이 사용되는 대부분의 데이터베이스는 하드디스크 또는 SSD에 저장하지만 Redis같은 인메모리 데이터베이스는 서버의 주 메모리에 저장됩니다.

 

정보의 처리나 조회를 위해 디스크까지 왕복해야 하는 다른 데이터베이스와 달리 Redis와 같은 인메모리 데이터 저장소는 이러한 제약이 없기 때문에 더 많은 작업을 처리하고 더 빠른 응답 시간을 지원할 수 있습니다. 그렇기에 인메모리 데이터베이스는 실시간 분석, 캐싱, 세션 관리, 빠른 데이터 조회가 필요한 환경에 주로 사용됩니다.

 

하지만, RAM(주 메모리)는 휘발성으로 전원이 끊기면 데이터가 사라집니다.

 

이를 해결하기 위해서 인메모리 데이터베이스는 주기적으로 데이터를 디스크에 백업하거나 지속성을 위한 별도의 메커니즘을 사용합니다.

 

인메모리 데이터베이스 종류에 대해 더 알고싶으면?

https://bommbom.tistory.com/entry/%EC%9D%B8%EB%A9%94%EB%AA%A8%EB%A6%ACin-memory-db-%EC%9C%A0%ED%98%95%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%A2%85%EB%A5%98

 

인메모리(in-memory) db 유형에 따른 종류

인메모리(In-memory) 데이터베이스는 어떤 것이 있을까요? Redis, Memcached에 대해 인메모리 DB의 특징에서 알아보았지만 다른 것들도 많습니다. 인메모리 데이터베이스의 특징을 요약해 보면..

bommbom.tistory.com

NoSQL 이란?

전통적으로 많이 사용되는 데이터베이스는 SQL(Database)라고 부릅니다. "Structured Query Language"의 약자로 구조가 고정되어 있는 정해진 표 형식으로 저장하고 관리하는 방식입니다.


NoSQL 데이터베이스는 이러한 전통적인 SQL 데이터베이스의 한계를 보완하기 위해 등장한 새로운 방식의 데이터베이스입니다. SQL 외에도 다양한 방법으로 데이터를 저장하고 관리할 수 있다는 뜻을 가지고 있으며, 데이터를 표 형식 뿐만 아니라 다양한 형태로 저장할 수 있습니다.

NoSQL 데이터베이스의 종류에는 도큐먼트 DB, Key-Value DB, Column DB, Graph DB 등이 있습니다.

Redis (REmote DIctionary Server) !

= 원격 Dictinary (자료구조) 서버

 

Redis는 오픈 소스 기반의 인-메모리(In-memory) 데이터 저장소로, Key-Value 구조의 비관계형(NoSQL) 데이터 시스템입니다. 데이터베이스가 되기도 하고 캐시가 되기도 하는 등 다양한 목적으로 사용됩니다.

Redis의 특징

  1. 다양한 데이터 타입을 지원합니다; 데이터 타입으로 String / Set / Sorted Set / Hash / List 5가지를 지원합니다.
    https://medium.com/analytics-vidhya/the-most-important-redis-data-structures-you-must-understand-2e95b5cf2bce
     
    • String: 일반적인 key - value 구조의 형태로 텍스트와 바이너리 데이터를 저장할 수 있으며 , 최대 512MB 까지 저장이 가능합니다.
    • Set: String의 집합으로 여러 개의 값을 하나의 value에 넣을 수 있습니다. 중복 없이 데이터를 저장합니다. 여러 집합 간의 교집합, 합집합 또는 차이 등과 같은 집합에 대한 여러 다른 연산을 수행할 수 있다는 장점이 있습니다.
    • Sorted Set: 점수(score)와 함께 저장되는 집합으로, 점수를 기준으로 정렬됩니다.
    • Hash:  자바의 HashMap과 동일하게 작동하며, 필드-값 쌍으로 구성된 객체 데이터를 저장합니다.
    • List: 양방향 연결 리스트로, 요소를 순서대로 저장합니다.
  2. Redis의 주요 기능들은 해시 기반의 GET/SET 명령어를 사용하며, O(1) 시간 복잡도로 빠르게 처리됩니다; 빠른 성능!
  3. 데이터 지속성 (Persistent)을 위한 디스크 백업 방식: SNAPSHOT | AOF(Append Only File)
    • RDB Snapshot : 특정 시점의 메모리 데이터를 디스크에 덤프하여 저장합니다.
    • AOF(Append Only File) : 모든 쓰기 명령(쿼리)을 로그 파일에 순차적으로 기록하여 서버가 재시작될 때 재실행함으로써 데이터를 복원하는 방식입니다.
  4. 복제(Replication)과 분산처리(Clustering)
    https://www.stevenchang.tw/blog/2020/12/06/redis-notes-redis-sential
    • Redis cluster를 구성해 데이터를 여러 노드로 분산 시킬 수 있습니다.
    • 마스터-슬레이브 구조로 데이터를 복제해 장애 발생시 복구가 가능합니다.
    • Redis Sentinel로 장애 발생을 감지해 (한번의 장애가 아닌 정족수를 넘게 장애로 판단되는 노드를 장애로 간주함), 슬레이브를 마스터로 승격시킬 수 있습니다. 이로써, 다른 노드로 대체가 가능해집니다.
  5. Redis는 기본적으로 싱글 스레드 형식의 Event Loop 방식이며,  I/O Multiplexing을 통해 여러 클라이언트의 요청을 효율적으로 처리합니다.
    https://velog.io/@hope1213/Redis-%EC%A0%95%EB%A7%90-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%BC%EA%B9%8C
    • I/O 멀티플렉싱은 단일 프로세스 또는 스레드가 여러 I/O 작업을 동시에 모니터링할 수 있도록 해주는 기술
    • Redis 4.0 부터는 기본적으로 4개의 쓰레드로 동작하지만 일반 명령어를 처리하는 main thread 1개와 별도의 시스템 명령들을 사용하는 전용 sub trhead 3개 로써, 실제로 사용자가 사용하는 명령어들을 single thread로 동작한다고 생각하면 됩니다.
    • Redis 6.0 부터 ThreadedIO가 추가되어 사용자 명령이 멀티쓰레드가 지원이 됩니다. 하지만 명령어를 실행하는 코어 부분은 여전히 single thread로 동작하며, I/O Socket read/write를 할 때, 멀티 쓰레드로 동작하여 전반적인 성능이 향상되었습니다. https://redislabs.com/blog/diving-into-redis-6/ 

[ 더 알아보기 ⬇️ ]

 

Redis가 싱글 스레드 모델임에도 높은 성능을 보장하는 이유 (I/O Multiplexing)

틀린 내용이 있을 수 있어 피드백 해주시면 감사하겠습니다 😀Redis는 Remote Dictionary Server이며, Dictionary, Set 등과 같은 메모리 내 자료구조를 제공하는 TCP 서버이다. Redis는 캐싱, 세션 저장소, 실

velog.io

 

이 외로도, Redis는 Pub/sub 메시징을 지원해 메세지 브로커로도 사용될 수 있습니다.

 

이렇게 Redis에 대해 알아봤으니, 설치 과정을 소개하겠습니다!


Redis 설치하기

Redis 공식 가이드에 나와있는 설치 방법은 다양한데요, 대표적으로 도커를 이용하는 방식과, 시스템에 직접 설치하는 방식이 있습니다.

OS 별 공식문서

Linux: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/

Mac: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-mac-os/

Window(Ubuntu): https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-windows/

 

저의 설치 환경은 라즈베리 파이 OS로 리눅스 기반의 debian을 바탕으로 한 시스템이고, Docker를 사용해 Redis를 설치했습니다.

 

Docker 설치하기 ➡️ https://docs.docker.com/engine/install/

 

Install Docker Engine

Learn how to choose the best method for you to install Docker Engine. This client-server application is available on Linux, Mac, Windows, and as a static binary.

docs.docker.com

 

1. Redis 설정하기 (https://redis.io/docs/latest/operate/oss_and_stack/management/config-file/)

Redis는 redis.conf 파일을 만들어 redis에서 변경하고 싶은 설정들을 관리합니다. 위 링크로 들어가면 정말 다양한 설정들이 있으니, 자세한 내용은 링크를 확인해 주세요.

저의 경우, 방화벽을 열어 외부에서 접속 가능하도록 했기 때문에 bind를 0.0.0.0으로 설정했습니다.

# 어떤 네트위크 인터페이스로부터 연결할 수 있도록 할 것인지 관리 (여기에서는 Anywhere)
bind 0.0.0.0

# 사용 포트 관리
port 6379

# Master 노드의 기본 사용자(default user)의 비밀번호 설정
requirepass [사용하고자 하는 비밀번호]

# Redis 에서 사용할 수 있는 최대 메모리 용량. 지정하지 않으면 시스템 전체 용량
maxmemory 2gb

# maxmemory 에 설정된 용량을 초과했을때 삭제할 데이터 선정 방식
# - noeviction : 쓰기 동작에 대해 error 반환 (Default)
# - volatile-lru : expire 가 설정된 key 들중에서 LRU algorithm 에 의해서 선택된 key 제거
# - allkeys-lru : 모든 key 들 중 LRU algorithm에 의해서 선택된 key 제거
# - volatile-random : expire 가 설정된 key 들 중 임의의 key 제거
# - allkeys-random : 모든 key 들 중 임의의 key 제거
# - volatile-ttl : expire time(TTL)이 가장 적게 남은 key 제거 (minor TTL)
maxmemory-policy volatile-ttl

# DB 데이터를 주기적으로 파일로 백업하기 위한 설정입니다.
# Redis 가 재시작되면 이 백업을 통해 DB 를 복구합니다.

save 900 1      # 15분 안에 최소 1개 이상의 key 가 변경 되었을 때
save 300 10     # 5분 안에 최소 10개 이상의 key 가 변경 되었을 때
save 60 10000   # 60초 안에 최소 10000 개 이상의 key 가 변경 되었을 때

 

2. 해당 conf 파일로 도커 실행하기

// 도커이미지 가지고 오기
sudo docker pull redis
// conf 파일 지정해 도커 실행
sudo docker run -d --restart=always \
--name redis -p 6379:6379 -e TZ=Asia/Seoul \
-v /etc/redis.conf:/etc/redis/redis.conf \
-v redis_data:/data redis redis-server /etc/redis/redis.conf

-v [내 컴퓨터에 redis.conf가 있는 위치]:[컨테이너 안에서 redis.conf를 카피할 위치]로 이해하시면 됩니다.

 

3. redis cli로 redis 실행하기

sudo docker exec -t redis redis-cli

requiredpass를 설정한 경우, 접속 후 AUTH [내가 설정한 비밀번호]를 입력하면, "OK"라는 결과가 나오며, 이후 명령어를 실행시킬 수 있게됩니다.

 

4. (optional) 방화벽 열기

sudo ufw allow 6379/tcp
sudo ufw enable
redis-cli -h <host-ip> -p 6379

 

위 설정을 적용해 제 컴퓨터에서 라즈베리 파이에 설치된 redis에 접속할 수 있도록 구성했습니다. 🙌

 

5. 간단한 실행 테스트


마무리

이렇게 인메모리 데이터베이스의 개념부터, Redis의 특징과 간단한 설치과정을 살펴보았습니다. Redis에 대해 알아갈 수 있는 글 되길 바라며 글을 마치겠습니다. 긴 글 읽어주셔서 감사합니다!

 

좋은 하루 되세요 😊

반응형