TTL을 통한 가중치 라운드 로빈-가능합니까?


9

현재로드 밸런싱을 위해 DNS 라운드 로빈을 사용하고 있습니다. 기록은 다음과 같습니다 (120 초의 TTL이 있습니다)

;; ANSWER SECTION:
orion.2x.to.        116 IN  A   80.237.201.41
orion.2x.to.        116 IN  A   87.230.54.12
orion.2x.to.        116 IN  A   87.230.100.10
orion.2x.to.        116 IN  A   87.230.51.65

모든 ISP / 장치가 이러한 응답을 동일한 방식으로 처리하는 것은 아닙니다. 예를 들어 일부 DNS 서버는 주소를 임의로 회전 시키거나 항상 순환합니다. 일부는 첫 번째 항목을 전파하고 다른 일부는 IP 주소를보고 가장 가까운 (지역에 가까운) 항목을 결정하려고합니다.

그러나 사용자 기반이 충분히 크면 (여러 ISP에 퍼짐 등) 균형이 잘 맞습니다. 로드 량이 가장 많은 서버에서 가장 낮은 서버로의 차이는 거의 15 %를 초과하지 않습니다.

그러나 이제 더 많은 서버를 시스템에 도입하고 있으며 모두 동일한 용량을 가질 수 없다는 문제가 있습니다.

현재 1Gbps 서버 만 있지만 100Mbps 및 10Gbps 서버로 작업하고 싶습니다.

그래서 내가 원하는 것은 무게가 100 인 10Gbps 서버, 무게가 10 인 1Gbps 서버 및 무게가 1 인 100Mbps 서버를 소개하는 것입니다.

이전에 서버를 두 번 추가하여 더 많은 트래픽을 가져 왔습니다 (대역폭이 거의 두 배로 늘었습니다). 그러나 10Gbps 서버를 DNS에 100 번 추가하는 것은 약간 어리 석습니다.

그래서 TTL 사용에 대해 생각했습니다.

서버 A에 240 초의 TTL과 서버 B를 120 초만 주면 (낮은 TTL이 지정되면 많은 DNS 서버가 120으로 설정되므로 라운드 로빈에 사용하는 최소값입니다). 이상적인 시나리오에서 이와 같은 것이 발생해야한다고 생각합니다.

First 120 seconds
50% of requests get server A -> keep it for 240 seconds.
50% of requests get server B -> keep it for 120 seconds

Second 120 seconds
50% of requests still  have server A cached -> keep it for another 120 seconds.
25% of requests get server A -> keep it for 240 seconds
25% of requests get server B -> keep it for 120 seconds

Third 120 seconds
25% will get server A (from the 50% of Server A that now expired) -> cache 240 sec
25% will get server B  (from the 50% of Server A  that now expired) -> cache 120 sec
25% will have server A cached for another 120 seconds
12.5% will get server B (from the 25% of server B that now expired) -> cache 120sec
12.5% will get server A (from the 25% of server B that now expired) -> cache 240 sec

Fourth 120 seconds
25% will have server A cached -> cache for another 120 secs
12.5% will get server A (from the 25% of b that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of b that now expired) -> cache 120 secs
12.5% will get server A (from the 25% of a that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of a that now expired) -> cache 120 secs
6.25% will get server A (from the 12.5% of b that now expired) -> cache 240 secs
6.25% will get server B (from the 12.5% of b that now expired) -> cache 120 secs
12.5% will have server A cached -> cache another 120 secs
... I think I lost something at this point, but I think you get the idea...

보시다시피, 이것은 예측하기가 매우 복잡하고 실제로 실제로 이와 같이 작동하지 않을 것입니다. 그러나 배포에 확실히 영향을 미칩니다!

가중 라운드 로빈이 존재하고 루트 서버에 의해 제어된다는 것을 알고 있습니다. 응답 할 때 DNS 레코드를 순환하고 가중치에 해당하는 설정된 확률로 DNS 레코드를 반환합니다. 내 DNS 서버는이를 지원하지 않으며 요구 사항이 정확하지 않습니다. 그것이 완벽하게 무게가 맞지 않으면 올바른 방향으로 가야합니다.

