이번 장에서는 대규모 데이터란 무엇인가에 대해 생각해본다. 특히 대규모란 어느 정도인가, 소량의 데이터 처리와 무엇이 다른가에 대한 감을 잡아야 할 것이다.
메모리는 디스크보다 10^5 ~ 10^6배 빠르다.(10만 ~ 100만배)
디스크를 회전시킬 떄에는 OS단에서 비슷한 데이터들은 비슷한 곳에 혹은 비슷한 위치에 연속된 데이터를 쌓는다. 또한 1Byte씩 읽는게 아니라 4KB정도를 한꺼번에 읽을 때도 있다.
그러나 전기적인 물품인 메모리는 탐색시 마이크로초 단위로 걸리는 반에 이러한 노력에도 불구하고 수밀리초가 걸린다.
메모리나 디스크 모두 CPU와 버스로 연결되어 있다. 여기서 주의할 건, 탐색과 전송의 차이이다. 앞서 기재한 내용들은 전부 탐색에서의 속도 차이. 그러나 이번은 전송 속도이다. 찾은 데이터를 디스크에서 메모리로 보내거나, 메모리에서 CPU로 보내는 등 컴퓨터 내부에서 전송하기 위한 속도이다.
애초에 메모리와 CPU는 7.5GB/sec 정도 나오는 빠른 버스로 연결되어 있는 반면, 디스크는 58MB/sec 정도 나오는 비교적 느린 버스로 연결되어 있다. 이에 대한 차이는 100이상 나는 차이이다.
앞서 다룬 내용들이 시스템 전체의 확장성 전략에 어떤 영향을 줄지에 대해 살펴볼 것이다.
대규모 환경이라고 하면 서버를 여러 대 나열해놓고 그 서버로 부하를 분산한다라는 얘기를 들어봤을 것이다. 웹 서비스에서 자주 거론되는 규모조정(scaling) , 확장성(scalability)의 이야기이다.
웹 서비스에서는 고가의 빠른 하드웨어를 사서 성능을 높이는 스케일업(scale-up) 전략보다도 일반적인 성능의 하드웨어를 많이 나열해서 시스템 전체 성능을 올리는 스케일아웃(scale-out) 전략이 우세하다.
그 이유는 웹 서비스에 적합한 형태 + 저렴한 비용 + 유여한 시스템 구성.
스케일아웃은 하드웨어를 나열해서 성능을 높이는, 즉 하드웨어를 횡으로 전개해 확장성을 확보한다.
이때 CPU 부하의 확정성을 확보하기는 쉽다.
그러나 DB서버 측면에서는 I/O 부하가 걸린다.
보통의 웹 애플리케이션에서는 3단구조 (프록시, AP서버, DB)가 있다. 이 때, 프록시나 AP서버에 들어온 요청은 CPU 부하만 걸리므로 분산이 간단하다. 데이터를 분산해서 갖고 있는 것이 아니므로 호스트가 동일하게 작업을 처리하기만 하면 분산가능. 이러한 요청을 균등하게 분산하는 것은 로드밸런서(load balancer) 라는 장치가 해준다. 이에 만해, DB의 요청이 들어오면 동등하거나 동일하게 복사되어있는 여러대의 DB가 있다하더라도 A라는 DB와 B라는 DB가 어떻게 동기화 할 것인가에 대한 문제가 생겨 간단히 분산할 수가 없다.