EC2 彈性負載均衡器 DNS 和路由問題
我們正在嘗試在 Amazon EC2 上執行一個相當簡單的設置 - 幾個 HTTP 伺服器位於 Amazon Elastic Load Balancer (ELB) 後面。
我們的域在 Route53 中進行管理,並且我們設置了 CNAME 記錄以指向 ELB。
我們遇到了一些問題,其中一些(但不是全部)位置間歇性地無法連接到負載均衡器;看來這可能是ELB的域名解析。
亞馬遜支持告訴我們負載均衡器的底層彈性 IP 一直在變化,問題是一些 ISP 的 DNS 伺服器不支持 TTL。我們對這種解釋並不滿意,因為我們使用 Amazon 自己的 DNS 伺服器從 EC2 實例以及澳大利亞本地 ISP 和 Google 的 DNS 伺服器 (
8.8.8.8
) 複製了問題。亞馬遜還證實,在我們注意到某些位置出現停機時間期間,通過 ELB 的流量顯著下降 - 所以問題不在於我們的端點。
有趣的是,該域似乎解析為無法連接的伺服器上的正確 IP - 但建立 TCP 連接的嘗試失敗。
連接到 ELB 的所有實例一直都是健康的。他們都是
有誰知道我們如何更深入地診斷這個問題?有沒有其他人在使用 Elastic Load Balancer 時遇到過這個問題?
謝謝,
我在Google搜尋如何診斷 Amazon Elastic Load Balancer (ELB) 時發現了這個問題,我想為像我這樣在沒有太多指導的情況下遇到此問題的其他人回答這個問題。
ELB 屬性
ELB 有一些有趣的特性。例如:
- ELB 由 1 個或多個節點組成
- 這些節點作為 ELB 名稱的 A 記錄發布
- 這些節點可能會失敗,或者被關閉,並且連接不會被正常關閉
- 它通常需要與亞馬遜支持 ($$$) 建立良好的關係才能讓某人深入研究 ELB 問題
注意:另一個有趣但相關性稍差的屬性是 ELB 並非旨在處理突然的流量高峰。它們通常需要 15 分鐘的繁忙流量才能擴大規模,或者可以根據請求通過支持工單進行預熱
ELB 故障排除(手動)
更新: AWS 已將所有 ELB 遷移到使用 Route 53 進行 DNS。此外,所有 ELB 現在都有一條
all.$elb_name
記錄,該記錄將返回 ELB 的完整節點列表。例如,如果您的 ELB 名稱是elb-123456789.us-east-1.elb.amazonaws.com
,那麼您將通過執行類似dig all.elb-123456789.us-east-1.elb.amazonaws.com
. 對於 IPv6 節點,all.ipv6.$elb_name
也可以。此外,Route 53 能夠返回最多 4KB 的仍然使用 UDP 的數據,因此+tcp
可能不需要使用該標誌。知道了這一點,您可以自己進行一些故障排除。首先,將 ELB 名稱解析為節點列表(作為 A 記錄):
$ dig @ns-942.amazon.com +tcp elb-123456789.us-east-1.elb.amazonaws.com ANY
建議使用該
tcp
標誌,因為您的 ELB 可能有太多記錄無法容納在單個 UDP 數據包中。我還被告知,但尚未親自確認,除非您執行ANY
查詢,否則亞馬遜最多只會顯示 6 個節點。執行此命令將為您提供如下所示的輸出(為簡潔起見進行了修剪):;; ANSWER SECTION: elb-123456789.us-east-1.elb.amazonaws.com. 60 IN SOA ns-942.amazon.com. root.amazon.com. 1376719867 3600 900 7776000 60 elb-123456789.us-east-1.elb.amazonaws.com. 600 IN NS ns-942.amazon.com. elb-123456789.us-east-1.elb.amazonaws.com. 60 IN A 54.243.63.96 elb-123456789.us-east-1.elb.amazonaws.com. 60 IN A 23.21.73.53
現在,對於每個
A
記錄,使案例如curl
測試與 ELB 的連接。當然,您還希望將您的測試僅與 ELB 隔離,而不連接到您的後端。關於 ELB 的最後一個屬性和鮮為人知的事實:
- 可以通過 ELB 發送的請求方法(動詞)的最大大小為127 個字元。任何更大的,ELB 都會回复HTTP 405-Method not allowed。
這意味著我們可以利用這種行為來僅測試 ELB 是否響應:
$ curl -X $(python -c 'print "A" * 128') -i http://ip.of.individual.node HTTP/1.1 405 METHOD_NOT_ALLOWED Content-Length: 0 Connection: Close
如果您看到
HTTP/1.1 405 METHOD_NOT_ALLOWED
,則 ELB 響應成功。您可能還想將 curl 的超時調整為您可以接受的值。使用 elbping 對 ELB 進行故障排除
當然,這樣做可能會變得非常乏味,因此我建構了一個工具來自動執行此操作,稱為elbping。它可作為 ruby gem 使用,因此如果您有 rubygems,則只需執行以下操作即可安裝它:
$ gem install elbping
現在你可以執行:
$ elbping -c 4 http://elb-123456789.us-east-1.elb.amazonaws.com Response from 54.243.63.96: code=405 time=210 ms Response from 23.21.73.53: code=405 time=189 ms Response from 54.243.63.96: code=405 time=191 ms Response from 23.21.73.53: code=405 time=188 ms Response from 54.243.63.96: code=405 time=190 ms Response from 23.21.73.53: code=405 time=192 ms Response from 54.243.63.96: code=405 time=187 ms Response from 23.21.73.53: code=405 time=189 ms --- 54.243.63.96 statistics --- 4 requests, 4 responses, 0% loss min/avg/max = 187/163/210 ms --- 23.21.73.53 statistics --- 4 requests, 4 responses, 0% loss min/avg/max = 188/189/192 ms --- total statistics --- 8 requests, 8 responses, 0% loss min/avg/max = 188/189/192 ms
請記住,如果您看到
code=405
,則表示 ELB 正在響應。下一步
無論您選擇哪種方法,您至少會知道您的 ELB 的節點是否響應。有了這些知識,您可以將注意力轉移到對堆棧的其他部分進行故障排除,也可以向 AWS 提出一個非常合理的案例,證明出現了問題。
希望這可以幫助!