TTL 필드를 사용하는 것이 더 우아하고 쉬운 솔루션 일 수 있다고 생각합니다.이를 동적으로 제어하여 리소스를 절약하는 DNS 서버가 필요하지 않습니다. 이는 DNS로드 밸런싱과 하드웨어로드 밸런서의 요점입니다.

내 질문은 지금이다 : DNS 레코드의 TTL 속성을 사용하는 모범 사례 / 방법 / 규칙 대 가중치 라운드 로빈 분포가 있습니까?

편집하다:

시스템은 정방향 프록시 서버 시스템입니다. 대역폭 (요청 아님)의 양이 이더넷이있는 단일 서버 하나가 처리 할 수있는 양을 초과합니다. 따라서 대역폭을 여러 서버에 분산시키는 밸런싱 솔루션이 필요합니다. DNS를 사용하는 것보다 다른 방법이 있습니까? 물론 파이버 채널 등이있는로드 밸런서를 사용할 수 있지만 비용은 엄청 나며 병목 현상의 폭만 증가시키고 제거하지는 않습니다. 내가 생각할 수있는 유일한 것은 애니 캐스트 (애니 캐스트 또는 멀티 캐스트입니까?) IP 주소이지만 그러한 시스템을 설정할 수단이 없습니다.


광범위한 응답자가 RFC 2181 § 5.2 사본을 사용하여 머리에 맞을 준비를하십시오.
JdeBP

글쎄, RR은로드 밸런싱을 위해 설계되지 않았다는 것을 알고 있습니다. 그러나 그것은 훌륭하게 작동합니다 ... 그래서 ... 나는 또한 대안을 알지 못합니다. 물론 거기에 있지만 그것들을 제 자리에 놓거나 너무 비싸거나 너무 복잡하게 만들 수는 없습니다
Shurrican

@JdeBP 예, 좋은 점-RRset의 TTL은 같아야합니다.
Alnitak

답변:


2

우선, @Alnitak은 DNS가 이런 종류의 것을 위해 설계되지 않았다는 것에 전적으로 동의하며, 모범 사례는 DNS를 가난한 사람의로드 밸런서로 사용하지 않는 것입니다.

내 질문은 ... DNS 레코드의 TTL 속성을 사용하여 가장 좋은 규칙 / 메 토스 / 규칙 대 중량 라운드 로빈 분포가 있습니까?

질문의 전제에 답하기 위해 DNS를 사용하여 basix 가중 라운드 로빈을 수행하는 데 사용되는 방법은 다음과 같습니다.

  • 신뢰할 수있는 DNS 응답에서 레코드 의 상대적 발생 을 조정합니다 . 즉 Server A, 트래픽이 1/3이고 Server B2/3이면 DNS 프록시에 대한 권한있는 DNS 응답의 1/3은 IP 포함 A하고 응답의 2/3는 IP 포함 합니다B . (두 대 이상의 서버가 동일한 '무게'를 공유하는 경우 하나의 응답으로 묶을 수 있습니다.)
  • 불균형로드가 비교적 빠르게 고르게되도록 낮은 DNS TTL을 유지하십시오. 다운 스트림 DNS 프록시에는 매우 고르지 않은 수의 클라이언트가 있기 때문에 레코드를 자주 다시 섞기를 원할 것입니다.

Amazon의 Route 53 DNS 서비스는이 방법을 사용합니다 .

대역폭 (요청 아님)의 양이 이더넷이있는 단일 서버 하나가 처리 할 수있는 양을 초과합니다. 따라서 대역폭을 여러 서버에 분산시키는 밸런싱 솔루션이 필요합니다.

권리. 내가 이것을 이해함에 따라, 총 서비스 비트 레이트가 1GBit를 초과하는 일종의 '저렴한'다운로드 / 비디오 배포 / 대용량 파일 다운로드 서비스가 있습니다.

