더북(TheBook)

먼저 로드 밸런서를 여러 개 둔 후 각 로드 밸런서 뒤에 서버들을 둡니다. 클라이언트는 서버 주소를 도메인 이름(예: server.mygame.com) 형태로 가집니다. 클라이언트가 서버에 접속하려면 도메인 이름을 IP 주소로 변경해야 하는데, 이를 위해 클라이언트는 도메인 이름 서버(Domain Name Server, DNS)에 server.mygame.com의 IP 주소가 무엇인지 묻습니다(소켓의 getaddrinfo() 함수가 이 역할을 합니다).

이때 DNS는 그림 10-6의 로드 밸런서 중 주소 하나를 무작위로 리턴합니다. 그러면 클라이언트는 자연스럽게 로드 밸런서 여러 개 중 하나에 접근합니다. 이후 처리는 나머지와 같습니다. 이렇게 함으로써 로드 밸런서가 과부하에 걸리는 것을 예방할 수 있습니다. 이렇게 하는 대표적인 방식이 바로 라운드 로빈(round robin) DNS입니다. 그런데 여기서 궁금증이 하나 생길 것입니다.

“그러면 DNS에 과부화가 걸리면 어떡하나요?”

그것까지는 걱정하지 맙시다. 클라이언트는 DNS에서 도메인 이름에 대한 IP 주소를 일단 확보하면 로컬 디스크에 저장해 둡니다. 그 후 며칠 동안은 그것을 계속 사용합니다. 즉, DNS조차 과부하에 걸리는 상황은 없다고 보면 됩니다.

여기까지 과정으로 인증 서버를 수평 확장하는 데 성공했습니다. 그런데 여전히 문제점이 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.