公司的域名zhuanjidata.kugou.com接入了公共接入層,一開始我不明白這個接入公共層流程是怎樣的,下面我就順藤摸瓜的把這個問題解答
DNS查詢的流程:
- local DNS作為客戶端發起查詢域名解析的請求
- 向誰請求?首先會查詢本地cache,如果本地有緩存這個域名的解析結果,那么直接返回
- 如果本地cache不存在,就逐層查詢,向根域名的解析服務器查詢,即 . 的 NS記錄,NS記錄非常重要,NS服務器知道下一級域名的各種記錄
- 域名分為根域名 . , 頂級域名(TLD),二級域名(SLD),三級域名(主機名),即主機名.二級域名.頂級域名.根域名
- 本地local DNS逐層查詢的時候,先到根域名.的ns記錄查詢它下面的頂級域名記錄,然后得到頂級域名后,又根據頂級域名NS查詢它下面的域名記錄,直到得到權威服務器的回答的IP ;比如:我要查詢zhuanjidata.kugou.com 首先local DNS會請求根域名.的NS記錄(由于不會變,基本寫死在各個DNS客戶端里面)根域名的NS服務器存儲著它下級的所有域名記錄,所以我們能查詢到頂級域名.com的信息,包括它的NS記錄,然后我們請求.com的NS服務器,那么它就能查詢到它的下級域名,即kugou.com的NS記錄。 kugou.com的NS記錄就掌握了所有*.kugou.com的域名記錄。那么我們就能得到zhuanjidata.kugou.com的記錄,得到的是CNAME的記錄。
- kugou.com的NS記錄,就是說這個NS服務器是負責解析kugou.com下面的域名,即.kugou.com的記錄,除非我們另外指定了子域名使用另外的NS記錄,否則所有.kugou.com都由kugou.com的NS記錄解析。 比如我配置了bb.kugou.com的NS記錄指向另外的記錄B1server,那么*.bb.kugou.com下面的域名才會給B1server解析。
- 一般一個二級域名都會需要設置多個NS記錄,主要作用是容災,客戶端其實請求隨便一個都是能得到它的子域名的記錄。如果返回的NS列表有一個掛了,可以給客戶端使用另外一個NS重試請求。
- CNAME是域名內部跳轉記錄,CNAME記錄就是一個替換,所以域名一旦設置CNAME記錄以后,就不能再設置其他記錄了(比如A記錄和MX記錄),這是為了防止產生沖突。比如a.com CNAME b.com ,如果b.com有A,MX記錄,而a.com又設置了,就會沖突,所以CNAME設置了就要無條件轉發到指定的域名
層級查詢過程:
DNS服務器根據域名的層級,進行分級查詢。
需要明確的是,每一級域名都有自己的NS記錄,NS記錄指向該級域名的域名服務器。這些服務器知道下一級域名的各種記錄。
所謂"分級查詢",就是從根域名開始,依次查詢每一級域名的NS記錄,直到查到最終的IP地址,過程大致如下。
- 從"根域名服務器"查到"頂級域名服務器"的NS記錄和A記錄(IP地址)
- 從"頂級域名服務器"查到"次級域名服務器"的NS記錄和A記錄(IP地址)
- 從"次級域名服務器"查出"主機名"的IP地址
實踐分析
dig zhuanjidata.kugou.com的流程,按照下圖來說說:
- 通過層級查詢請求.com的NS記錄,查詢kugou.com的NS記錄,得到的是ns3.kugou.net, ns4.kugou.net, ns5.kugou.net等多個ns記錄,這里可以看到kugou.com配置多了個ns記錄,為的就是防止單點故障,可以容災。
- local DNS請求nsX.kugou.net請求查詢zhuanjidata.kugou.com的記錄,得到zhuanjidata.kugou.com --> CNAME --> kgnopipv6.kugou.com的記錄,說明需要轉發到kgnopipv6.kugou.com,所以我們最終查詢的是 kgnopipv6.kugou.com 的IP。
- 那么我們需要重新走流程查詢 kgnopipv6.kugou.com 的記錄,既然上面都直到了kugou.com的NS記錄,而且kgnopipv6.kugou.com也是在這個NS服務器下解析的,所以我認為不需要再從新從根域名開始查詢了
- 知道了kugou.com的NS服務器,local DNS就可以對這些NS列表挑選一個出來發起請求,要求查詢 kgnopipv6.kugou.com 的記錄,而就在此時,智能DNS的作用發揮了, 這些NS記錄即ns3.kugou.net 獲取local DNS的請求,就能根據local DNS的IP的地域性,判斷出返回就近區域的A記錄!
- 這也印證了智能DNS都是根據local DNS的IP來判斷的,而不是用戶的機器IP!因為請求DNS解析是在local DNS與 域名NS記錄之前發生的??!
image.png
接入公共層的作用?
公司的域名a.kugou.com, b.kugou.com, c.kugou.com都是通過CNAME到kgnop.kugou.com來達到接入公共層的作用,這樣的作用是什么呢?我總結一下:
- 由于kgnop.kugou.com已經設置好了N個NS記錄,解析已經非常完善,每個新增域名只要CNAME到它即可享受這樣完整的配置。如果每次新增域名都去配置NS記錄,那太麻煩了,而且如果有得NS記錄需要改變,所有的域名都要修改,耦合性太大!
- 各個域名只要CNAME了kgnop.kugou.com就相當于接入了公共層,就能享受多個NS的解析集群,而且這些NS服務器還有一個重要特性,就是智能DNS,即根據用戶的地區返回就近的A記錄
- 有一個核心問題,這里返回的A記錄,是kgnop.kugou.com的A記錄,不是zhuanjidata.kugou.com的A記錄,即不會直接到達我們的業務機器的!而且kgnop.kugou.com被這么多業務域名接入了,那么得到kgnop.kugou.com的A記錄后,怎么能讓請求正確到達我們的業務接口機呢??
- 我們得到的A記錄,只是一個VIP,虛擬IP,可以認為是LVS的服務,然后LVS通過轉發請求到RS(realserver)來完成這個轉發的業務。