Search
Duplicate
📒

[고성능 서비스를 위한 Redis] 07. Redis의 백업(RDB, AOF)과 복구

상태
완료
수업
고성능 서비스를 위한 Redis
주제
Redis
4 more properties
참고

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 SentinelRedis 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의 장애를 동의하는 센티넬의 개수