DNS在架構(gòu)設(shè)計(jì)中的巧用
一、緣起
一個(gè)http請求從客戶端到服務(wù)端,整個(gè)執(zhí)行流程是怎么樣的呢?
一個(gè)典型流程如上:
(1)客戶端通過域名daojia.com請求dns-server
(2)dns-server返回域名對應(yīng)的外網(wǎng)ip(1.2.3.4)
(3)客戶端訪問外網(wǎng)ip(1.2.3.4)向反向代理nginx
(4)反向代理nginx配置了多個(gè)后端web-server服務(wù)內(nèi)網(wǎng)ip(192.168.0.1/192.168.0.2)
(5)請求最終落到某一個(gè)web-server進(jìn)行處理
其中,***個(gè)步驟域名daojia.com到外網(wǎng)ip(1.2.3.4)的轉(zhuǎn)換,發(fā)生在整個(gè)服務(wù)端外部,服務(wù)端不可控。
架構(gòu)設(shè)計(jì)時(shí),能夠巧用dns做一些什么事情呢,是本文要討論的問題。
二、反向代理水平擴(kuò)展
典型的互聯(lián)網(wǎng)架構(gòu)中,可以通過增加web-server來擴(kuò)充web層的性能,但反向代理nginx仍是整個(gè)系統(tǒng)的***入口,如果系統(tǒng)吞吐超過nginx的性能極限,難以擴(kuò)容,此時(shí)就需要dns-server來配合水平擴(kuò)展。
具體做法是:在dns-server對于同一個(gè)域名可以配置多個(gè)nginx的外網(wǎng)ip,每次dns解析請求,輪詢返回不同的ip,這樣就能實(shí)現(xiàn)nginx的水平擴(kuò)展,這個(gè)方法叫“dns輪詢”。
三、web-server負(fù)載均衡
既然“dns輪詢”可以將同一個(gè)域名的流量均勻分配到不同的nginx,那么也可以利用它來做web-server的負(fù)載均衡:
(1)架構(gòu)中去掉nginx層
(2)將多個(gè)web-server的內(nèi)網(wǎng)ip直接改為外網(wǎng)ip
(3)在dns-server將域名對應(yīng)的外網(wǎng)ip進(jìn)行輪詢解析
和nginx相比,dns來實(shí)施負(fù)載均衡有什么優(yōu)缺點(diǎn)呢?
優(yōu)點(diǎn):
- 利用第三方dns實(shí)施,服務(wù)端架構(gòu)不用動
- 少了一層網(wǎng)絡(luò)請求
不足:
- dns只具備解析功能,不能保證對應(yīng)外網(wǎng)ip的可用性(即使能夠做80口的探測,實(shí)時(shí)性肯定也是比nginx差很多的),而nginx做反向代理時(shí),與web-server之間有保活探測機(jī)制,當(dāng)web-server掛掉時(shí),能夠自動遷移流量
- 當(dāng)web-server需要擴(kuò)容時(shí),通過dns擴(kuò)容生效時(shí)間長,而nginx是服務(wù)端完全自己可控的部分,web-server擴(kuò)容更實(shí)時(shí)更方便
因?yàn)樯厦鎯蓚€(gè)原因,架構(gòu)上很少取消反向代理層,而直接使用dns來實(shí)施負(fù)載均衡。
四、用戶就近訪問
如文章“緣起”中所述,http請求的***個(gè)步驟域名到外網(wǎng)ip的轉(zhuǎn)換,發(fā)生在整個(gè)服務(wù)端外部,服務(wù)端不可控,那么如果要實(shí)施“根據(jù)客戶端ip來分配最近的服務(wù)器機(jī)房訪問”,就只能在dns-server上做了:
(1)電信用戶想要訪問某一個(gè)服務(wù)器資源
(2)瀏覽器向dns-server發(fā)起服務(wù)器域名解析請求
(3)dns-server識別出訪問者是電信用戶
(4)dns-server將電信機(jī)房的nginx外網(wǎng)ip返回給訪問者
(5)訪問者就近訪問
根據(jù)用戶ip來返回最近的服務(wù)器ip,稱為“智能dns”,cdn以及多機(jī)房多活中最常用。
五、總結(jié)
架構(gòu)設(shè)計(jì)中,dns有它獨(dú)特的功能和作用:
- dns輪詢,水平擴(kuò)展反向代理層
- 去掉反向代理層,利用dns實(shí)施負(fù)載均衡
- 智能dns,根據(jù)用戶ip來就近訪問服務(wù)器
【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】