域名解析和緩存

name resolve

當(dāng)瀏覽器訪(fǎng)問(wèn)某個(gè)網(wǎng)站域名或者應(yīng)用服務(wù)通過(guò)域名方式訪(fǎng)問(wèn)API接口的時(shí)候灵莲,需要用IP和port建立TCP連接或者復(fù)用底層連接鸟整,IP地址的獲取依賴(lài)對(duì)域名的解析,完成解析的角色稱(chēng)為域名解析器(dns resolver)毯侦。解析的大致過(guò)程就是檢查cache是否有該記錄,本地hosts文件是否有,都沒(méi)有命中就查詢(xún)dns server進(jìn)行CNAME和A記錄的查詢(xún)倦蚪。在linux系統(tǒng)下,dns server的IP一般在/etc/resolv.conf文件中边苹。
域名解析常用dig命令陵且,以及在https://www.whatsmydns.net/進(jìn)行域名解析測(cè)試。

dns resolver cache(dns cache)

考慮到域名IP地址不是經(jīng)常變動(dòng)个束,減少查詢(xún)dns的冗余慕购,并顯著降低高QPS應(yīng)用服務(wù)查詢(xún)dns的壓力(最后一節(jié)有benchmark對(duì)比),需要對(duì)dns信息進(jìn)行緩存茬底。因?yàn)檐浖?yīng)用不同沪悲、開(kāi)發(fā)語(yǔ)言不同、操作系統(tǒng)不同阱表,dns resolver的實(shí)現(xiàn)和封裝也不同殿如,會(huì)遇到不同的層面的cache。比如windows的dns resolver會(huì)有cache最爬,linux默認(rèn)不緩存涉馁;go語(yǔ)言可以選擇cgo或者自己實(shí)現(xiàn)的dns resolver;chrome瀏覽器也會(huì)有自己的cache烂叔。
dns cache除了好處以外谨胞,也帶來(lái)了其他問(wèn)題。比如dns cache可能被惡意病毒修改蒜鸡,將真實(shí)IP改成釣魚(yú)網(wǎng)站的IP胯努,對(duì)用戶(hù)進(jìn)行誘導(dǎo)和釣魚(yú)。還有在服務(wù)發(fā)現(xiàn)的這種特定場(chǎng)景下逢防,dns cache是不被允許的叶沛,會(huì)出現(xiàn)IP更新不及時(shí)導(dǎo)致API流量的損失和錯(cuò)誤,例如部署上線(xiàn)或者宕機(jī)忘朝,相比之下灰署,運(yùn)維響應(yīng)的時(shí)長(zhǎng)會(huì)造成更大的損失。但為了解決這個(gè)問(wèn)題,在client和server端中間增加一層代理溉箕,dns記錄指向這個(gè)代理晦墙。如圖:


image.png

代理職責(zé)一般有:

  • 服務(wù)發(fā)現(xiàn),幫助客戶(hù)端發(fā)現(xiàn)有多少服務(wù)實(shí)例肴茄。
  • 健康檢查晌畅,對(duì)服務(wù)實(shí)例進(jìn)行健康檢查,及時(shí)剔除不健康實(shí)例寡痰,避免流量的損失抗楔。并通過(guò)此機(jī)制完成服務(wù)的無(wú)損上線(xiàn)。
  • 流量負(fù)載均衡拦坠。

代理一般分為:

類(lèi)別 名稱(chēng)
四層負(fù)載均衡 LVS F5
七層負(fù)載均衡 nginx openresty

四層代理對(duì)外暴露的IP一般稱(chēng)為虛IP(VIP)

go name resolve

  • net/net.go package comment:
Name Resolution

The method for resolving domain names, whether indirectly with functions like Dial
or directly with functions like LookupHost and LookupAddr, varies by operating system.

On Unix systems, the resolver has two options for resolving names.
It can use a pure Go resolver that sends DNS requests directly to the servers
listed in /etc/resolv.conf, or it can use a cgo-based resolver that calls C
library routines such as getaddrinfo and getnameinfo.

By default the pure Go resolver is used, because a blocked DNS request consumes
only a goroutine, while a blocked C call consumes an operating system thread.
When cgo is available, the cgo-based resolver is used instead under a variety of
conditions: on systems that do not let programs make direct DNS requests (OS X),
when the LOCALDOMAIN environment variable is present (even if empty),
when the RES_OPTIONS or HOSTALIASES environment variable is non-empty,
when the ASR_CONFIG environment variable is non-empty (OpenBSD only),
when /etc/resolv.conf or /etc/nsswitch.conf specify the use of features that the
Go resolver does not implement, and when the name being looked up ends in .local
or is an mDNS name.

The resolver decision can be overridden by setting the netdns value of the
GODEBUG environment variable (see package runtime) to go or cgo, as in:

    export GODEBUG=netdns=go    # force pure Go resolver
    export GODEBUG=netdns=cgo   # force cgo resolver

The decision can also be forced while building the Go source tree
by setting the netgo or netcgo build tag.

A numeric netdns setting, as in GODEBUG=netdns=1, causes the resolver
to print debugging information about its decisions.
To force a particular resolver while also printing debugging information,
join the two settings by a plus sign, as in GODEBUG=netdns=go+1.

