1、緣起nginx
一個http請求從客戶端到服務端,整個執行流程是怎麼樣的呢?web
一個典型流程如上:後端
(1)客戶端經過域名daojia.com請求dns-server瀏覽器
(2)dns-server返回域名對應的外網ip(1.2.3.4)服務器
(3)客戶端訪問外網ip(1.2.3.4)向反向代理nginx網絡
(4)反向代理nginx配置了多個後端web-server服務內網ip(192.168.0.1/192.168.0.2)架構
(5)請求最終落到某一個web-server進行處理負載均衡
其中,第一個步驟域名daojia.com到外網ip(1.2.3.4)的轉換,發生在整個服務端外部,服務端不可控。性能
架構設計時,可以巧用dns作一些什麼事情呢,是本文要討論的問題。架構設計
2、反向代理水平擴展
典型的互聯網架構中,能夠經過增長web-server來擴充web層的性能,但反向代理nginx還是整個系統的惟一入口,若是系統吞吐超過nginx的性能極限,難以擴容,此時就須要dns-server來配合水平擴展。
具體作法是:在dns-server對於同一個域名能夠配置多個nginx的外網ip,每次dns解析請求,輪詢返回不一樣的ip,這樣就能實現nginx的水平擴展,這個方法叫「dns輪詢」。
3、web-server負載均衡
既然「dns輪詢」能夠將同一個域名的流量均勻分配到不一樣的nginx,那麼也能夠利用它來作web-server的負載均衡:
(1)架構中去掉nginx層
(2)將多個web-server的內網ip直接改成外網ip
(3)在dns-server將域名對應的外網ip進行輪詢解析
和nginx相比,dns來實施負載均衡有什麼優缺點呢?
優勢:
利用第三方dns實施,服務端架構不用動
少了一層網絡請求
不足:
dns只具有解析功能,不能保證對應外網ip的可用性(即便可以作80口的探測,實時性確定也是比nginx差不少的),而nginx作反向代理時,與web-server之間有保活探測機制,當web-server掛掉時,可以自動遷移流量
當web-server須要擴容時,經過dns擴容生效時間長,而nginx是服務端徹底本身可控的部分,web-server擴容更實時更方便
由於上面兩個緣由,架構上不多取消反向代理層,而直接使用dns來實施負載均衡。
4、用戶就近訪問
如文章「緣起」中所述,http請求的第一個步驟域名到外網ip的轉換,發生在整個服務端外部,服務端不可控,那麼若是要實施「根據客戶端ip來分配最近的服務器機房訪問」,就只能在dns-server上作了:
(1)電信用戶想要訪問某一個服務器資源
(2)瀏覽器向dns-server發起服務器域名解析請求
(3)dns-server識別出訪問者是電信用戶
(4)dns-server將電信機房的nginx外網ip返回給訪問者
(5)訪問者就近訪問
根據用戶ip來返回最近的服務器ip,稱爲「智能dns」,cdn以及多機房多活中最經常使用。
5、總結
架構設計中,dns有它獨特的功能和做用:
dns輪詢,水平擴展反向代理層
去掉反向代理層,利用dns實施負載均衡
智能dns,根據用戶ip來就近訪問服務器