Networking

通過 TTL 加權循環 - 可能嗎?

  • January 8, 2013

我目前使用 DNS 循環進行負載平衡,效果很好。記錄看起來像這樣(我的 TTL 為 120 秒)

;; 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%。

但是,現在我遇到的問題是,我在系統中引入了更多伺服器,而且並非所有伺服器都具有相同的容量。

我目前只有 1 Gbps 伺服器,但我也想使用 100 Mbps 和 10 Gbps 伺服器。

所以我想要的是我想介紹一個 10 Gbps 權重為 100 的伺服器,一個 1 Gbps 權重為 10 的伺服器和一個 100 Mbps 權重為 1 的伺服器。

我之前添加了兩次伺服器來為它們帶來更多流量(效果很好——頻寬幾乎翻了一番)。但是向 DNS 添加 100 次 10 Gbps 伺服器有點荒謬。

所以我考慮使用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 地址,但我沒有辦法建立這樣的系統。

首先,我完全同意@Alnitak 的觀點,即 DNS 不是為這類事情而設計的,最好的做法是不要(ab)將 DNS 用作窮人的負載平衡器。

我現在的問題是……是否有任何最佳規則/方法/經驗法則來使用 DNS 記錄的 TTL 屬性來加權循環分配?

**為了回答這個問題的前提,**使用 DNS 執行 basix 加權循環的方法是:

  • 調整權威 DNS 響應中記錄的相對出現次數。即,如果Server A要擁有 1/3 的流量並且Server B要擁有 2/3,那麼對 DNS 代理的權威 DNS 響應的 1/3 將 A包含的 IP,而響應的 2/3 僅包含B的 IP。(如果 2 個或更多伺服器共享相同的“權重”,那麼它們可以捆綁到一個響應中。)
  • 保持較低的 DNS TTL,以便相對快速地平衡不平衡負載。由於下游 DNS 代理背後的客戶端數量非常多,因此您需要經常重新洗牌記錄。

Amazon 的Route 53 DNS 服務使用這種方法

頻寬(不是請求)的數量超過了一台帶有乙太網的伺服器可以處理的數量。所以我需要一個平衡的解決方案,將頻寬分配給多台伺服器。

對。據我了解,您有某種“廉價”下載/影片分發/大文件下載服務,其中總服務比特率超過 1 GBit。

在不知道您的服務和伺服器佈局的確切細節的情況下,很難準確。但在這種情況下,一個常見的解決方案是:

  • DNS 輪詢到兩個或更多 TCP/IP 或 HTTP 級別的負載均衡器實例。
  • 每個負載均衡器實例都具有高可用性(2 個相同的負載均衡器合作保持一個 IP 地址始終開啟)。
  • 每個負載均衡器實例使用加權循環或加權隨機連接處理到後端伺服器。

這種設置可以使用開源軟體建構,也可以使用許多供應商的專用設備建構。這裡的負載平衡標籤是一個很好的起點,或者您可以聘請以前做過此操作的系統管理員為您提供諮詢…

引用自:https://serverfault.com/questions/357650