Redis
Redis RDB
김 정출
2024. 10. 12. 14:41
Redis RDB
- RDB (Redis Database Backup)는 Redis의 데이터 저장 및 복구 방식 중 하나로, 주기적으로 Redis 메모리의 데이터를 스냅샷 형태로 디스크에 저장하는 방식입니다.
- RDB는 Redis를 사용하는 많은 환경에서 데이터의 영구성을 확보하는 중요한 역할을 합니다.
RDB 방식의 동작 원리
- 스냅샷 생성:
- Redis는 설정된 주기(예: 1분, 5분 등)에 따라 현재 메모리의 전체 데이터를 스냅샷으로 만들어 파일에 저장합니다.
- 이 스냅샷은 바이너리 형식의
.rdb
파일로 디스크에 저장됩니다. 기본적으로 이 파일은 Redis 서버가 실행되는 디렉터리에 생성됩니다.
- 스냅샷 트리거:
- RDB 파일을 생성하는 트리거는 여러 가지가 있습니다:
- 주기적 저장: 설정 파일에서 설정된 간격(예:
save 900 1
, 900초마다 데이터가 변경된 경우 저장)마다 스냅샷을 저장합니다. - 수동 저장: 클라이언트에서
SAVE
또는BGSAVE
명령을 통해 수동으로 스냅샷을 생성할 수 있습니다.SAVE
: 메인 프로세스에서 스냅샷을 동기적으로 생성합니다. 이 명령은 Redis가 다른 요청을 처리할 수 없게 만들기 때문에 비추천됩니다.BGSAVE
: 백그라운드에서 스냅샷을 생성합니다. 이 명령을 사용하면 Redis가 다른 클라이언트 요청을 동시에 처리할 수 있습니다.
- 주기적 저장: 설정 파일에서 설정된 간격(예:
- RDB 파일을 생성하는 트리거는 여러 가지가 있습니다:
- 복구 과정:
- Redis가 재시작되거나 다운된 후에 복구를 수행할 경우, Redis는
.rdb
파일을 로드하여 메모리를 복원합니다. - RDB 파일은 빠르게 로드할 수 있으므로, 초기화 시간이 짧고 빠른 복구가 가능합니다.
- Redis가 재시작되거나 다운된 후에 복구를 수행할 경우, Redis는
RDB 파일의 데이터 구조와 형식
- 바이너리 형식:
- RDB 파일은 순수한 텍스트가 아니라, Redis의 내부 데이터 구조를 효율적으로 표현하기 위해 바이너리 형식으로 저장됩니다. 이 형식은 데이터를 압축하고 최적화하여 저장하기 때문에 파일 크기가 상대적으로 작고, 읽기 및 쓰기 성능이 우수합니다.
- 데이터 구조:
- RDB 파일은 Redis의 여러 데이터 구조를 지원합니다. 주요 데이터 구조는 다음과 같습니다:
- Strings: 가장 간단한 데이터 구조로, 일반적인 문자열 값을 저장합니다.
- Lists: 순서가 있는 문자열 목록을 저장합니다. 각 요소는 리스트의 인덱스에 따라 정렬됩니다.
- Sets: 중복 없는 문자열의 집합으로, 순서가 없습니다.
- Sorted Sets: 각 요소가 점수(score)와 함께 저장되는 집합으로, 점수를 기준으로 정렬됩니다.
- Hashes: 필드-값 쌍으로 이루어진 맵으로, 여러 개의 값을 저장할 수 있습니다.
- RDB 파일은 Redis의 여러 데이터 구조를 지원합니다. 주요 데이터 구조는 다음과 같습니다:
- 파일 형식:
- RDB 파일은 특정 형식을 가지고 있으며, Redis에서 이러한 형식을 이해하고 읽을 수 있도록 설계되어 있습니다. 기본 구조는 다음과 같습니다:
- Magic Header: 파일의 시작 부분에는 RDB 파일임을 나타내는 헤더 정보가 포함되어 있습니다. 예를 들어, Redis의 RDB 파일 헤더는
REDIS
문자열로 시작합니다. - Version: RDB 파일 버전을 나타내는 정보입니다.
- Key/Value 쌍: 각 데이터 구조(키와 그에 해당하는 값)와 함께 메타데이터(예: 데이터 타입, 만료 시간 등)가 포함됩니다. 이 데이터는 바이너리로 인코딩되어 저장됩니다.
- EOF (End of File) Marker: 파일의 끝을 나타내는 마커가 있습니다.
- Magic Header: 파일의 시작 부분에는 RDB 파일임을 나타내는 헤더 정보가 포함되어 있습니다. 예를 들어, Redis의 RDB 파일 헤더는
- RDB 파일은 특정 형식을 가지고 있으며, Redis에서 이러한 형식을 이해하고 읽을 수 있도록 설계되어 있습니다. 기본 구조는 다음과 같습니다:
- 압축:
- RDB 파일은 필요에 따라 압축할 수 있으며, Redis에서는 기본적으로 압축하지 않고 저장합니다. 하지만 사용자는 RDB 파일이 너무 커지지 않도록 압축 알고리즘을 적용할 수 있습니다. 이를 통해 저장 공간을 절약할 수 있습니다.
RDB 파일의 생성 과정
RDB 파일의 생성 과정은 다음과 같습니다:
- 스냅샷 트리거: 설정된 주기(예:
save 900 1
과 같이 설정된 경우 15분에 한 번)마다 또는 수동으로 명령을 통해 RDB 파일을 생성합니다. - 메모리 덤프: Redis 서버는 현재 메모리의 모든 데이터를 읽어 바이너리 형식으로 변환합니다.
- 파일 저장: 변환된 데이터는 지정된 경로에 RDB 파일로 저장됩니다.
RDB 방식의 장점
- 빠른 복구: RDB 파일은 전체 데이터베이스의 스냅샷을 포함하고 있기 때문에, 서버 재시작 시 빠르게 메모리를 복원할 수 있습니다.
- 저장 공간 절약: RDB 파일은 메모리의 전체 상태를 한 번에 저장하므로 AOF 방식보다 파일 크기가 작습니다.
- 성능: RDB 방식은 메모리에서 디스크로 데이터를 저장할 때 비동기적 작업을 통해 성능 저하를 최소화합니다. 이로 인해, 주기적으로 스냅샷을 생성하는 동안 Redis는 여전히 클라이언트 요청을 처리할 수 있습니다.
- 간단한 구성: RDB는 설정이 간단하고 관리가 용이합니다.
RDB 방식의 단점
- 데이터 손실 가능성: RDB는 마지막 스냅샷 이후의 데이터는 잃을 수 있습니다. 예를 들어, 서버가 다운되기 직전에 수행된 쓰기 연산은 복구되지 않을 수 있습니다.
- 주기적 저장의 한계: 설정된 주기에 따라 저장되므로, 그 주기 사이의 모든 변경 사항은 손실될 위험이 있습니다.
- 복잡한 데이터 구조의 처리: 매우 큰 데이터셋이나 복잡한 데이터 구조(예: 해시, 리스트, 정렬된 집합 등)의 경우, RDB 파일을 생성하는 데 시간이 오래 걸릴 수 있습니다.
RDB 설정 예시
RDB 설정은 redis.conf
파일에서 다음과 같은 형식으로 지정할 수 있습니다:
plaintext
Copy code
# 900초(15분) 동안 1개 이상의 키가 변경되면 스냅샷 생성
save 900 1
# 300초(5분) 동안 10개 이상의 키가 변경되면 스냅샷 생성
save 300 10
# 60초(1분) 동안 100개 이상의 키가 변경되면 스냅샷 생성
save 60 100
RDB와 AOF의 혼합 사용
- RDB와 AOF는 서로 다른 장단점을 가지고 있기 때문에, 두 방식을 혼합하여 사용하는 것이 일반적입니다. 이를 통해 데이터의 안정성과 복구 성능을 최적화할 수 있습니다. 예를 들어, AOF를 사용하여 실시간 데이터 기록을 유지하고, 주기적으로 RDB를 생성하여 데이터의 스냅샷을 확보하는 방식입니다.
- RDB는 Redis의 데이터 영구성을 유지하는 데 중요한 역할을 하며, 다양한 사용 사례에서 유용하게 활용될 수 있습니다.