MySQL DNS反查導致串連緩慢

來源:互聯網
上載者:User

情境
機器A上的一個模組串連機器B上的MySQL,在實驗室網路環境下正常;同樣A、B兩台機器,網路環境切換為與外界隔離的一個小型區域網路環境,A上的模組與B上MySQL建立串連非常慢。

環境
SUSE 11 x64,MySQL 5.1

分析
A上的模組啟動以後長時間無響應,不能提供服務,由於模組代碼編寫不具備充分的調試資訊,不知道程式阻塞在什麼地方。於是,使用gdb進行調試,中斷程式以後,執行bt查看調用棧,程式調用mysql_real_connect與MySQL建立串連,在mysql_real_connect中調用read接收MySQL伺服器返回的資料,程式就卡在read調用上。

在A上用telnet串連B上的MySQL 3306連接埠,建立網路連接正常。但是在A上用MySQL用戶端訪問B上的MySQL則建立MySQL串連(包括建立網路連接及進行使用者認證等)的時間很長,在此期間,使用netstat查看網路連接,確認A上的MySQL用戶端與B上的MySQL伺服器網路連接已經建立。因此,問題應該出在用戶端與MySQL伺服器進行後續協議互動的過程中。

仔細對比了前後兩個網路環境,唯一的區別在於出問題的網路環境不能訪問外網,其餘環境都相同,甚至連機器IP都是一樣的。這時我想起以前在區域網路內使用Oracle時也出現過類似的問題,當時將Oracle所在機器的DNS配置(/etc/resolv.conf)清空以後就好了。於是我出於僥倖心理,將B機器的DNS配置清空,重新啟動A上的模組,一切都正常了。

繼續分析問題,發現之前配置的DNS是外網地址,在實驗室網路環境下是可以訪問的,在後面的小型區域網路環境不能訪問。推測是MySQL在使用者建立串連時使用了DNS,由於配置的DNS無法訪問,MySQL會一直等待網路逾時。

網上找了一下相關資料,發現MySQL確實會在使用者登陸過程中對用戶端IP進行DNS反查。為了避免這個反查過程,可以在MySQL的設定檔my.cnf中做如下配置:
12 [mysqld]
skip-name-resolve

如果由於DNS反查導致登陸很慢,那麼在MySQL伺服器上使用show processlist會看到類似如下串連:
123 |592|unauthenticated user|192.168.3.20:35320|NULL|Connect| |login|NULL|
|593|unauthenticated user|192.168.3.20:35321|NULL|Connect| |login|NULL|
|594|unauthenticated user|192.168.3.20:35322|NULL|Connect| |login|NULL|

解決方案
1. 使用skip-name-resolve指令;
2. 配置一個可訪問的DNS地址,或直接清空DNS配置。

Reference
1. MySQL大量UNAUTHENTICATED USER. 
2. MySQL的DNS查詢關閉.

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.