TIL. 214 라운드 로빈(Round Robin) DNS를 활용한 로드 밸런싱(Load Balancing)

조윤식·2022년 9월 27일
0

라운드 로빈 DNS는 별도의 소프트웨어 혹은 하드웨어 로드밸런싱 장비를 사용하지 않고, DNS만을 이용하여 도메인 레코드 정보를 조회하는 시점에서 트래픽을 분산하는 기법이다. 웹뿐만 아니라, 도메인을 사용하는 모든 서비스 - FTP, SMTP, TURN 등 - 에서 사용이 가능하다.

라운드 로빈 DNS의 원리

웹 서버로 예를 들자면, 웹 서비스를 담당할 여러 대의 웹 서버는 자신의 공인 IP를 각각 가지고 있다. 웹 사이트에 접속을 원하는 사용자가 해당 도메인 주소를 브라우저에 입력하면, DNS는 도메인의 정보를 조회하는 데, 이때 IP 주소를 여러 대의 서버 IP 리스트 중에서 라운드 로빈 형태로 랜덤하게 하나 혹은 여러개를 선택하여 다시 사용자에게 알려준다.

결과적으로 웹 사이트에 접속하는 다수의 사용자는 실제로는 복수의 웹 서버에 나뉘어 접속하게 되면서 자연스럽게 서버의 부하가 분산되는 방식이다.

DNS의 조회 결과로 1개의 IP만 DNS 결과로 조회되는 경우도 있지만 최근의 라운드 로빈 DNS 방식은 복수의 IP를 모두 (순서를 정해서) 제공하고 클라이언트로 하여금 선택하도록 한다.

언제 사용하는가? 단점은 무엇?

라운드 로빈 DNS는 지리적으로 복수의 웹 서버가 멀리 떨어져 있어서 실시간으로 헬스 체크가 어려울 때 사용한다. (혹은 적은 비용으로 구현이 필요할때;;;)

일반적인 로드밸런싱(load balancing)은 뒤 단에 있는 백 엔드 서버들의 헬스 체크(health check) 정보를 수반하지만, 라운드 로빈 DNS는 로드밸런싱 기능이 없기에 별도의 헬스 체크가 없다. 따라서 특정 웹 서버에 문제가 생겨 서비스가 불가한 상태라 하더라도, DNS는 이를 알 방법이 없고, 해당 서버의 공인 IP를 도메인 조회 결과에 포함시키기 때문에 HA(High Availability) 용도로는 적합하지 않다. 이것이 라운드 로빈 DNS의 최대 단점이다.

라운드 로빈 DNS는 여러 개의 IP 주소를 결과로 돌려주는데, 사용자의 운영 체제나 애플리케이션에 따라 동작이 다를 수 있다. 여러 개의 결과 IP 중, 제일 먼저 조회된 IP를 사용하는 경우도 있고, 애플리케이션이 무작위로 결과 IP 중 하나를 선택하여 접속할 수도 있다. 처음 선택한 IP가 접속이 안되면 그다음으로 조회된 IP를 접속하도록 애플리케이션에 로직을 추가할 수도 있다.

DNS 조회 정보의 캐싱

조회된 IP 주소들은 사용자가 사용 중인 ISP의 로컬 DNS 리졸버(local DNS resolver)에 캐싱이 되거나, 사용자의 클라이언트 애플리케이션에도 캐싱이 될 수 있다. 캐싱 주기(TTL: Time To Live) 동안은 동일한 도메인에 대해서는 캐싱 된 IP 주소를 사용한다.

웹 페이지, 스트림 된 영상, 데이터베이스 쿼리 결과만 캐싱 하는 것이 아니라,
DNS가 조회한 도메인의 IP 정보도 네트워크상에서 캐싱 한다는 것을 잊지 말자..

따라서 도메인 설정 작업을 할 때엔 캐싱 주기 설정을 고민해야 한다. 캐싱을 무조건 길게 하면 관리자가 급하게 DNS 정보를 바꿔도 인터넷상에서 적용되려면 해당 시간 이상으로 기다려야 한다. 바뀐 DNS 정보가 인터넷상의 네임 서버에 전파(propagation) 되는 데 오랜 시간이 걸리기 때문이다. 반대로 캐싱 주기를 짧게 하면 빠른 업데이트 반영은 가능하지만, 도메인 조회가 빈번해지면서 사용자가 웹 사이트에 접속하는데 필요한 시간이 증가한다.

최근, 클라우드 벤더사들이 제공하는 라운드 로빈 DNS는 기존의 단점을 극복하기 위해 응답이 없는 웹 서버를 조회 결과에서 배제할 수 있도록 자체적인 health check 로직을 추가하고 있다. 그렇지만 이 경우에도 DNS 조회 결과가 캐싱 된 시간만큼은 HA 구성이 어려운 단점은 여전히 남아있다. 따라서 대부분 CDN 업체들은 A 레코드의 캐싱 주기를 매우 짧게 가져가는 추세이다. 아래는 blog.naver.com의 도메인 정보를 조회한 결과인데, 마지막 라인을 보면 IP 정보를 알려주는 A 레코드는 짧게 20초만 캐싱을 한다.

유의할 점은?

라운드 로빈 DNS는 가용성을 제공하지 않기 때문에, 무중단 서비스가 필요한 시스템에는 어울리지 않으며, 단순히 여러 대의 웹 서버로 트래픽을 부하 분산할 때 가장 편리하게 사용할 수 있는 옵션이다.

가용성이 필요한 시스템의 경우, health check 기능이 포함된 DNS 서비스를 사용하는 것이 좋다. AWS Route53이나, Dyn DNS 서비스가 좋은 예다.

라운드 로빈 DNS의 단점을 보완하기 위해, GSLB(Global Server Load Balancing) DNS 서비스를 사용하여 DNS 조회 시, 로드 밸런싱과 동시에 health check 기능을 사용한 HA 구성이 모두 가능하도록 구성하는 것도 안전한 방법이다.

로드밸런서 또한 SPOF(Single Point Of Failure)가 될 수 있으므로, 2대 이상의 로드밸런서와 각각의 공인 IP를 준비하고, GSLB로 트래픽을 로드밸런서에 나누는 방법도 많이 사용한다.

로그인 세션 등 세션의 유지 서버-클라이언트 간에 필요한 경우, 접속 중이던 클라이언트가 DNS에 의해 다른 서버 IP를 할당받아 다른 서버에 접속이 되면 기존 세션이 끊어질 수 있다. 이런 경우를 대비하여 웹 서버끼리 세션을 공유할 수 있도록 세션 클러스터링 설정을 하거나, 로드 밸런서에서 IP나 Cookie 값을 사용하여 동일한 서버로 접속되도록 stickness 설정을 해야 하는데, 이 부분은 L7 스위치로 해결할 수 있다.

출처 : https://m.blog.naver.com/sehyunfa/221691155719

profile
Slow and steady wins the race

0개의 댓글