참고
Redis 데이터의 영속성(백업)
NOTE
Redis는 In-Memory DB이지만 메모리 데이터를 disk에 저장할 수 있는 특징이 있다!
RDB → 특정주기마다 데이터를 디스크에 저장
AOF → 명령 실행마다 데이터를 기록한다.
RDB(snapshotting) 방식
NOTE
특정 주기마다 메모리에 있는 데이터를 바이너리 파일로 저장한다!
일정주기마다 .rdb 파일이 만들어준다.
장점
•
작은 파일 사이즈로 백업 파일 관리가 용이하다.
•
fork를 이용해 백업하므로 서비스 중인 프로세스는 성능에 영향이 없다.
•
데이터 스냅샷 방식이므로 빠른 복구가 가능하다.
단점
•
스냅샷을 저장하는 시점 사이의 데이터 변경사항은 유실될 수 있다.
•
fork를 사용하기 때문에 시간이 오래 걸릴 수 있다.
•
데이터 무결성/정합성 요구가 크지 않은 경우에 사용한다!
RDB 설정과 관련된건 conf파일에 설정하면 된다.
Aof(Append Only File) 방식
NOTE
redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태이다!
실시간으로 계속해서 저장한다.
장점
•
모든 변경사항이 기록되므로 RDB 방식 대비 안정적으로 백업이 가능하다.
•
Append-ony 방식이라 손상될 위험이 적다.
단점
•
RDB 방식보다 파일 사이즈가 커진다.
•
RDB 방식 대비 백업&복구 속도가 느리다 (성능은 fsync 정책에 따라 조절가능)
fsync
•
파일의 내부 상태를 장치와 동기화시키는 함수(버퍼에 있는 데이터를 파일로 옮긴다.)
◦
always
▪
새로운 커맨드가 추가될 떄마다 수행(가장 안전하지만 느리다)
◦
everysec
▪
1초마다 수행, 성능은 RDB수준에 근접
◦
no
▪
OS에게 맞긴다. (가장 빠르지만 덜 안전하다)
Redis의 장애 복구
Redis replication(복제)
NOTE
데이터베이스 복제를 통해 가용성을 확보하고 빠른 장애조치를 취하는 방식!
master가 죽었을 경우 replica중 하나를 master로 전환해 서비스 정상화 가능!
또한 read-only 노드로도 사용해서 traffic 분산도 됨
version: "3"
services:
my-redis-a:
hostname: redis-master
container_name: redis-master
image: "bitnami/redis"
environment:
- REDIS_REPLICATION_MODE=master
- ALLOW_EMPTY_PASSWORD=yes
ports:
- 5000:6379
my-redis-b:
hostname: redis-replicas-1
container_name: redis-replicas-1
image: "bitnami/redis"
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis-master
- ALLOW_EMPTY_PASSWORD=yes
ports:
- 5001:6379
depends_on:
- my-redis-a
YAML
복사
docker-compose를 활용한 redis 복제생성
redis 2.6부터는 슬레이브에 자동으로 Read-Only 설정이 먹힌다.
Redis Sentinel
NOTE
Redis Sentinel ⇒ Redis Replication에서 마스터노드가 비정상적으로 종료되었을 때 자동으로 슬레이브 중 하나를 마스터로 승격시켜주는 역할(Failover)를 한다!
Master-Replica를 감시하면서 동작한다.
⇒ sentinel이 3개 이상인 이유는 과반수가 동의(Quorum)해야 승격이 이루어지도록 할 수 있도록 하기 위함
redis-sentinel-1:
container_name: sentinel1
image: 'bitnami/redis-sentinel:latest'
environment:
- REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
- REDIS_MASTER_HOST=redis-master
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_SET=mymaster
- REDIS_SENTINEL_QUORUM=2
ports:
- 26379:26379
depends_on:
- my-redis-a
- my-redis-b
redis-sentinel-2:
container_name: sentinel2
image: 'bitnami/redis-sentinel:latest'
environment:
- REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
- REDIS_MASTER_HOST=redis-master
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_SET=mymaster
- REDIS_SENTINEL_QUORUM=2
ports:
- 26380:26379
depends_on:
- my-redis-a
- my-redis-b
redis-sentinel-3:
container_name: sentinel3
image: 'bitnami/redis-sentinel:latest'
environment:
- REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
- REDIS_MASTER_HOST=redis-master
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_SET=mymaster
- REDIS_SENTINEL_QUORUM=2
ports:
- 26381:26379
depends_on:
- my-redis-a
- my-redis-b
YAML
복사
redis-sentinel 설정하는 docker-compose
•
REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS
◦
센티넬이 마스터노드의 장애여부를 판단하는 시간
•
READ_SENTINEL_QUORUM
◦
master의 장애를 동의하는 센티넬의 개수