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 |
레디스를 사용하는 경우 전체 물리 메모리를 다 사용할 수 있는 것은 아니기 때문에 조금 높게 잡았다.
특징은 메모리를 많이 쓰려면 그에 따라서 CPU 수라던지 네트워크 성능이 더 높은 걸 채택해야 한다.
결국 더 많은 메모리를 사용하려면 오버스팩이 될 수 밖에 없다.
RDS
Type | vCPU | Memory | 네트워크 성능 | 시간당 요금 |
m5.xlarge | 4 | 16 GiB | Up to 10 Gigabit | 0.236 USD |
여기에 스토리지 비용이 추가 된다.
RDS의 경우 단순하게 스토리지 사이즈만 올려주면 된다.
즉 기존 요금에서 월별 1.31USD가 추가된다.
하지만 Elasticache의 경우 스토리지 확장을 하기 위해서는 타입 교체를 하거나 샤딩을 해야 한다.
우선 샤딩은 제외를하고 (클러스터 모드로 변경되는 케이스도 있어서 제외)
올려야 하는 인스턴스의 스팩을 보면
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 |