gslb(global server load balance)技術的一點理解

2022-07-04 06:08:09

gslb(global server load balance)技術的一點理解

前言

對於比較大的網際網路公司來說,使用者可能遍及海內外,此時,為了提升使用者體驗,公司一般會在離使用者較近的地方建立機房,來服務這部分使用者的請求。

比如微信主要是服務國內,在國內就會在很多城市有大量機房服務國內使用者,另外,由於在北美、歐洲都有使用者使用,所以,在歐洲和北美也會有對應的機房。

此時,作為服務提供方,自然是希望使用者可以就近存取,廣東使用者就存取深圳機房,北美使用者就存取北美機房。

這個要怎麼做到呢,比如大家同時存取www.qq.com,如何保證就近存取呢?

這就是gslb(global server load balance)的舞臺。

gslb的實現方案之dns

dns方案,應該也是最主流的一種方案,我們可以先思考下,存取www.qq.com時,會做什麼事情呢?首先要拿到域名背後的ip,這裡就會進行dns遞迴查詢。

  • 使用者的dns請求,首先進入原生的dns伺服器,比如我這邊是深圳電信寬頻,理論上就進入深圳電信的dns伺服器,這個我們叫做localDns
  • localDns會去查詢root dns伺服器,root dns伺服器只維護了頂級域名的dns伺服器地址,因此會返回 .com這個頂級域名對應的dns伺服器(記作tld,即top level domain頂級域名伺服器)
  • localDns接下來,向.com頂級域名伺服器發起請求,其會返回能解析qq.com域名的dns伺服器(叫做權威伺服器)
  • localDns接下來,向qq.com域名的dns伺服器發起請求,其會解析www這個主機對應的ip,並返回
  • localDns拿到www.qq.com的ip後,返回給使用者。

不看字也可以直接看圖。

但是,有一點大家要記得,自始至終,都是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解析,就變成了這樣的過程。

  • localDns前面的步驟都差不多,不同點在於,其向qq.com域名的dns伺服器發起請求後,qq.com域名解析www.qq.com,發現www.qq.com設定了ns記錄,此時,就會返回ns記錄中的value給localDns,而這個value,就是指向騰訊自己的gslb服務
  • localDns向騰訊的gslb服務發起請求,注意,我們前面說過,此時這個udp dns查詢,使用者端ip是localDns的ip,gslb伺服器也只是會拿到localDns的ip,比如,以我為例,gslb拿不到我的ip,只能拿到深圳電信的ip。
  • gslb收到請求後,理論上可以拿到的資料包括:該請求來自於哪個國家,該請求的ip所屬的運營商,該請求的ip所屬的省份城市,如中國-深圳-電信,此時,gslb可以選擇返回深圳機房的ip給localDns,而不是北美機房的ip,這樣就做到了就近接入

gslb實現

這塊我看了下騰訊這邊,應該是06年就搞出這東西了,不知道具體實現,只說是參考開源框架改的,不過我猜測,可能是根據bind這個開源dns解析器來改的,畢竟現在主流的dns服務,主要就是bind、dnsmasq,我這兩天為了實踐這個gslb,還自己搭了個bind(不過最終發現解析不到自己的bind服務上,看了域名解析商的說明,貌似是不能ns記錄指向我這種私自搭建的dns服務)

一般大廠肯定都是有自己的gslb實現了,我在攜程的技術文裡也看到相關的gslb技術的說明。

那假設我們要是在一個小廠,沒有自研能力,又當如何呢?

其實,dns解析商還是有提供高階能力的,是我low了,這個很簡單,只要鈔能力,就可以解決。

以我現在使用的dnspod這家解析商來說,預設其是支援幾種路線的,比如電信、移動,可以設定不同的指向ip。

我理解下,大廠呢,應該是有這個研發能力,不願意花這個冤枉錢,畢竟,公司小的時候,租著便宜,大了之後,域名一多,比起自研,就未必便宜了;而且自研的話,還可以和業務深度結合,搞點花活出來。

總結

大家也可以分享下自己的看法,gslb實現這部分,都是我瞎吹的,不過dns解析商這種,提供的也算是gslb的一種實現吧