Amazon MemoryDB for Redis 는 OpenSource 인 Redis 를 Amazon 클라우드 컴퓨팅 자원을 사용해 AWS 에서 지원하는 것으로, Redis 와 거의 모든 면에서 동일합니다.
다만 AWS Redis 를 사용할 경우, Redis 서버를 직접 구축하는 것 보다 Performance와 Durability 면에서 이점을 가지며, 설정이 편리한 장점이 있습니다.
이 글에선 Redis의 Persistence(영속성)/Durability(내구성) 측면을 중점적으로 다뤄보겠습니다.
[ Redis RDB vs AOF ]
메모리는 휘발성이므로 memory DB 인 Redis 프로세스를 종료하게 되면 데이터가 모두 유실됩니다.
따라서 단순 캐시용도가 아닌 Persistence 한 DB로 활용하기 위해서는 데이터를 Disk 에 저장하여 데이터 유실이 발생하지 않도록 해야합니다.
이를 위해 Redis 엔 RDB(snapshot) 와 AOF(Append Only File) 기능이 존재합니다.
1. RDB
- RDB 는 memory snapshot 파일의 확장자인 .rdb 를 의미
- 특정 시점/간격 마다 메모리의 전체 데이터를 디스크에 바이너리 파일로 저장(snapshot)하는 방식
- 특정 시점마다 백업을 받을 때 사용
- AOF 파일보다 사이즈가 작다는 특징이 있고 사이즈가 작으므로 로딩 속도도 AOF 보다 빠른 장점이 있습니다.
- RDB 관련주요 redis.conf 파라미터
dbfilename $rdbTargetFileName | RDB 파일명 지정 |
save $duration $cnt | 특정시간(duration)동안 특정횟수(cnt) 이상 key 변경이 발생하면 저장 (eg: save 300 10 : 300초 동안 10번 이상 key 변경 발생시 저장) |
stop-writes-on-bgsave-error $yesOrNo | RDB 파일을 디스크에 저장하다 실패하면 save 이벤트를 거부할지에 대한 파라미터(yes 일 경우 RDB 저장 실패시 쓰기 요청 거부) |
rdbcompression $yesOrNo | RDB 파일을 쓸 때 압축 여부 |
- RDB 방식의 문제점
Redis 장애 발생시 .rdb 백업 시점 이후에 발생한 데이터는 유실됨
# .rdb 데이터 유실 예시
> SET key val
> SET key1 val1
> SAVE
> SET key val2 #SAVE 이후로 데이터 유실
> SET key1 val3 #SAVE 이후로 데이터 유실
2. AOF
- Append Only File 이라는 의미에서 알 수 있듯이 .aof 파일에 모든 쓰기 명령을 기록 (조회는 제외)
- redis client 가 redis 에 쓰기 명령을 요청하면 Redis 는 해당 명령을 .aof 파일(디스크)에 저장한 후, 해당 명령을 수행하는 방식으로 RDB 방식과 달리 특정 시점이 아닌 항상 현재 시점까지의 로그를 기록
- CUD 를 계속 append 하며 기록하게 되므로 파일 크기가 계속 커지게 되는데, Rewrite 를 하게 되면 최종 데이터만 기록되어 파일 크기가 작아진다
# 기존 appendonly.aof 파일 예시
SET key value
SET key value2
SET key value3
SET key value4
# AOF REWRITE 실행 후 appendonly.aof 파일
SET key value4 # 최종 데이터인 key value4 만 남게된다
- AOF 관련 주요 redis.conf 파라미터
appendfilename $aofTargetFileName | AOF 파일명 지정 |
appendfsync $everysec | AOF 기록되는 시점 지정
|
auto-aof-rewrite-min-size $size | AOF 파일 사이즈가 64mb 이하면 rewrite 를 하지 않음(rewrite 를 자주 하는 것을 방지) |
auto-aof-rewrite-percentage $percentage | AOF 파일 사이즈가 rewrite 되는 파일 사이즈 기준으로, redis 서버가 시작할 시점의 AOF 파일 사이즈를 기준으로 함 (만약 redis 서버 시작시 AOF 파일 사이즈가 0 이라면 rewrite를 하지 않음) |
- AOF 를 사용한 복구 예시
.aof 파일에서 문제가 되는 명령어를 수정/제거한 후 redis 서버를 재시작하면 데이터 손실없이 DB를 살릴 수 있다
# .aof 를 사용한 복구 예시
*1
$8
flushall #문제가 되는 해당 명령어 삭제 후 저장
- AOF 방식의 문제점
모든 쓰기 기록이 남아있는 파일이므로 RDB 방식에 비해 백업 데이터 크기가 크고, 모든 라인이 한 줄 씩 재수행 되므로 서버자원을 많이 사용
[ RDB vs AOF 무엇을 써야하는가? ]
특정 시점을 기준으로 메모리 DB의 데이터를 백업하는 snapshot 방식의 RDB 방식과
조회 명령을 제외한 모든 쓰기 명령을 기록하는 AOF 방식은
각각의 장단점이 명확하므로 AOF 를 default로 사용하고 RDB 를 optional로 사용하는 방식으로 둘을 조합하여 사용합니다.
→ 서버가 실행될 때 백업된 .rdb 를 reload 하여 복구하고, snapshot 시점과 shutdown 사이의 데이터만 AOF 로그로 복구하여 서버 재기동 시간과 서버자원을 절약
그렇다면 RDB 와 AOF 방식을 통해 memory DB 인 Redis 를 Persistence 하게 사용 할 수 있을까요?
모든 쓰기 명령을 로그로 기록하는 AOF 방식도 아래와 같은 데이터 손실 가능성이 있다고 합니다.
아래는 AWS memoryDB 관련 가이드 발췌 글입니다. (출처: https://aws.amazon.com/ko/memorydb/faqs/)
How is MemoryDB’s durability functionality different from open source Redis’ append-only file (AOF)?
MemoryDB leverages a distributed transactional log to durably store data. By storing data across multiple AZs, MemoryDB has fast database recovery and restart. Also, MemoryDB offers eventual consistency for replica nodes and consistent reads on primary nodes.
Open source Redis includes an optional append-only file (AOF) feature, which persists data in a file on a primary node’s disk for durability. However, because AOF stores data locally on primary nodes in a single availability zone, there are risks for data loss. Also, in the event of a node failure, there are risks of consistency issues with replicas.
How does MemoryDB durably store my data?
MemoryDB stores your entire data set in memory and uses a distributed Multi-AZ transactional log to provide data durability, consistency, and recoverability. By storing data across multiple AZs, MemoryDB has fast database recovery and restart. By also storing the data in-memory, MemoryDB can deliver ultra-fast performance and high throughput.
위 글에서 알 수 있듯이 Redis AOF는 .aof 파일을 마스터 노드 디스크(싱글 AZ라 할 수 있는)에만 저장하여 데이터 loss risk가 있으며 노드 장애시 슬레이브 노드와 데이터 일관성 문제가 있을 수 있다고 합니다.
AWS memoryDB for Redis 는 모든 메모리 데이터를 분산된 multi AZ 에 transaction log 로 기록하여 durability 와 마스터 노드 ↔ 슬레이브 노드간의 데이터 일관성을 보장한다고 합니다.
아래는 Redis 와 AWS MemoryDB for Redis 의 차이를 정리한 차트입니다.
내구성(Durability) | AOF, RDB 로 내구성 처리 | Transaction log 까지 작성 후 응답하여 데이터 무손실 가능 |
성능 | 12만/sec | read : 마이크로초 write : ms (한자리 milisecond) |
Cluster mode | Cluster mode 선택적 운영 | Cluster mode 활성화 필수 |
접속 | redis-cli 사용하여 접속 | |
백업 | 특정 시점 RDB 백업 AOF 로 모든 CUD DML 저장 |
24시간 동안 20개 까지 스냅샷 생성 제한 해당 Region 에서 수동 스냅샷 보유 개수 제한 없음 |
복구 | RDB 시점 복원 AOF 사용시 원하는 명령까지 복원 |
RDB 스냅샷 복원 특점시점 복원은 불가 Transaction log 사용하여 장애 최종 복구 가능 |
고가용성(HA) | replica shard 구성 |
replica node 의 복제가 실패할 경우
|
복제 | replica 구성
|
transaction lop 를 사용하는 async 복제 transaction log 에 저장(영구저장) 하므로 데이터 손실 위험 없음 |
참고 :
https://redis.io/docs/management/persistence/
https://docs.aws.amazon.com/memorydb/latest/devguide/what-is-memorydb-for-redis.html
https://aws.amazon.com/ko/memorydb/faqs/
https://hyunki1019.tistory.com/169
https://rmcodestar.github.io/redis/2018/12/10/redis-persistence/
'infra & cloud > AWS' 카테고리의 다른 글
[AWS] EC2 ssh 접속 및 bastion rsa 설정 (0) | 2022.12.01 |
---|---|
[AWS] VPC 구성 (0) | 2022.12.01 |
[SSH] RSA 공유키 충돌 문제 (0) | 2022.12.01 |
[AWS] SSO : Single Sign-On (0) | 2022.05.26 |
[AWS] 20-4. Resource Access Manager (0) | 2022.05.26 |