데이터베이스 메모리 한도
데이터베이스 메모리 한도 (Database memory limits) (memory-limit)
Redis 공식 문서의 memory-limit 페이지를 한국어로 풀어드릴게요. 옆에서 하나씩 설명해 드리는 느낌으로 읽으시면 돼요.
Redis Enterprise Software에서 데이터베이스의 **메모리 한도(memory limit)**를 어떻게 설정하고 고려하는지 알려드릴게요. 데이터베이스의 메모리 한도를 설정하면, 클러스터 안에서 그 데이터베이스가 도달할 수 있는 최대 크기를 정의해요. 이 한도는 모든 데이터베이스 replica와 shard(primary와 replica shard 모두)에 걸쳐서 적용돼요. 클러스터 안 데이터베이스의 총 크기가 메모리 한도에 도달하면 **데이터 축출 정책(eviction policy)**이 적용돼요.
크기 산정 요소 (Factors for sizing)
메모리 한도를 정할 때 고려할 요소들이에요.
- 데이터셋 크기 (dataset size): 오버헤드를 남겨두기 위해 한도를 데이터셋 크기보다 위로 잡아야 해요.
- 데이터베이스 처리량 (database throughput): 높은 처리량은 더 많은 shard를 필요로 해서 더 높은 메모리 한도로 이어져요.
- 모듈 (modules): 데이터베이스에 모듈을 쓰면 더 많은 메모리를 소비해요.
- 데이터베이스 클러스터링 (database clustering): 데이터를 여러 노드의 shard에 분산할 수 있게 해줘요.
- Active-Active 복제: Active-Active 복제를 켜면 일반 복제의 2배(데이터 원본 크기의 최대 2x) 메모리가 필요해요.
- 데이터베이스 복제 백로그 (database replication backlog): shard 간 동기화용. 기본적으로 데이터베이스 크기의 1%로 설정돼요.
- Active-Active 복제 백로그: 클러스터 간 동기화용. 기본적으로 데이터베이스 크기의 1%로 설정돼요.
또한 Active-Active 데이터베이스는 모든 참여 클러스터에 전파해야 하므로 축출 정책 활성화 임계값이 더 낮아요. Active-Active 인스턴스 중 하나가 메모리 한도의 **80%**에 도달하면 축출 정책이 키를 축출하기 시작해요.
그리고 Auto Tiering(플래시)을 쓸 때는:
- 사용 가능한 플래시 공간이 총 데이터베이스 크기(RAM+Flash)보다 크거나 같아야 해요. 추가 공간은 쓰기 버퍼와 write amplification을 위해 남겨둬요.
- 데이터베이스 영속성 (database persistence): Auto Tiering은 primary와 replica shard가 모두 디스크에 저장하는 이중 데이터베이스 영속성을 사용해요.
Redis Enterprise Software가 RAM이 부족하면 어떻게 되나요?
Redis Enterprise Software는 (Auto Tiering을 쓰지 않는다면) 데이터가 전적으로 RAM에 있도록 노드 메모리를 관리해요. RAM이 충분하지 않으면 Redis Enterprise는 데이터베이스에 더 많은 데이터가 추가되는 것을 막아요. 기존 데이터를 보호하고 데이터베이스가 shard에 데이터를 저장하지 못하게 하죠.
관리자가 각 데이터베이스에 설정한 축출 정책에 따라, 클러스터가 데이터를 다른 노드로 옮기거나 아예 버리도록 구성할 수 있어요. Auto Tiering은 플래시 메모리(SSD)로도 데이터를 저장할 수 있게 메모리를 관리해요.
RAM 부족 시의 이벤트 순서
- 다른 노드가 있다면 shard들이 다른 노드로 마이그레이션돼요.
- 축출 정책이 축출을 허용하면 shard들이 메모리를 해제하기 시작하는데, 이는 데이터 손실로 이어질 수 있어요.
- 축출 정책이 축출을 허용하지 않으면 OOM(out of memory) 메시지를 받게 돼요.
- (이어서)
적응형 메모리 할당 (Adaptive memory allocation)
드물지만 고속 데이터 수집 중에 데이터베이스가 구성된 메모리 한도의 최대 **200%**까지 일시적으로 도달할 수 있어요. 이 적응형 메모리 할당 전략은 유효한 트랜잭션을 거부하지 않고도 많은 양의 데이터를 데이터베이스에 빠르게 쓸 수 있게 해줘요.
예를 들어 2 GB 데이터베이스에 약 100 MB/sec 속도로 데이터를 넣을 때:
- shard 2개짜리 데이터베이스는 구성된 메모리 한도의 199%까지 도달할 수 있어요.
- shard 4개짜리 데이터베이스는 약 220%까지 도달할 수 있어요.
데이터가 축출 정책과 TTL(time-to-live)에 따라 제거된 후 데이터베이스는 구성된 메모리 한도로 돌아와야 해요.
관련 정보 (Related info)
더 알아보기 (Learn more)
메모리 한도와 관련 주제를 더 알고 싶다면 아래를 확인해 보세요.