問題背景
通常內(nèi)網(wǎng)DNS在生產(chǎn)中的角色如下圖媳握,生產(chǎn)機(jī)器上的DNS server配置的IP地址為內(nèi)網(wǎng)DNS的地址视哑,線上機(jī)器需要做域名查詢的時(shí)候邢笙,比如訪問www.baidu.com掂咒,先把dns請求到內(nèi)網(wǎng)DNS锥累,內(nèi)網(wǎng)DNS逐級去查詢www.baidu.com的地址缘挑,查詢完畢之后,把結(jié)果返回給線上機(jī)器桶略;問題出現(xiàn)的背景语淘,線上有服務(wù)反饋偶發(fā)查詢域名會(huì)有超時(shí),查詢機(jī)器的各項(xiàng)基礎(chǔ)指標(biāo)际歼,發(fā)現(xiàn)沒有出現(xiàn)cpu彪高惶翻,網(wǎng)絡(luò)丟包等問題,DNS server日志查詢發(fā)現(xiàn)那一個(gè)時(shí)間段鹅心,仍然能收到用戶請求吕粗,但是有錯(cuò)誤提示如下
named.conf配置中相對應(yīng)的參數(shù):
參數(shù)介紹
問題鎖定在 clients-per-query 參數(shù),和 max-clients-per-query 參數(shù)旭愧,來看一下這兩個(gè)參數(shù)的意思:
在同一時(shí)間請求相同域名的次數(shù)上有限制颅筋,這個(gè)參數(shù)就是 clients-per-query 宙暇, 字面上的意思是一次請求的clients數(shù)量,這個(gè)參數(shù)默認(rèn)是10议泵,就是說默認(rèn)只能10個(gè)client同一時(shí)間請求www.baidu.com占贫,這時(shí)bind去查詢,在查詢結(jié)果沒有返回之前先口,如果仍然有請求發(fā)來型奥,這個(gè)時(shí)候,Bind就會(huì)drop這個(gè)請求碉京,client DNS解析失敗厢汹。如果Bind查詢www.baidu.com返回了正確的結(jié)果,這是 clients-per-query 這個(gè)參數(shù)的限制就增加了5收夸,就是說坑匠,這次容許15個(gè)client來同時(shí)查找相同域名,第16個(gè)被drop卧惜,這次查詢成功之后厘灼,再增長5,直到增長到 max-clients-per-query咽瓷,默認(rèn)是100设凹,就說是每次都能成功查詢之后,同時(shí)容許100個(gè)clients來查詢相同的記錄茅姜;
解決方案
線上環(huán)境很容易出現(xiàn)闪朱,一個(gè)查詢被大量查的情況,需要調(diào)大 clients-per-query钻洒,max-clients-per-query兩個(gè)參數(shù)奋姿,具體參數(shù)值應(yīng)該根據(jù)線上的情況設(shè)定,一般設(shè)置100到500素标,可以滿足正常的查詢請求称诗,不建議把這兩個(gè)參數(shù)設(shè)置成無限大,因?yàn)檫@個(gè)機(jī)制本身也是Bind保護(hù)自己的一個(gè)手段头遭,假如大量的clients同時(shí)查詢錯(cuò)誤的域名寓免,這些查詢會(huì)占用Bind的處理時(shí)間。這也是clients-per-query如果查詢成功之后计维,逐次遞增設(shè)計(jì)的原則袜香。