MySQLのホストキャッシュ

MySQL 5.5ホストキャッシュに関するメモ。

詳細は以下ドキュメントに全て書いてある。(英文)

シーケンス

  • 新しいクライアントから接続があると、サーバはそのIPアドレスからホスト名がホストキャッシュにあるかチェックする。
  • 無ければ、サーバはホスト名を解決することを試みる。
  • まず、IPアドレスからホスト名をチェックし、そしてホスト名からIPアドレスをチェックする。で、その結果をオリジナルのIPアドレスと比較し、同じであることを確認した後、ホストキャッシュに格納する。
  • キャッシュが一杯の場合は、最も長い時間使われていないエントリが破棄される。

名前解決

  • OSがサポートしている場合、スレッドセーフな gethostbyaddr_r() や gethostbyname_r() をコールする。
  • そうでなければ、MUTEXをロックして、代わりに gethostbyaddr() や gethostbyname() をコールする。
  • この場合、MUTEXロックが解放されるまで、他のスレッドはホストキャッシュにないホスト名の名前解決ができない。

利用目的

  • キャッシュを使うことで、サーバは各クライアントから接続がある度にDNS参照を行わなくなる。(初回の接続時にDNS参照する。)
  • キャッシュは接続中に生じたエラーの情報を含んでいる。このいくつかのエラーは"blocking"であり、サーバは接続エラーが多く発生したホストからの接続を拒む。これらは max_connect_errors のパラメータで許容するエラーの数を調整できる。詳しくはこちら「MySQL :: MySQL 5.5 Reference Manual :: B.6.2.6 Host 'host_name' is blocked

ホストキャッシュのフラッシュ

  • ブロックされたホストを解除するには、 FLUSH HOSTS ステートメントを発行するか、 mysqladmin flush-hosts コマンドを実行することで、ホストキャッシュをフラッシュすることができる。
  • キャッシュ内に情報が存在しないホスト(クライアントIP)からの接続があった際、キャッシュが一杯(Full)の場合は、最も古い(未使用時間が最も長い)ホストのキャッシュエントリが廃棄される。
  • もし古いキャッシュエントリがブロックされたホストだった場合、そのホストはキャッシュから消えているのでアンブロック扱いとなる。

ホストキャッシュの有効/無効

  • ホストキャッシュはデフォルトで有効となっている。
  • 無効にしたい場合は、サーバの起動時に --skip-host-cache オプションを付ける。

その他パフォーマンス等

  • ホスト解決のためのDNS参照を無効にしたい場合は、サーバの起動時に --skip-name-resolve オプションを付ける。この場合、サーバは接続ホストの判別を、ホスト名ではなくIPアドレスだけを使用する。
  • もし、多くのホストとすげー遅いDNSを持っている場合、DNS参照を無効にするか、"HOST_CACHE_SIZE"の定義値を増やす(デフォルトは128、変更時はリコンパイルが必要)ことでパフォーマンスが改善するかもしれない。
  • 完全にTCP/IP接続を許可しない場合は、サーバの起動時に --skip-networking オプションを付ける。


以上。それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版