redis / ioredis 패키지 비교

Redis (Remote Dictionary Server)

데이터 구조 서버로 잘 알려진 오픈 소스 인메모리(in-memory) 데이터 저장소. 매우 빠르고 유연한 성능 덕분에 주로 캐시, 메시지 브로커, 세션 저장소, 그리고 실시간 데이터 처리를 위해 사용된다.

 

특징

더보기

 

  • 인메모리 데이터 저장소

데이터를 메모리에 저장하므로 읽기와 쓰기 속도가 매우 빠르다.

디스크 기반 데이터베이스보다 짧은 응답 시간이 필요할 때 적합하다.

  • 데이터 구조

단순한 키-값 저장소 이상으로 다양한 데이터 구조를 지원한다:

  • 지속성 옵션

기본적으로 데이터를 메모리에 저장하지만, 디스크에 데이터를 저장하여 지속성을 유지할 수도 있다.

RDB (Redis Database): 주기적으로 스냅샷 저장. AOF (Append-Only File): 모든 쓰기 작업을 기록.

  • 분산 및 확장성

클러스터링을 지원하며, 데이터 분산 저장 및 확장을 쉽게 구현할 수 있다.

Redis Sentinel로 고가용성을 보장하며 장애 복구를 자동화할 수 있다.

  • Lua 스크립트

Lua 스크립트를 실행하여 여러 명령어를 원자적으로 처리 가능하다.

  • Pub/Sub 모델

메시지 브로커 역할을 수행하며, 클라이언트 간의 비동기 메시징 시스템 구현 가능.

 

 

용도

더보기
  • 캐싱

자주 조회되는 데이터를 저장하여 데이터베이스 또는 API 호출을 줄이고 성능을 향상시킨다.

ex. 웹사이트 세션 데이터, 검색 결과 캐싱.

  • 세션 관리

로그인 상태나 사용자 세션 데이터를 저장하는 데 사용. PHP, Python, Node.js 등 여러 언어와 쉽게 통합 가능하다.

  • 메시지 브로커

Pub/Sub 시스템을 통해 클라이언트 간 실시간 메시지 교환 가능. 채팅 애플리케이션, 알림 시스템 등에 사용된다.

  • 실시간 데이터 처리

실시간 분석, 순위표(leaderboard) 계산 등에서 사용. ex. 게임 순위 시스템.

  • 큐 시스템

Redis의 리스트 구조를 활용해 작업 큐나 처리 순서를 관리한다.

  • 분산 락

SET 명령어를 활용하여 락(lock) 메커니즘을 구현해 동시성 문제를 해결한다.

 

 

장점

 

  • 속도: 모든 데이터를 메모리에 저장하므로 초당 수십만 개의 요청을 처리할 수 있다.
  • 다양한 데이터 구조: 복잡한 데이터 처리가 간단.
  • 간단한 설정: 설치와 구성이 매우 쉽다.
  • 오픈 소스: 무료로 사용 가능하며, 커뮤니티와 생태계가 활발.

 

단점

 

  • 메모리 의존: 모든 데이터를 메모리에 저장하므로 데이터 크기가 커질수록 메모리 사용량도 증가.
  • 복잡한 쿼리 처리 불가: SQL처럼 복잡한 쿼리를 지원하지 않으므로 특정한 데이터베이스 역할에 한정된다.
  • 고급 지속성 요구: 지속성이 기본 설정이 아니므로 추가 설정이 필요.

 

redis / ioredis

사용 패키지 redis - createClient ioredis - new Redis
API 스타일 Promise 기반 Event 기반
사용 시점 주로 단순한 Redis 사용 고급 Redis 기능이 필요한 경우
자동 연결 명시적 connect() 호출 필요 생성 시 자동 연결
구현 난이도 간단 설정이 더 세밀하고 복잡할 수 있음
고급 기능 지원 제한적 (기본 Redis 기능만 지원) 클러스터, Sentinel, Pub/Sub 지원

 

 

  • redis: 간단한 캐싱, 세션 저장소, 기본 키-값 저장소 작업을 할 때 적합.
  • ioredis: 클러스터 모드, Sentinel, Pub/Sub 등 고급 Redis 기능을 사용하거나 대규모 시스템에서 고성능을 요구할 때 적합.

 

클러스터 모드 (Redis Cluster)

Redis 서버를 분산 환경에서 사용하기 위한 방식. 데이터를 여러 Redis 노드로 분산하여 저장하고, 높은 가용성과 확장성을 제공한다.

 

특징

