-
[Redis] 레디스의 개념 및 특성 (1)SQL 2023. 1. 31. 16:39
(한국어 버전으로 제공되는 redisgate.kr 참고)
redis 란?
: 데이터를 메모리에 저장하는 캐시 시스템 (인메모리 데이터베이스) - 빠름
: 자료구조 지원 (key - value 타입의 저장소)
: 장애 방지를 위한 영속성 지원
: 읽기 성능 증대를 위한 서버 측 복제 지원
: 쓰기 성능 증대를 위한 클라이언트 측 샤딩 지원
: 다양한 데이터형 지원 (문자열, 리스트, 해시, 셋, 스트림 등)
고성능 key-value 방식의 데이터 저장소로서
다양한 형식의 데이터를 지원하는 NoSQL
Redis 의 영속성
: 지속성을 보장하기 위하여 데이터를 disk 에 저장할 수 있음. 서버가 다운 되더라도 저장된 데이터를 읽어 메모리에 로딩하는 방식
- RDB (redis database backup)
- 특정 시점마다 레디스 데이터 전체를 disk 에 저장 (snapshot 방식)
- 서버가 다운 되면 rdb 파일을 통해 당시 snapshot 을 레디스에 적용
- RDB 설정 : save (저장 주기), dbfilename (dump 파일명)
- 매 순간 dump 하는 것이 아니기에 데이터 유실 가능성 有
- AOF (append on file)
- 레디스 의 모든 write/ update 연산을 로그 파일(aof파일)에 기록
- 서버가 다운 되면 AOF 파일의 명령어로 장애 복구
- AOF Rewrite 기능 지원
- 명령어를 계속 저장하면 파일 크기가 무한대로 커짐
- rewrite 기능을 통해 데이터를 다시 쓰고 최종 상태 저장
- AOF 파일은 텍스트 파일이므로 명령어 조작하여 레디스 변경이 가능
- ex) 실수로 FlushAll 명령어 실행 후 AOF 파일에서 해당 명령어 지우면 복구가 가능하다
- RDB 처럼 데이터가 유실될 일은 없으나 지금까지 수행한 write/update 작업을 다시 수행해야 함
센티넬 (sentinel)
일반적으로 레디스는 운영환경에서 마스터, 복제로 구성 (master, slave)
if 마스터 장애 상황 → 관리자가 감지 후 복제를 마스터로 승격시키고 클라이언트들이 새로운 마스터에 접속하도록 조치 필요
센티넬은 이 과정을 관리자의 개입없이 도와줌 (마스터와 복제를 감시하다가 마스터가 다운되면 감지 후 자동으로 복제를 마스터로 승격 시켜줌)
- 센티넬 기능
- Monitoring : 지속적으로 마스터와, 복제를 모니터링
- Automatic Failover (자동 장애조치) : 마스터에 문제가 생겼을 때 복제를 마스터로 승격시켜 복구. 복제가 여러대일 경우 이 복제들이 새로운 마스터로부터 데이터를 받을 수 있도록 재구성하고 마스터가 restart 되면 복제로 전환되어 새로운 마스터를 바라보게 함
- Notification : 레디스 인스턴스가 failover 되었을 때 pub/sub 으로 client (application) 에게 알리거나 관리자에게 email/sms 전송
- 센티넬 구성 설정 : sentinel.conf
- 포트 default : 26379
실습 참고 http://redisgate.kr/redis/sentinel/sentinel.php
Cluster (클러스터)
- 목표 : 1000대의 노드까지 확장 가능하도록 설계됨
- 노드 추가,삭제 시 운영 중단 필요 없이, hash slot 을 다른 노드로 이동 가능
- 마스터, 복제(슬레이브)가 각 1:N 관계로 클러스터 구성 (마스터는 3대 이상 필요)
- 키를 hash function (CRC16 function) 을 적용해 노드별로 슬럿 정보를 나눔 (레디스 클러스터는 16384개의 슬롯 사용)

각 노드에 슬롯 정보를 나눠서 할당 ex) 마스터가 3개 일 때 0~5460, 5461~10922, 10923~16383 슬롯 가짐
- 레디스 서버는 마스터 혹은 슬레이브(복제), 한 마스터가 다운 시 다른 마스터들이 failover (장애조치) 진행하므로 레디스 클러스터에서는 별도의 센티널이 필요하지 않음
'SQL' 카테고리의 다른 글
[Mysql] Database LOCK (0) 2023.01.03 [Postgres] 계층형 쿼리 구현 예시 (0) 2021.05.24 [SQL] case when WHERE 절에 적용 예시(if/else) (0) 2021.04.06