域名解析是客戶端訪問系統的第一步。在架構設計中,DNS Server除了解析域名,還能干點什么呢?又有哪些“挖坑”的用法需要避免呢?
典型的互聯網架構中,我們通過Nginx的反向代理來做負載均衡。客戶端通過域名訪問時,DNS Server將域名解析到nginx服務器的IP,客戶端先訪問nginx,nginx再將請求分發到下層的web-server。
我們可以通過增加web-server來擴充web層的性能,但nginx仍是整個系統的唯一入口。如果系統吞吐超過nginx的單機性能極限,此時就需要通過DNS輪詢來水平擴展nginx了。
具體做法是:增加多臺nginx,對于同一個域名配置多個ip,每個ip指向一臺nginx。每次DNS解析,會輪詢返回不同的ip,這樣就能實現nginx的水平擴展了。
既然DNS輪詢可以將請求分派到不同的ip上,那可不可以去掉nginx,直接用DNS輪詢來做負載均衡呢?
通過DNS來實施負載均衡雖然能減少一層網絡請求,但也有問題。
首先,DNS只具備解析功能,并不能保證ip對應的服務器可用。而nginx做反向代理時,與web-server之間有保活探測機制,當web-server掛掉時,能夠自動遷移流量;
其次,當web-server需要擴容時,雖然可以通過增加域名解析的ip來實現擴容,但解析的生效時間長,而nginx則是完全自己可控,擴容更實時、更方便。
因為上面兩個原因,所以架構上,一般都使用nginx來做高可用反向代理。