首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL DNS 解析機制深度解析:主機名緩存、線程安全與性能優化

     編輯:MySQL 資料庫相關知識

連接建立時的 DNS 解析流程

  1. 客戶端發起 TCP 連接,mysqld 接受後創建新線程處理。
  2. 線程檢查 Host Cache(主機名緩存):
     - 命中 → 直接獲取 IP/主機名映射,跳過解析。
     - 未命中 → 執行 DNS 解析。
  3. DNS 解析調用鏈:
     - 線程安全系統(glibc 2.2+):調用 gethostbyaddr_r() / gethostbyname_r()(可重入版本),無全局鎖爭用。
     - 非線程安全系統:線程鎖定全局 mutex → 調用 gethostbyaddr() / gethostbyname() → 解鎖。此期間其他線程無法解析新主機名,嚴重影響併發。
  4. 解析結果寫入 Host Cache,後續連接復用。

關鍵配置參數

參數作用建議值
skip-name-resolve完全禁用 DNS 反向解析,授權表只能用 IP生產環境 強烈建議開啟
skip-host-cache禁用主機名緩存,每次連接必做 DNS 查詢排查 DNS 故障時臨時開啟
host_cache_size緩存條目上限(默認 128,5.6+ 可動態調整)高併發建議 512~2048
skip-networking禁用 TCP/IP,僅允許 Unix Socket 本地連接極致安全/單機場景

性能優化實戰

1. 開啟 skip-name-resolve(最高收益)

[mysqld]
skip-name-resolve
  • 省去每次連接的 PTR 反向查詢(通常 10~200 ms)。
  • 授權表 mysql.user 的 Host 列必須填 IP 或 %,不再支持主機名。

2. 擴大 host_cache_size

[mysqld]
host_cache_size=1024

適用於「無法開啟 skip-name-resolve」(如老應用依賴主機名授權)且連接來源 IP 種類較多的場景。

3. 手動清理緩存

FLUSH HOSTS;
-- 或
mysqladmin flush-hosts

場景:DNS 記錄變更、客戶端 IP 漂移導致緩存污染、Host 'xxx' is blocked because of many connection errors 報錯。

故障排查清單

  • show variables like 'host_cache_size'; 確認生效值。
  • show status like 'Aborted_connects'; 快速增長通常意味著 DNS 解析超時或認證失敗。
  • performance_schema.host_cache (5.7+) 可直接查看緩存條目、解析耗時、錯誤計數。
  • 操作系統層面:/etc/resolv.conf nameserver 可達性、/etc/nsswitch.conf hosts 順序(files dns 優先本地 hosts 文件)。

總結

MySQL DNS 解析是「隱形性能殺手」。生產環境首選 skip-name-resolve + IP 授權;若業務強依賴主機名,則調大 host_cache_size 並確保底層 DNS 服務高可用、低延遲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved