실무에서 Redis관련된 업무를 다수 진행하면서 상세하게는 아니어도 간단하게나마 정리해 보고자 글을 작성하게 되었다. 전반적인 Redis의 특징을 정리한 글이다.
개요
우선 Redis(Remote Dictionary Server)는 Key-value구조로 데이터를 저장하고 있는 NoSQL DBMS이다.
또한 기존 관계형 데이터 베이스(RDBMS)와 같이 하드디스크에 데이터를 저장하는 것이 아닌 메모리(램)기반 DBMS로 in-memory DB이다. 해당 말만 듣고 이해하기 어려울 것 같아 아래에 더 자세히 설명하였다.
NoSQL DB의 특징으로 RDB와는 다르게 스키마가 없거나 느슨하게 정의되어 있어 데이터 구조가 유연하고 변경이 가능하고, String, List, Set, Hash, Sorted Set, Bitmap, HyperLogLog등의 다양한 데이터 구조를 지원한다.
in-memory DB의 특징으로 빠른 데이터 처리를 통해 대용량 데이터와 실시간 트랜잭션의 고성능처리가 가능하다. 그러나 메모리 기반임으로 메모리가 다운되면 데이터가 증발하는 휘발성이 존재한다. 물론 이를 보완하기 위해 AOF(Append-Only File)와 RDB(Redis Database) 스냅샷 옵션이 존재한다. 해당 옵션들은 아래에서 상세히 다루도록 하겠다.
또한, Redis는 단일 스레드로 동작하여 멀티스레드 환경에서 발생할 수 있는 동기화 문제(경쟁 조건, 데드락, 라이브락 등등)들을 방지하여, 높은 성능과 일관성을 유지할 수 있다.
Redis의 배포 모드 (Deployment Modes)
Redis의 배포모드는 크게 3가지가 있다.
- Stand alone
- Sentinel
- Cluster
1. Stand alone 모드
단일 Redis 인스턴스가 동작하는 가장 기본적인 모드이다. 아래와 같은 특징을 가진다.
특징:
- 단순성: 설정과 운영이 간단하다.
- 제한적인 확장성: 단일 인스턴스만 존재하기 때문에 확장성이 제한적이다.
- 고가용성 미지원: 인스턴스에 장애가 발생하면 서비스가 중단될 수 있다. 즉, HA(High availibilty) 즉, 고가용성을 지원하지 않는다.
2. Sentinel 모드
고가용성과 자동 장애 복구를 제공하는 모드이다. Sentinel노드, Master노드, Replica노드(Slave노드)로 구성되어있으며, Sentinel노드가 Redis 인스턴스들을 모니터링하고, 장애가 발생했을 때 자동으로 Master-Replica 전환을 수행하는 모드이다.
특징:
- 고가용성: 마스터 장애 시 자동으로 슬레이브를 마스터로 승격하여 서비스 지속성을 보장한다.
- 자동 장애 복구: Sentinel이 장애를 감지하고 복구 절차를 자동으로 수행한다.
각 노드별 설명
- 마스터 노드 (Master Node):
- 역할: 읽기 및 쓰기 요청을 처리하는 주 인스턴스다. 데이터를 저장되고, 레플리카 노드로 복제된다.
- 특징: 장애가 발생하면 Sentinel에 의해 새로운 마스터 노드로 교체되며, 센티널 구성에서는 1개만 존재할 수 있다.
- 레플리카 노드 (Replica Node):
- 역할: 마스터 노드의 데이터를 복제하여 저장한다. 주로 읽기 전용으로 사용되며, 마스터 장애 시 새로운 마스터로 승격될 수 있다.
- 특징: 1개만 존재할 수 있는 마스터 노드와는 다르게 다수의 레플리카 노드를 두어 읽기 성능을 확장할 수 있다. Slave노드라고도 부른다. 찾아보니 Redis 5.0문서부터 slave노드라는 명칭에서 replica노드라고 명칭 한다. 개인적으로 레플리카노드가 명확하게 이해가 되는 것 같다.
- 센티널 노드 (Sentinel Node):
- 역할: Redis 인스턴스(마스터 및 레플리카)를 모니터링하고, 장애가 발생하면 자동으로 장애 복구(failover)를 수행한다. 또한, 클라이언트에게 현재의 마스터 노드 정보를 제공한다.
- 특징: 여러 Sentinel 노드가 협력하여 고가용성을 보장하고, 최소 3개 이상의 Sentinel 노드를 운영하고, 확장시 홀수로 구성해야 한다.
3. Cluster 모드
데이터 샤딩을 통해 수평 확장을 지원하는 모드다. 여러 노드에 데이터를 분산 저장하여 대규모 데이터와 높은 처리량을 효율적으로 관리할 수 있다.
특징:
- 수평 확장성: 데이터를 여러 노드에 분산 저장하여 확장성을 높인다.
- 고가용성: 각 데이터 샤드는 복제본을 가지며, 노드 장애 시 자동으로 복구할 수 있다.
- 복잡성 증가: 클러스터 설정과 관리가 복잡하며, 클라이언트도 클러스터를 인식하고 접근해야 한다.
각 노드별 설명
- 마스터 노드 (Master Node):
- 역할: 데이터를 저장하고 클라이언트의 읽기 및 쓰기 요청을 처리하는 주 인스턴스다. 각 마스터 노드는 데이터를 16384개의 슬롯으로 분할하고 각각의 마스터 노드가 특정 슬롯 범위를 담당한다.
- 특징: 클러스터 내의 마스터 노드는 데이터의 일차적인 저장소 역할을 하며, 장애 발생 시 대응하는 레플리카 노드가 마스터로 승격될 수 있고, 클러스터 모드에서는 센터널 모드와는 다르게 여러 마스터 노드가 존재하며, 각 마스터 노드는 서로 다른 슬롯 범위를 담당한다.
- 레플리카 노드 (Replica Node):
- 역할: 마스터 노드의 데이터를 복제하여 저장한다. 주로 읽기 전용으로 사용되며, 마스터 장애 시 새로운 마스터로 승격될 수 있다.
- 특징: 마스터 노드와 1:1 또는 1:N으로 연결되어 있으며, 장애 복구 및 읽기 성능 향상을 위한 백업 역할을 한다. 레플리카 노드는 마스터 노드의 데이터를 지속적으로 복제하여 데이터의 일관성을 유지한다.
Redis의 영속성 옵션
Redis는 메모리(램)에 데이터를 저장하기 때문에 빠른 속도를 특징으로 가지지만 메모리가 다운되면 데이터 소실이 발생하게 된다. 이로 인해 데이터 손실을 최소화하고 장애 발생 시 데이터 복구를 지원하는 옵션이 존재한다.
1. AOF (Append-Only File)
AOF는 Redis의 데이터 영속성 옵션 중 하나로, 모든 쓰기 명령을 로그 파일에 기록한다. 이를 통해 Redis 서버가 재시작되거나 장애가 발생했을 때, 해당 로그를 사용하여 장애를 복구하게 된다.
주요 특징
- 데이터 손실 최소화: 명령어 로그를 통해 뒤에 설명할 RDB에 비해 데이터 손실을 최소화할 수 있다.
- 파일 크기: 시간이 지남에 따라 AOF 파일의 크기가 커져 디스크 공간과 I/O 성능에 영향을 미칠 수 있다.
- 성능 저하: 모든 쓰기 명령을 로그에 기록하기 때문에 적절한 옵션으로 설정하지 않으면 성능에 영향을 줄 수 있다.
appendonly yes 옵션으로 AOF를 활성화할 수 있으며, appendfsync 설정을 통해 로그 기록 빈도를 조정할 수 있다.
- appendfsync always: 매 명령어마다 AOF 파일을 디스크에 기록.
- appendfsync everysec: 매 초마다 AOF 파일을 디스크에 기록. (보통 해당 옵션 사용)
- appendfsync no: 운영 체제에 따라 디스크 기록을 관리.
2. RDB (Redis Database Backup)
RDB는 Redis의 데이터 영속성 옵션 중 하나로, Redis 데이터베이스의 스냅샷을 특정한 시점에 주기적으로 디스크에 저장한다. 이 스냅샷 파일을 통해 Redis 서버가 재시작되거나 장애가 발생했을 때 데이터를 복구할 수 있다.
주요 특징
- 스냅샷 생성: 일정 시간 간격으로 Redis 데이터베이스의 현재 상태를 스냅샷 파일로 저장한다.
- 빠른 복구: 쓰기 성능에 대한 영향을 최소화하면서 스냅샷 파일을 통해 빠르게 데이터베이스를 복구할 수 있다.
- 데이터 손실: 마지막 스냅샷 이후의 데이터 변경 사항은 잃어버릴 수 있다. 즉, 스냅샷 주기 사이에 발생한 데이터는 복구되지 않을 수 있다.
save 지시어를 통해 스냅샷 생성 주기를 설정할 수 있다. 아래와 같이 정의하여 사용할 수 있다.
- save 900 1 (900초(15분) 동안 1개의 변경이 발생하면 스냅샷 생성).
- save 60 1000 (60초 동안 1000개의 변경이 발생하면 스냅샷 생성).
일반적으로 AOF와 RDB를 동시에 사용하여, 특정 시점에 스냅샷을 기록(RDB)하고 이후 시간의 쓰기 명령어를 로그로 저장(AOF)을 하는 방식으로 두 가지 방식의 장점을 결합하여 사용한다.
마무리
해당 게시글을 통해 Redis가 무엇인지 대략적으로 이해하길 바란다. Redis에서 사용가능한 여러 가지 자료구조에 대한 설명과 사용 사례에 대해서도 자세히 다뤄볼까 했으나, 내용이 너무 무거워지는 것 같아 분리해서 작성할 계획이다.
처음 Redis에 대해서 공부했을 당시에는 모르는 단어와 이해가 잘 되지 않는 설명들이 많아서 최대한 이해하기 쉽게 작성하였는데 도움이 되었으면 좋겠다. 이후 게시글에는 Redis의 자료구조 및 명령어, Redis를 Sentinel 모드와 Cluster모드로 설치하는 방법등에 대해서 작성할 계획이다.
잘못된 설명이나, 보완할 점이 있다면 선배님들의 조언 부탁드립니다.
'기타 IT > DB' 카테고리의 다른 글
[ ORACLE/SQL ] ORDER BY 사용법 정리 우선순위 부여하여 조회하기 (1) | 2023.06.11 |
---|---|
h2 DB 이전 버전 다운로드 방법 1.4.200버전 (0) | 2022.01.11 |
PL/SQL Developer 쿼리 실행 중단 (Break) 사용방법 (0) | 2021.12.21 |
PL/SQL Developer에서 조회 된 데이터 수정하는 방법 + Commit, Rollback버튼 (0) | 2021.12.21 |
PL/SQL Developer (AutoReplace) 자동완성 설정법 (0) | 2021.12.21 |