skip_についてname_resolveパラメータのまとめ

8725 ワード

MySQLチューニングの一部としてskipを開くことをお勧めする人が多いです.name_resolve.このパラメータはドメイン名解析を禁止します(もちろん、ホスト名も含まれます).多くの子供靴は、この背後の原理が何なのか、どのような場合にこのパラメータを開くのが適切なのか知りたいと思っています.
 
以下の理由に基づいて、MySQLサービス側は、IP、ホスト名、エラー情報の3つの部分を含むhost情報をメモリに維持します.主に非ローカルTCP接続に使用されます.
1.最初の接続時にIPとhost nameのマッピング関係をキャッシュすることによって、同じホストの後続の接続は、DNS解析を再度行わずにhost cacheを直接表示します.
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_VALLIDATEDの3列です.最初の接続はIPのみでホスト名がないため、HOSTはNULL、HOST_に設定されます.VALLIDATEDはFALSEに設定されます.
2.MySQL Server検出HOST_VALLIDATEDの値はFALSEの場合DNS解析を試み、解析に成功するとホスト名のHOSTの値が更新され、HOST_VALLIDATED値はTRUEとする.解析に成功しなかった場合、失敗の原因が永続的であるか一時的であるかを判断し、永続的であればHOSTの値はNULLのままであり、HOST_VALLIDATEDの値はTRUEに設定され、その後の接続は解析されなくなり、その理由が一時的であればHOST_VALLIDATEDは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がいつ変化するかを特定するのは難しいからです.ホスト名に基づいて、1回のライセンスしか必要ありません.また、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   |
+--------------------+-------+
1 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     |
+--------------------+-------+
1 row in set (0.00 sec)

インターネットシミュレーションinterrupted without a successful connectionをtelnetでシミュレートします.
[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'

その後、正しいアカウントとパスワードを使ってログインしても、ブロックされます.
ホストを見てみましょう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 |
+-----------------+------+----------------+--------------------+-----------------------------+
1 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_パラメータ、これでmysql.userテーブルのホスト名ベースの権限は使用できません.エラー・ログには次のプロンプトが表示されます.
[Warning] 'user' entry 'root@mysql-slave1' ignored in --skip-name-resolve mode.

ここでmysql-slave 1でアクセスすると、アクセスが拒否されます
[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-p 123456を介してsocket接続を行うか、それとも#mysql-p 123456-h 127を歩くかにかかわらず.0.0.1 TCP接続を行って、表示するユーザーはすべてroot@localhost.表示する場合[email protected]、skip_をオンにする必要がありますname_resolveパラメータ.
また、現在の接続でsocketが使用されているかTCPが使用されているかをsで確認できます.
 
参照先:
1. http://www.tuicool.com/articles/7R7BRb
2. http://dev.mysql.com/doc/refman/5.7/en/host-cache.html
3. http://dev.mysql.com/doc/refman/5.7/en/blocked-host.html