더보기
  1. 데이터 분산
    • 데이터를 여러 노드에 자동으로 분산 저장한다.
    • 키의 해시 슬롯(hash slot)을 계산하여 특정 노드에 데이터를 저장.
    • Redis 클러스터는 16384개의 해시 슬롯을 제공하며, 각 노드는 일부 슬롯을 담당한다.
    • 예를 들어, 키가 "key1"이라면 해시 값을 계산하고, 이 값이 특정 노드의 해시 슬롯에 매핑된다.
  2. 확장성
    • 클러스터에 노드를 추가하거나 제거하면 자동으로 슬롯을 재배치하여 데이터 분산을 조정한다.
    • 대규모 데이터를 처리하거나 요청량이 증가해도, 노드를 추가해 시스템 성능을 확장할 수 있다.
  3. 고가용성
    • 클러스터 모드는 기본적으로 노드 간의 복제(replication)를 지원한다.
    • 각 노드에는 마스터(master)와 이를 백업하는 슬레이브(slave)가 존재.
    • 마스터 노드가 장애를 일으키면, 슬레이브 노드가 자동으로 승격(promote)되어 장애 복구를 진행한다.

 

 

Sentinel (Redis Sentinel)

Redis의 고가용성(High Availability)을 지원하는 기능으로, 여러 Redis 인스턴스(노드)를 모니터링하고 장애 복구를 자동으로 처리한다.

 

특징

더보기
  • 모니터링 (Monitoring)

Sentinel은 마스터 및 슬레이브 노드를 지속적으로 감시하며, 마스터 노드가 장애 상태로 판별되면, 장애 복구 프로세스를 시작한다.

  • 장애 복구 (Failover)

장애가 발생한 마스터 노드 대신, 슬레이브 노드 중 하나를 마스터로 승격(promote)시키고 클라이언트가 새로운 마스터 노드를 자동으로 감지하고 연결하도록 돕는다.

  • 구성 관리 (Configuration Management)

클라이언트와 Redis 노드 간의 연결 정보를 동적으로 관리한다. 클라이언트는 Sentinel에게 연결 요청을 보내고, Sentinel이 최신 마스터 노드 정보를 제공한다.

  • 확장성

다중 Sentinel 구성을 지원하여, 여러 Sentinel 인스턴스 간에 협력하여 고가용성을 보장하는데, 다수결(Quorum) 기반으로 장애를 판단하여, 잘못된 장애 판별을 방지한다.

 

ioredis

 

Redis의 샤딩(Sharding) 기능이나 데이터 분산을 효과적으로 구현하려면 ioredis를 사용하는 것이 적합하다고 판단했다.

 

샤딩

더보기

샤딩: 데이터를 여러 서버(또는 노드)로 분산 저장하는 방식. Redis에서는 클러스터 모드가 기본적으로 샤딩을 지원한다.

 

  1. Redis 클러스터는 16384개의 해시 슬롯을 제공.
  2. 키에 대해 해시 계산을 수행하여, 해당 키가 어떤 슬롯에 속하는지 결정.
  3. 각 슬롯은 클러스터의 특정 노드에 매핑.
    • ex. 키 "user:123" → 슬롯 12345 → 노드 Node A
  4. 데이터가 여러 노드에 분산 저장되므로, 단일 노드의 메모리 제한을 극복할 수 있다.

 

클러스터 모드 예시

const Redis = require('ioredis');

// 클러스터 노드 정보 설정
const cluster = new Redis.Cluster([
  { host: '127.0.0.1', port: 6379 },
  { host: '127.0.0.1', port: 6380 },
  { host: '127.0.0.1', port: 6381 },
]);

cluster.on('connect', () => {
  console.log('Connected to Redis Cluster!');
});

cluster.on('error', (err) => {
  console.error('Redis Cluster Error:', err);
});

// 데이터 설정 및 가져오기
(async () => {
  await cluster.set('user:123', 'Test');
  const value = await cluster.get('user:123');
  console.log('Value:', value);
})();

 

 

오늘은 어떻게 하면 샤딩을 적용해서 db를 분산시킬 수 있을 지 살펴보는 시간을 가졌다. 이 코드를 적용시킬 때 쯤, 다시 이 포스트를 이어가도록 하겠다!

 

 

 

 

 

'Side Projects' 카테고리의 다른 글

Bull Queue?  (0) 2024.12.03
redis cluster 사용해보기  (1) 2024.11.27
TCP Multi-Player - 트러블 슈팅  (0) 2024.11.05
ORM / Low-Level Query  (0) 2024.10.29
Protocol Buffers?  (4) 2024.10.24