對於比較大的網際網路公司來說,使用者可能遍及海內外,此時,為了提升使用者體驗,公司一般會在離使用者較近的地方建立機房,來服務這部分使用者的請求。
比如微信主要是服務國內,在國內就會在很多城市有大量機房服務國內使用者,另外,由於在北美、歐洲都有使用者使用,所以,在歐洲和北美也會有對應的機房。
此時,作為服務提供方,自然是希望使用者可以就近存取,廣東使用者就存取深圳機房,北美使用者就存取北美機房。
這個要怎麼做到呢,比如大家同時存取www.qq.com,如何保證就近存取呢?
這就是gslb(global server load balance)的舞臺。
dns方案,應該也是最主流的一種方案,我們可以先思考下,存取www.qq.com時,會做什麼事情呢?首先要拿到域名背後的ip,這裡就會進行dns遞迴查詢。
不看字也可以直接看圖。
但是,有一點大家要記得,自始至終,都是localDns在幫我們跑東跑西,相當於是我們的代理,在這個過程中,root、tld dns伺服器、權威伺服器,都是隻和localDns打交道,完全不知道我們使用者的存在,因此,有一點很重要,root、tld dns伺服器、權威伺服器只知道localDns的ip,而不知道我們使用者的ip。
現在我們知道了,最終是負責qq.com伺服器的dns server來幫我們解析背後的ip,問題來了,這個dns server能很好地幫我們進行就近接入嗎,答案是,不一定,這邊一般是給www.qq.com設定多條A記錄,即多個機房的ip,如深圳機房ip、北美機房ip,這個dns伺服器不是很智慧,它是輪詢地返回ip,那很有可能,北美使用者卻拿到了國內機房ip,那還怎麼玩呢,卡爆了。
問題就是,這個dns伺服器不是很智慧,不能滿足我們的個性化需求,怎麼辦呢,解決的辦法是有的,大家可以看下圖。
這邊可以給www.qq.com設定ns記錄,讓它指向另外一個dns服務,而這個dns服務,我們可以自己實現一個,無非就是寫個後臺服務,開個埠,接收dns請求,正確實現dns協定即可,gslb就是這麼一個自定義的dns服務。
NS 代表「域名伺服器」,域名伺服器記錄指示哪個 DNS 伺服器對該域具有權威性(即,哪個伺服器包含實際 DNS 記錄)。基本上,NS 記錄告訴網際網路可從哪裡找到域的 IP 地址。一個域通常會有多個 NS 記錄,這些記錄可指示該域的主要和輔助域名伺服器。倘若沒有正確設定的 NS 記錄,使用者將無法載入網站或應用程式。
下面是一個 NS 記錄範例:
example.com record type: value: TTL @ NS ns1.exampleserver.com 21600
在引入了gslb之後,dns解析,就變成了這樣的過程。
這塊我看了下騰訊這邊,應該是06年就搞出這東西了,不知道具體實現,只說是參考開源框架改的,不過我猜測,可能是根據bind這個開源dns解析器來改的,畢竟現在主流的dns服務,主要就是bind、dnsmasq,我這兩天為了實踐這個gslb,還自己搭了個bind(不過最終發現解析不到自己的bind服務上,看了域名解析商的說明,貌似是不能ns記錄指向我這種私自搭建的dns服務)
一般大廠肯定都是有自己的gslb實現了,我在攜程的技術文裡也看到相關的gslb技術的說明。
那假設我們要是在一個小廠,沒有自研能力,又當如何呢?
其實,dns解析商還是有提供高階能力的,是我low了,這個很簡單,只要鈔能力,就可以解決。
以我現在使用的dnspod這家解析商來說,預設其是支援幾種路線的,比如電信、移動,可以設定不同的指向ip。
我理解下,大廠呢,應該是有這個研發能力,不願意花這個冤枉錢,畢竟,公司小的時候,租著便宜,大了之後,域名一多,比起自研,就未必便宜了;而且自研的話,還可以和業務深度結合,搞點花活出來。
大家也可以分享下自己的看法,gslb實現這部分,都是我瞎吹的,不過dns解析商這種,提供的也算是gslb的一種實現吧