On Plan 9, the resolver always accesses /net/cs and /net/dns.

On Windows, the resolver always uses C library functions, such as GetAddrInfo and DnsQuery.
  • go sdk做域名解析有兩種策略:
export GODEBUG=netdns=go    # force pure Go resolver
export GODEBUG=netdns=cgo   # force cgo resolver
  • 寫(xiě)個(gè)demo測(cè)試一下有無(wú)cache的性能區(qū)別:
    example.go
package example

import (
    "net"
)

func queryDNS(name string) []net.IP {
    ips, err := net.LookupIP(name)
    if err != nil {
        panic(err)
    }
    return ips
}

func QueryDNSNoCache() []net.IP {
    return queryDNS("music.163.com")
}

func QueryDNSWithCache() []net.IP {
    return queryDNS("music.163.com")
}

example_test.go

package example

import (
    "os"
    "testing"
)

func BenchmarkQueryDNSNoCache(b *testing.B) {
    _ = os.Setenv("GODEBUG", "netdns=go+1")
    for i := 0; i < b.N; i++ {
        QueryDNSNoCache()
    }
}

func BenchmarkQueryDNSWithCache(b *testing.B) {
    _ = os.Setenv("GODEBUG", "netdns=cgo+1")
    for i := 0; i < b.N; i++ {
        QueryDNSWithCache()
    }
}

性能對(duì)比:


image.png

從對(duì)比中可看出:go的pure resolver因沒(méi)有cache和網(wǎng)絡(luò)不穩(wěn)定的因素连躏,總耗時(shí)較多。而cgo的resolver比較穩(wěn)定且耗時(shí)較低贞滨。

dns cache查看和清除

darwin

sudo killall -HUP mDNSResponder

linux(unix)

linux或類(lèi)unix系統(tǒng)是沒(méi)有操作系統(tǒng)級(jí)別的dns cache入热。除非安裝了dnsmasq或者
nscd(Name Service Caching Daemon),并開(kāi)啟疲迂。

sudo strings /var/cache/nscd/hosts
/etc/init.d/nscd stop
/etc/init.d/nscd start
sudo nscd -g

windows

ipconfig /displaydns
ipconfig /flushdns

chrome

chrome://net-internals/#dns
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末才顿,一起剝皮案震驚了整個(gè)濱河市莫湘,隨后出現(xiàn)的幾起案子尤蒿,更是在濱河造成了極大的恐慌,老刑警劉巖幅垮,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腰池,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡忙芒,警方通過(guò)查閱死者的電腦和手機(jī)示弓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呵萨,“玉大人奏属,你說(shuō)我怎么就攤上這事〕甭停” “怎么了囱皿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)忱嘹。 經(jīng)常有香客問(wèn)我嘱腥,道長(zhǎng),這世上最難降的妖魔是什么拘悦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任齿兔,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘分苇。我一直安慰自己添诉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布医寿。 她就那樣靜靜地躺著吻商,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糟红。 梳的紋絲不亂的頭發(fā)上艾帐,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音盆偿,去河邊找鬼柒爸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛事扭,可吹牛的內(nèi)容都是我干的捎稚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼求橄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼今野!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起罐农,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤条霜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后涵亏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宰睡,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年气筋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拆内。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宠默,死狀恐怖麸恍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搀矫,我是刑警寧澤抹沪,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站艾君,受9級(jí)特大地震影響采够,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冰垄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一蹬癌、第九天 我趴在偏房一處隱蔽的房頂上張望权她。 院中可真熱鬧,春花似錦逝薪、人聲如沸隅要。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)步清。三九已至,卻和暖如春虏肾,著一層夾襖步出監(jiān)牢的瞬間廓啊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工封豪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谴轮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓吹埠,卻偏偏與公主長(zhǎng)得像第步,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 非常好的文章,怕博主刪除柒巫,再也找不到這么好的文章了,所以復(fù)制了一份翩隧,博主是2016年寫(xiě),但是是到現(xiàn)在為止看到的做个,思...
    吭聲_cfdc閱讀 1,606評(píng)論 0 4
  • 1. 概述 在網(wǎng)絡(luò)環(huán)境中一般用戶(hù)只需要在瀏覽器中輸入url如www.sunny.com就可以到對(duì)應(yīng)服務(wù)器獲取相應(yīng)的...
    ghbsunny閱讀 2,876評(píng)論 0 7
  • 在使用consul做docker容器服務(wù)化的過(guò)程中鸽心,使用到了dnsmasq做DNS請(qǐng)求轉(zhuǎn)發(fā)滚局,于是研究了下DNS協(xié)議...
    __七把刀__閱讀 3,982評(píng)論 2 13
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,312評(píng)論 0 6
  • 上上個(gè)星期去益陽(yáng)和正在創(chuàng)業(yè)的同學(xué)吃飯聊天居暖,他推薦了一部電視劇——前段時(shí)間熱播的《人民的名義》。剛開(kāi)始我擺手拒絕藤肢,打...
    緩步向前閱讀 294評(píng)論 0 0