서비스 및 서버 레이아웃의 정확한 세부 사항을 알지 못하면 정확하지 않습니다. 그러나이 경우 일반적인 해결책은 다음과 같습니다.

  • 둘 이상의 TCP / IP 또는 HTTP 레벨로드 밸런서 인스턴스에 대한 DNS 라운드 로빈.
  • 각로드 밸런서 인스턴스는 가용성이 높습니다 (2 개의 동일한로드 밸런서가 하나의 IP 주소를 항상 유지하기 위해 협력).
  • 백엔드 서버에 대한 가중 라운드 로빈 또는 가중 무작위 연결 처리를 사용하는 각로드 밸런서 인스턴스.

이러한 종류의 설정은 오픈 소스 소프트웨어 또는 여러 공급 업체의 특수 목적 어플라이언스를 사용하여 구축 할 수 있습니다. 여기 의 로드 밸런싱 태그 는 훌륭한 시작점입니다.


4

내 질문은 ... DNS 레코드의 TTL 속성을 사용하여 가장 좋은 규칙 / 메 토스 / 규칙 대 중량 라운드 로빈 분포가 있습니까?

예, 모범 사례는 하지 마십시오 !

나를 따라 해줘

  • DNS는로드 밸런싱 용이 아닙니다
  • DNS는 복원력을 제공하지 않습니다
  • DNS는 장애 조치 기능을 제공하지 않습니다

DNS는 이름하나 이상의 IP 주소 에 매핑하기위한 것 입니다. 이후의 균형 조정은 디자인이 아니라 운을 통해 이루어집니다.


1
more IP addresses... 어떻게 균형이 맞지 않습니까? 또한 이것이 내 질문에 적절한 소개를 한 이유입니다. 내가 그 일을하지 않았다면 귀하의 게시물을 의견으로 평가하지만이와 같이 하향 조정해야합니다. maby 그것은 디자인이 아니지만 훌륭하게 작동하며 모든 대안에 비해 큰 장점을 제공합니다. 그것이 구글, 페이스 북, 아마존 등의 웹 사이트도 생각하고 사용하는 것입니다. 그러나 의견은 지적했다. 내가 시나리오에 대한 자세한 내용은 내 질문을 업데이트하고 친절 대안 밸런싱 솔루션 @Alnitak 제안하도록 요청
Shurrican

2
이러한 방식으로 밸런싱을 수행하면 클라이언트 측이 직면 한 많은 문제가 제어 할 수 없기 때문에 완전성을 보장 할 수 없습니다. 기본적으로 라운드 로빈을 보장 할 수 없기 때문에 '무게'를 원할 때 이것은 이중입니다. DNS는 조언 서비스 일 뿐이므로 클라이언트는 반드시 편지를 따라야 할 필요가 없습니다. 나는 그것이 @Alnitak이 만들고 싶었던 요점이라고 생각합니다.
Matthew Ife

나는 그것을 완벽하게 이해합니다. 내 질문에서 인용 : 모든 ISP / 장치가 그러한 응답을 동일한 방식으로 처리하는 것은 아닙니다. 예를 들어 일부 DNS 서버는 주소를 임의로 회전 시키거나 항상 순환합니다. 일부는 첫 번째 항목을 전파하고 다른 일부는 IP 주소를 확인하여 어느 것이 가장 적합한지를 결정하려고합니다. 그러나 사용자 기반이 충분히 크면 (여러 ISP에 퍼짐) 균형이 잘 맞습니다. 로드 량이 가장 많은 서버에서 가장 낮은 서버로의 차이는 거의 15 %를 초과하지 않습니다.
슈리 칸

@JoeHopfgartner는 탄력성, 재 통합 및 밸런싱을 제공하는 유일한 완벽한 방법은 IP 계층, ​​즉 BGP 라우팅 및 계층 4로드 밸런서입니다. 나는 이미 다른 답변에서 수십 번을 말했기 때문에이 답변에서 그것을 말하지 않았습니다.
Alnitak

솔루션에 중복성이 중요합니까? IE 서버가 다운되면 제대로 처리됩니까? 그것이 당신의 개방이라면 RR-DNS로 웜 캔이 될 수 있기 때문입니다.
Matthew Ife

2

