본문 바로가기
허브 살리기 프로젝트

Latency 계층 구조로 본 서비스의 Primary DB 선택

by jay-choe 2024. 1. 28.

ByteByteGo에서 Latency 계층을 보던 중 흥미로운 점이 보인다.

 

 

 

레디스에서 물리 메모리에 저장 되어있는 데이터를 접근해서 사용할 메모리로 가져오는 것이 네트워크를 통해 데이터를 전송하는 것 보다 100배가 빠르다는 것이다.

 

1000 바이트의 데이터를 네트워크를 통해 데이터 전달은 100 마이크로초가 걸린다고 한다.

 

그럼 운영하는 서비스는 결국 레디스는 외부에서 사용하게 되니까 병목 지점은 네트워크에서 데이터 전달하는 것이 되며, 이 말은 네트워크 속도를 기준으로 데이터를 가져오는 latency를 측정하면 된다는 것이다.

 

보통의 서비스에 경우 MSA를 채택했을 때 중간의 한 API 서버가 응답해야 하는 latency는 P99 기준 우리 서비스는 200ms정도를 만족해야 한다.

 

이 말은 Redis 같은 In-Memory Data Store를 사용하는 경우 어떻게 보면 Primary DB로 사용하는 경우 너무 성능이 좋기 때문에 디스크를 사용하는 DB보다 비용 측면에서 오버엔지니어링이 아닌가 생각이 든다.

 

read from SSD를 봤을 때 1ms도 안 걸린다면 굳이 비용이 비싼 In-Memory DB를 메인으로 사용해야 하나 싶다.

 

그렇다면 비용적인 측면에서 In-Memory DB와 디스크를 사용하는 DB는 어느정도 차이가 날까?

 

서울 리전에서 AWS에서 비슷한 스팩의 인스턴스 가격을 비교해보면 10GB 정도의 데이터를 사용한다고 했을 때

 

Elasticache

 

Type v.CPU Memory 네트워크 성능 시간당 요금
cache.m5.xlarge 4  12.93 GiB Up to 10 Gigabit USD  0.382
 
1 인스턴스 x 0.382 USD 시간당 x (100 / 100 사용함/월) x 730 시간 1달 기준 = 278.8600 USD
ElastiCache 비용 (월별): 278.86 USD

 

레디스를 사용하는 경우 전체 물리 메모리를 다 사용할 수 있는 것은 아니기 때문에 조금 높게 잡았다.

 

특징은 메모리를 많이 쓰려면 그에 따라서 CPU 수라던지 네트워크 성능이 더 높은 걸 채택해야 한다.

 

결국 더 많은 메모리를 사용하려면 오버스팩이 될 수 밖에 없다.

 

 

RDS

 

Type vCPU Memory 네트워크 성능 시간당 요금
m5.xlarge 4 16  GiB Up to 10 Gigabit  0.236 USD
 
- 1 인스턴스 x 0.472 USD 시간당 x (100 / 100 사용함/월) x 730 시간 1달 기준 = 344.5600 USD
RDS MySQL 비용 (월별): 344.56 USD
 
 

여기에 스토리지 비용이 추가 된다.

 

 
- 10 GB x 0.131 USD x 1 인스턴스 = 1.31 USD (EBS 스토리지 비용)
  스토리지 요금 (월별): 1.31 USD
 
 
 
단순하게 보면 RDS 사용하는게 손해인 것 같지만. 우리는 해당 DB의 데이터 저장 공간을 중심으로
확인해야 한다.
 
 
즉 In-Memory DB는 메모리를 저장하는데 사용하는 공간이 많고
연산이나 전달에 사용하는 공간은 상대적으로 매우 작을 것이라는 것이다.
 
 
하지만 RDS는 반대로 대부분의 메모리 공간이 캐싱이나 연산 혹은 데이터 전달에 사용될 것이기 때문에 동일한 인스턴스 타입 비교는 적절하지 않다.
 
 
그러면 여기서 저장공간이 10GB가 더 필요하다고 가정을 해보자.
 
 
 
서비스를 운영하다가 새로운 요건이 생겨서 테이블이 추가가 되는데 해당 테이블에 적재 될 데이터 추정 사이즈가 10GB라고 해보자.
 
 

RDS의 경우 단순하게 스토리지 사이즈만 올려주면 된다.

 

즉 기존 요금에서 월별 1.31USD가 추가된다.

 

하지만 Elasticache의 경우 스토리지 확장을 하기 위해서는 타입 교체를 하거나 샤딩을 해야 한다.

 

우선 샤딩은 제외를하고 (클러스터 모드로 변경되는 케이스도 있어서 제외)

 
메모리 사이즈를 2배 하려면 cache.m5.2xlarge 인스턴스 타입으로 스케일 업 해야 하는데 비용은 거의 2배가 된다.
 
 
- 1 인스턴스 x 0.765 USD 시간당 x (100 / 100 사용함/월) x 730 시간 1달 기준 = 558.4500 USD
ElastiCache 비용 (월별): 558.45 USD

 

 

올려야 하는 인스턴스의 스팩을 보면

 

Type v.CPU Memory 네트워크 성능 시간당 요금
cache.m5.2xlarge 8 26.04  GiB Up to 10 Gigabit  0.765 USD
 

 

저장공간이 더 필요할 뿐인데 v.CPU까지 올려야 한다. 즉 불필요하게 성능이 좋은 자원을 더 쓰게 된다.

 

 

그러면 위의 내용으로 서비스에서 어떤 데이터 스토어를 사용 할 지 정리해보면

 

단순하게 Read 하는 목적의 저장소는 정말로 엄청난 P99 latency 제약이 없다면 In-Memory DB보다 Disk를 쓰는 DB가 확장성이나 비용에서 월등히 좋다는 것을 알 수 있다.

 

 

출처

https://blog.bytebytego.com/p/ep22-latency-numbers-you-should-know

https://calculator.aws/#/createCalculator

 

EP22: Latency numbers you should know. Also...

In this newsletter, we’ll cover the following topics: Latency numbers you should know Microservice architecture Handling hotspot accounts E-commerce workflow The Secret Sauce Behind NoSQL: LSM Tree Sponsor ByteByteGo Newsletter Which latency numbers shou

blog.bytebytego.com

 

 

'허브 살리기 프로젝트' 카테고리의 다른 글

TCP, HTTP/HTTPS keep-alive  (1) 2024.02.05
Gradle Java plugin API and Implementation  (0) 2024.01.31
SSD Sequantial Read/Write  (1) 2024.01.30
인덱스와 버퍼 풀  (0) 2024.01.25
False Sharing  (0) 2024.01.22