인터넷이 빠르게 성장하고 우리 삶에서 차지하는 비중이 엄청나게 높아지면서 인터넷 트래픽은 아주 놀라울정도로 빠르게 증가하고 있다. 매년 인터넷의 성장률이 100%에 이르고 있다. 서버의 처리량도 이와함께 빠르게 증가하고 있고 아주 유명한 웹서버의 경우는 짧은 시간에도 과부하가 걸리기 쉽다. 서버의 과부하를 극복하려면 두가지 방법이 있다. 첫번째는 서버로서 좀더 높은 성능의 서버로 교체하는 것이다. 그렇지만 요구가 계속 증가하면 또 업그레이드를 해야하므로 복잡하고 비용도 높다. 다른 방법은 다중 서버로 구성하는 것으로서 서버 클러스터를 이용해 확장가능한 서버를 구축할 수 있다. 부하가 증가하면 간단하게 서버 클러스터에 새로운 서버를 추가하기만 하면 된다. 서버 클러스터 구성에도 몇가지 방법이 있다.
넓리 사용되는 방법중 하나가 Round-Robin DNS이다. 라운드 로빈 DNS는 여러 아이피에 단일한 이름을 주는 방법이다. 그러면 서로 다른 클라이언트는 서로 다른 서버에 접속을 하게 되는 것이다. 이런 방법을 이용하면 부하가 여러 서버사이에 분산된다. 그런데 클라이언트와 계층(hierachical) DNS 시스템의 캐쉬 특성때문에 서버들사이에 부하가 불균등하게 분산된다. 그러므로 부하가 최고로 올라갈때 서버를 관리하기가 쉽지 않다. TTL(Time To Live)값을 정하기가 쉽지 않다. 값을 작게 주면 DNS서버에서 병목이 걸리고 값을 높게주면 서버간의 부하불균형이 더 심해진다. TTL을 0으로 주더라도 스케쥴링의 기본은 호스트이기때문에 사용자들의 접근 형태때문에 부하의 불균형이 심해질 수 있다. 왜냐하면 어떤 사용자는 사이트에서 많은 정보를 가지고 갈 수 있고 어떤 사용자는 잠깐 보고 그냥 갈수도 있기 때문이다. 더군다나 신뢰하기 힘든 점은 특정한 서버 노드에 문제가 생겼을때 그 노드에 접속하는 사용자는 서버가 다운되었다고 생각할 것이며 브라우저에서 "reload"나 "refresh"를 눌러도 마찬가지로 문제는 해결되지 않는다.
(** 상세한 내용은 DNS 관련 서적을 참고하기 바란다. 개인적으로 RRDNS는 저렴하고 간편하게 구현할 수 있는 방법이라고 생각을 한다. CNAME 등을 이용하면 될 것이다. )
이보다 좋은 방법은 클러스터의 서버사이에서 부하를 분산하는 부하분산기를 사용하는 것이다. 서버는 병렬로 구성되었다고 하더라도 실제 사용자들은 하나의 IP만 가진 가상 서버만을 볼 수 있으며 실제 서버는 보지 못한다. 스케쥴링의 기초는 연결이며 이는 서버의 부하분산에 더 효과적이다. 한대 또는 그 이상의 서버에서 문제가 생겼을 경우 기록을 남긴다. 서버관리가 더 쉬워지고 관리자는 사용자들에게 계속 서비스를 제공하면서 어느때고 서버를 교체할 수 있다.
부하분산은 애플리케이션 레벨과 IP 레벨로 구성할 수 있다. 예를 들어 리버시 프록시와 pWEB은 애플리케이션 레벨의 부하분산 방법이다. HTTP요구를 클러스터로 구성된 서로 다른 웹서버로 보내고 그 결과를 받아서 다시 클라이언트에게 넘겨준다. 애플리케이션 레벨에서는 HTTP요청과 결과를 돌려주는 과정에서 과부하가 크기 때문에 서버 노드가 4개이상으로 늘어나면(각 서버의 총처리량에 따라 이 숫자는 달라질 것이다) 애플리케이션 레벨의 부하분산기 자체에서 병목현상이 생길 수 있다.
나(** 이글쓴 저자)는 IP 레벨의 부하분산을 더 좋아한다. IP 부하분산을 하는것이 과부하가 적다. 그래서 서버노드의 최대 숫자가 25개에서 100개까지 올라갈 수 있다. 리눅스 가상 서버 코드는 이러한 목적을 위해 설계가 되었다. 다음장에서 상세하게 설명하겠다.
Last updated: 1999/6/27