PowerDNS를 살펴보십시오 . 사용자 정의 파이프 백엔드를 작성할 수 있습니다. Algorithm :: ConsistentHash :: Ketama 모듈 을 사용하기 위해 perl로 작성된로드 밸런서 DNS 백엔드 예제를 수정했습니다 . 이렇게하면 임의의 가중치를 다음과 같이 설정할 수 있습니다.

my $ketamahe = Algorithm::ConsistentHash::Ketama->new();

# Configure servers and weights
$ketamahe->add_bucket("192.168.1.2", 50);
$ketamahe->add_bucket("192.168.1.25", 50);

그리고 또 하나 :

# multi-colo hash
my $ketamamc = Algorithm::ConsistentHash::Ketama->new();

# Configure servers and weights
$ketamamc->add_bucket("192.168.1.2", 33);
$ketamamc->add_bucket("192.168.1.25", 33);
$ketamamc->add_bucket("192.168.2.2", 17);
$ketamamc->add_bucket("192.168.2.2", 17);

원하는 최상위 도메인에서 gslb 또는 Global Server Load Balancing이라고하는 하위 그룹에 cname을 추가했습니다. 거기에서이 사용자 지정 DNS 서버를 호출하고 원하는 가중치에 따라 A 레코드를 보냅니다.

챔피언처럼 작동합니다. ketama 해시는 서버를 추가하거나 가중치를 조정할 때 기존 구성의 중단을 최소화하는 훌륭한 속성을 갖습니다.

Jan-Piet Mens의 대체 DNS 서버를 읽는 것이 좋습니다. 그는 예제 코드뿐만 아니라 많은 좋은 아이디어를 가지고 있습니다.

또한 TTL 변조를 포기하는 것이 좋습니다. 이미 멀리 떨어져 있고 다른 kludge를 맨 위에 추가하면 문제 해결 및 문서화가 매우 어려워집니다.


1

PowerDNS를 사용하여 가중 라운드 로빈을 수행 할 수 있지만, 언밸런스 방식 (100 : 1?)으로로드를 분배하는 것은 적어도 내 솔루션에서 사용한 알고리즘에 따라 매우 흥미로울 수 있습니다. 각 RR 항목에는 가중치가 있습니다. , 1 ~ 100 사이의 임의의 값을 사용하여 레코드를 포함하거나 제외합니다.

다음은 가중치가있는 RR DNS를 수행하기 위해 PowerDNS에서 MySQL 백엔드를 사용하여 작성한 기사입니다. http://www.mccartney.ie/wordpress/2008/08/wrr-dns-with-powerdns/

RIPienaar에는 일부 Ruby 기반 예제 (PowerDNS 파이프 백엔드 사용)가 있습니다. http://code.google.com/p/ruby-pdns/wiki/RecipeWeightedRoundRobin


1

이러한 종류의 설정을 처리하려면 실제로드 밸런싱 솔루션을 살펴 봐야합니다. Linux Virtual ServerHAProxy를 읽으십시오 . 서버가 실패하고 그 영향을 훨씬 쉽게 이해하면 풀에서 서버가 자동으로 제거된다는 추가 이점이 있습니다. 가중치는 단순히 조정될 설정입니다.


문제는 하나의 단일 서버가 처리 할 수있는 요청 수의 문제가 아니라 대역폭 문제가 있다는 것입니다. 따라서 하나의 노드를 통해 모든 트래픽을 보내야하는 솔루션은 나에게 솔루션이 아닙니다. DNS 솔루션 외에 생각할 수있는 유일한 것은 멀티 캐스트 IP 주소입니다. 그에 따라 질문을 편집했습니다.
슈리 칸

죄송합니다. 멀티 캐스트가 아닌 애니 캐스트를 의미합니다 (생각합니다)
Shurrican

1
대역폭이 문제라면 스위치에서이 + LACP를 살펴보십시오. 그런 다음로드 밸런싱 장치에 여러 10G 카드를 본딩 할 수 있습니다.
마크 해리 건

흥미 롭기 때문에 이것을 찬성했습니다 ... 그러나 httle은 병목 현상으로 스위치를 가지고 있습니다!
슈리 칸
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.