關於skip_name_resolve參數的總結分享。本站提示廣大學習愛好者:(關於skip_name_resolve參數的總結分享)文章只能為提供參考,不一定能成為您想要的結果。以下是關於skip_name_resolve參數的總結分享正文
作為MySQL調優的一部門,許多人都推舉開啟skip_name_resolve。這個參數是制止域名解析的(固然,也包含主機名)。許多童鞋會獵奇,這面前的道理是甚麼,甚麼情形下開啟這個參數比擬適合。
基於以下緣由,MySQL辦事端會在內存中保護著一份host信息, 包含三部門:IP,主機名和毛病信息。重要用於非當地TCP銜接。
1. 經由過程在第一次樹立銜接時緩存IP和host name的映照關系,統一主機的後續銜接將直接檢查host cache,而不消再次停止DNS解析。
2. host cache中異樣會包括IP登錄掉敗的毛病信息。可依據這些信息,對這些IP停止響應的限制。前面將會詳細提到。
host cache的信息可經由過程performance_schema中host_cache表檢查。
那末,IP和host name的映照關系是若何樹立的呢?
1. 當有一個新的客戶端銜接出去時,MySQL Server會為這個IP在host cache中樹立一個新的記載,包含IP,主機名和client lookup validation flag,分離對應host_cache表中的IP,HOST和HOST_VALIDATED這三列。第一次樹立銜接由於只要IP,沒有主機名,所以HOST將設置為NULL,HOST_VALIDATED將設置為FALSE。
2. MySQL Server檢測HOST_VALIDATED的值,假如為FALSE,它會試圖停止DNS解析,假如解析勝利,它將更新HOST的值為主機名,並將HOST_VALIDATED值設為TRUE。假如沒有解析勝利,斷定掉敗的緣由是永遠的照樣暫時的,假如是永遠的,則HOST的值照舊為NULL,且將HOST_VALIDATED的值設置為TRUE,後續銜接不再停止解析,假如該緣由是暫時的,則HOST_VALIDATED照舊為FALSE,後續銜接會再次停止DNS解析。
另,解析勝利的標記其實不只是經由過程IP,獲得到主機名便可,這只是個中一步,還有一步是經由過程解析後的主機名來反向解析為IP,斷定該IP能否與原IP雷同,假如雷同,才斷定為解析勝利,能力更新host cache中的信息。
基於下面的總結,上面談談 host cache的優缺陷:
缺陷:當有一個新的客戶端銜接出去時,MySQL Server都要樹立一個新的記載,假如DNS解析很慢,無疑會影響機能。假如被許可拜訪的主機許多,也會影響機能,這個與host_cache_size有關,這個參數是5.6.5引入的。5.6.8之前默許是128,5.6.8以後默許是-1,基於max_connections的值靜態調劑。所以假如被許可拜訪的主機許多,基於LRU算法,先前樹立的銜接能夠會被擠失落,這些主機從新出去時,會再次停止DNS查詢。
長處:平日情形下,主機名是不變的,而IP是多變的。假如一個客戶真個IP常常變更,那基於IP的受權將是一個繁瑣的進程。由於你很難肯定IP甚麼時刻變更。而基於主機名,只需一次受權。並且,基於host cache中的掉敗信息,可在必定水平上阻攔外界的暴力破解進擊。
關於阻攔外界的暴力破解進擊,觸及到max_connect_errors參數,默許為100,官方的說明以下:
If more than this many successive connection requests from a host are interrupted without a successful connection, the server blocks that host from further connections.假如某個客戶真個銜接到達了max_connect_errors的限制,將被制止拜訪,並提醒以下毛病:
Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
上面來模仿一下
起首,設置max_connect_errors的值
mysql> show variables like 'max_connect_errors'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | max_connect_errors | 100 | +--------------------+-------+ row in set (0.00 sec) mysql> set global max_connect_errors=2; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'max_connect_errors'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | max_connect_errors | 2 | +--------------------+-------+ row in set (0.00 sec)
經由過程telnet模仿interrupted without a successful connection。
[root@mysql-slave1 ~]# telnet 192.168.244.145 3306 Trying 192.168.244.145... Connected to 192.168.244.145. Escape character is '^]'. N 5.6.26-log K]qA1nYT!w|+ZhxF1c#|kmysql_native_password ^] !#08S01Got packets out of orderConnection closed by foreign host. [root@mysql-slave1 ~]# telnet 192.168.244.145 3306 Trying 192.168.244.145... Connected to 192.168.244.145. Escape character is '^]'. N Y#>PVB(>!Bl}NKnjIj]sMmysql_native_password ^] !#08S01Got packets out of orderConnection closed by foreign host. [root@mysql-slave1 ~]# mysql -h192.168.244.145 -uroot -p123456 Warning: Using a password on the command line interface can be insecure. ERROR 1129 (HY000): Host '192.168.244.144' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
即使後來應用了准確的賬號和暗碼登錄,照舊會被阻攔。
再來看看host_cache表中的信息,sum_connect_errors為2了。
mysql> select ip,host,host_validated,sum_connect_errors,count_authentication_errors from performance_schema.host_cache; +-----------------+------+----------------+--------------------+-----------------------------+ | ip | host | host_validated | sum_connect_errors | count_authentication_errors | +-----------------+------+----------------+--------------------+-----------------------------+ | 192.168.244.144 | NULL | YES | 2 | 0 | +-----------------+------+----------------+--------------------+-----------------------------+ row in set (0.00 sec)
該阻攔會一向失效,直到采用以下操作:
1. mysql> flush hosts;
2. # mysqladmin flush-hosts
3. truncate table performance_schema.host_cache;
4. 或許期待該記載從host cache中被擠失落。
假如要制止DNS解析,可設置skip_name_resolve參數,如許,mysql.user表中基於主機名的受權將沒法應用,且毛病日記中會提醒:
[Warning] 'user' entry 'root@mysql-slave1' ignored in --skip-name-resolve mode.
這裡,經由過程mysql-slave1拜訪,將會謝絕拜訪
[root@mysql-slave1 ~]# mysql -h192.168.244.145 -uroot -p123 Warning: Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'192.168.244.144' (using password: YES)
host cache是默許開啟的,假如要禁失落,可將host_cache_size設置為0,該參數是個靜態參數,可在線修正。
假如要完整禁失落TCP/IP銜接,可在MySQL啟動時,設置skip-networking參數。
總結:
1. 從道理上看,DNS解析普通只針對客戶真個第一次銜接,客戶端數據量比擬小的情形下,開支其實不年夜,完整不用啟動skip_name_resolve參數,帶來的利益就是,為客戶端和多變的IP直接解耦,只需對主機名停止一次受權。
2. 在沒開啟skip_name_resolve情形下,不管是經由過程# mysql -p123456 走socket銜接照樣# mysql -p123456 -h127.0.0.1走TCP銜接,顯示的用戶都是root@localhost。假如要顯示[email protected],必需開啟skip_name_resolve參數。
另,可經由過程\s檢查以後銜接應用的是socket照樣TCP。
以上這篇關於skip_name_resolve參數的總結分享就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。