주의점
해당 내용은 100% 검증된 정설이라기 보다는 제가 궁금해서 혼자 고민해 보고 이것 저것 찾아보며 얻은 결론입니다. 평소에 스캐일 아웃 (Scale-out)이 왜 더 효과적인지 의문을 품으셨던 분들이 조금이라도 궁금증이 해소됐으면 좋겠습니다.
틀린 내용이나 다른 인사이트가 있으시면 언제든 댓글로 달아 주시면 적극 반영하겠습니다!
Scale-Out? Scale-Up? 그게 뭔데
- 트래픽이 늘어나면 서버를 늘려야 합니다. 여기서 서버를 늘리는 2가지 방법이 있습니다.
- Scale-up (Vertical Scaling)은 서버 1대의 성능을 늘리는 겁니다. 메모리를 늘리고, CPU를 더 좋은 걸로 바꾸고, 네트워크 대역폭을 늘리고... 등등이 모두 Scale-up이라 할 수 있습니다.
- Scale-out (Horizontal Scaling)은 서버를 여러대로 늘려서 트래픽을 분산 시키는 겁니다.
- 보통 Scale-up이 비용이 더 많이 들고, 효과도 적다고 알려져 있습니다.
- 반대로 Scale-out은 소프트웨어와 인프라의 복잡도를 증가 시킵니다.
근데 왜 Scale-out이 더 효과적일까요? Scale-up이 효과적인 경우는 없을까요? 🤔
원인 1: 한계 효용 체감의 법칙 (Laws of Diminishing Returns)
제가 대학교를 다니면서 들었던 교양 수업 중 가장 가치 있다고 느낀게 경제학입니다. 그 중에서도 한계 효용 체감의 법칙은 사실 인간의 심리에 적용되는 미시경제학의 법칙이지만, 그 외에도 많은 거시 경제학적 현상에 적용되기도 하는 법칙입니다.
보통은 아래와 같은 그래프로 설명이 되는데요.
하지만 이건 무시하시고, 일단 한계 효용 체감의 법칙이 뭐냐 하면...
모든 다른 요소가 같을 때, 재화를 넣어서 얻는 효용은 점점 줄어든다
쉽게 말하면 배고플 때 피자를 시켜서 8조각을 얻었다고 해 보겠습니다. 이때 피자를 8,000원에 시켰다고 하면 모든 1조각은 모두 똑같이 1,000원입니다. 근데 배고플 때 먹는 1번째 조각의 효용과 (행복과) 마지막 8번째 조각의 효용은 (행복은) 다릅니다. 가격, 피자의 질 등이 모두 똑같음에도 똑같은 재화를 넣어서 얻는 효용은 점점 줄어든다는 겁니다.
피자의 경우 점점 배불러서 그랬지만 대부분의 경우에도 사람의 심리적 특성상 모든 걸 점점 질려하기 때문에 (심리학의 범위빈도이론) 비슷한 현상이 일어납니다.
컴퓨터 하드웨어에도 비슷한 현상이 나타납니다. 컴퓨터의 성능을 더 늘리기 위해서는 부품은 더 작고, 1개 1개를 더 좋게 만들어야 합니다. 근데 작아지면 작아질 수록 더 첨단 기술이 필요합니다. 그래서 똑같은 돈을 들여 기술 개발을 해도 성능을 점점 늘리기가 힘들어 지는 겁니다. 같은 비용과 노력을 드려도 처음에는 성능을 100에서 200으로 100 늘렸다면, 이제는 5000에서 5050으로 50 밖에 늘어나지 않는 겁니다.
그러니 자연스럽게 컴퓨터 1대의 성능을 2배 늘리는 비용보다는 같은 성능의 컴퓨터를 2대 사는게 훨씬 쌀 수 밖에 없습니다.
원인 2: 웹 트래픽의 특성
다음으로 일반적인 웹 애플리케이션에서 받는 트래픽의 특성이 있습니다. 보통 CPU는 많이 필요하지 않고 I/O가 많이 요구되는 트래픽이 대부분인데요. (웹 개발자들이 CPU나 메모리가 많이 필요하면 배치나 Pub/Sub 등 여러 방법을 써서 미리 계산을 해서 Cache를 해 두기 때문도 있고 많은 웹 애플리케이션이 단순 CRUD 이기 때문도 있습니다.)
하지만 I/O는 CPU/Memory에 비해서 압도적으로 느리기 때문에 1대의 서버의 성능을 늘리는게 명확한 한계가 있는 겁니다.
- 인터넷 LAN == 12.5MB/s
- 하드 디스크 == 40-60MB/s
- 메모리 (RAM) == 2,000 MB/s
결론
- 대부분의 경우 Scale-out이 Scale-up에 비해 효과적이다.
- 1번째 이유는 한계 효용 체감의 법칙이 컴퓨터 성능에도 적용돼서 1대의 컴퓨터 성능을 2배 늘리는 비용보다 2대의 컴퓨터를 마련하는게 압도적으로 싸기 때문이다.
- 2번째 이유는 웹 트래픽의 특성 상 I/O에서 병목이 많이 발생해서 Scale-out으로 트래픽 받는 지점을 늘리는게 처리량이 더 늘어나기 때문이다.
'👨💻 프로그래밍 > 📦 Backend' 카테고리의 다른 글
성능 개선 고민: 데이터를 Map으로 바꾸는 것은 언제 가성비를 갖게 될까? (0) | 2024.08.01 |
---|---|
서버에 API Key를 하드코딩 하면 안 될까? (0) | 2024.07.27 |
자주 쓰는 Kotlin Live Template 공유 (0) | 2024.06.02 |
Spring에서 DB 예외 처리하는 법 알아보기 (0) | 2024.05.07 |
Spring에서 Transaction 관리하는 법 알아보기 (0) | 2024.05.06 |