언제 웹서버와 DB서버를 분리해야 하는가?

HYEONG HWAN, MUN/ 8월 13, 2015/ 미분류/ 6 comments

https://blog.lael.be/post/1866

보통 서비스를 처음 세팅할 때 웹서버와 디비서버를 같은공간에 설치하곤 한다.

 

서버의 능력치를 1이라고 가정하자.

초기 서비스 운영시에는 웹 0.1, 디비 0.1 의 능력이 필요하기 때문에 한 서버 공간을 사용해도 서비스 운영에 지장이 없다. 최상의 성능을 발휘할 수 있는 것이다.

 

하지만 서비스의 사용자가 늘어나게 되면 이야기가 달라진다.

서비스의 부하량이 증가해서 예를들어 웹 0.7, 디비 0.7 의 능력을 사용하는 상황이 된다면, 서버의 능력치인 1이 넘어갔기 때문에(0.7 + 0.7 = 1.4) 과로(over work)를 하게 된다.

uptime

<그림 : uptime 명령어로 현재 서버의 총 CPU부하량을 볼 수 있다>

#cat /proc/cpuinfo | grep CPU | wc -l

이 명령어를 통해 CPU 부하량 제한을 알 수 있다. (정확히 말하자면 CPU코어 수를 알 수 있다.)

위의 스크린샷을 찍은 서버의 경우, 2코어 서버라서 CPU부하량이 2 까지는 정상동작됨을 알 수 있다.

현재 [1분간 CPU 평균 부하량]이 0.30 이기 때문에 서버는 아주 여유로운 상태이다.

따라서 이 상태라면 굳이 웹과 디비를 나눌 필요가 없는 것이다.

 

웹서버와 디비서버를 분리하게 되면 어떤 효과가 있을까?

당연히 서버 부하량이 분산된다.

다만 분리를 하게 되면 웹서버와 디비서버가 추가적으로 네트워크 통신을 해야하기 때문에 인증시간 및 네트워크 지연(Network Latency)시간이 발생한다.

네트워크 지연시간은 물리적 거리에 영향을 받기 때문에,

매우 많은 네트워크 지연시간을 발생시키는 - 웹서버는 한국에, 디비서버는 일본에 분리하는 등의 행위는 하지 말아야 할 것이다.

 


 

요즘 스타트업 회사의 서버나, 상용 신규 서비스 서버들을 보면 투자를 잘 받았거나 예산이 많아서 그런지 몰라도, 처음부터 너무 고스펙으로 작업하는 경향이 있던데, 이런 경우는 웹과 디비를 나눌 필요가 없다.

 


 

다음의 경우에는 서버의 부하량과 관계 없이, 처음부터 웹서버와 디비서버를 나누어야 합니다.

- 부하분산 환경을 구축하고자 할 때 : 웹서버와 디비서버를 나누지 않고서는 부하분산 환경을 만들 수 없습니다.

load-balancing-diagram-2

 

- 장애대응 서버 : 서버 자동 복제(Auto Scaling)이나, 장애 극복(Fail Over) 등의 환경을 구축하려면 먼저 각 서버들의 역할이 명확히 구분이 되어 있어야 한다.

AWS_Auto_Scaling_using_EC2_Management_Console

 


 

대부분의 경우 웹서버와 디비서버를 분리하지 않는 것이 더 쉽고, 더 싸고, 더 빠르다.

만약 분리해야할 필요성이 생겼다면 스스로 환경을 구축하려 하지 말고 “클라우드 호스팅 인프라”를 이용하도록 하자. 물리 서버를 이용 중이라면 먼저 클라우드 서버로 이전하는 작업이 선행되어야 할 것이다.

 

월 운영예산에 맞추어서 구축하도록 하자.

 

6 Comments

  1. ELB와 AutoScaling은 초기에는 쓰지 말고 1개로 감당이 안될때부터 써야됨.
    서버 1대 돌리면서 ELB붙이면 쓸대없이 돈만 나가는 꼴..
    ELB만 EC2한대 돌리는 값 나옴.
    돈이 넘치면 써도 되고 ㅋㅋ

    1. 어이쿠 형님 이런 누추한 곳까지 (__)
      뭐.. 예산이 많으면 다 해결되는 것이죠~

  2. 안녕하세요, 글 잘 읽었습니다.
    사진에서 보면 WEB1, WEB2, DB서버로 나뉘어져 있는걸 봤습니다.
    그런데 web1과 web2를 동기화 하는데 이게 어떤 의미인지 어떻게 작동되는건지 궁금합니다.
    말 그대로 웹서버를 두개로 쪼개는 건가요?

    1. 네 맞습니다.
      같은 코드를 여러 서버에서 구동하는 것이죠. nfs나 rync 같은 소스 동기화 툴을 주로 사용합니다.
      세션 기능을 사용한 소프트웨어라면 서버간 세션공유 기능도 구현하여야 합니다. (nfs, redis, db 기법이 있음)

  3. 좋은 게시글입니다. 서버라는 표현이 모호하게 느껴졌었는데, 글을 읽고 나니, 좀더 명확히 구분지을 수 있었습니다. 혹시 블로그에 해당 게시글 링크나, 부분적으로 사용해도 될까요?

HYEONG HWAN, MUN에 답글 남기기 응답 취소

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*