8.11.5.2 DNS 조회 최적화 및 호스트 캐시
MySQL 서버는 클라이언트에 대한 정보 (IP 주소, 호스트 이름, 오류 정보)를 포함하는 호스트 캐시를 메모리에 유지합니다. 서버는이 캐시를 비 로컬 TCP 연결에 사용합니다. 그것은 루프백 인터페이스 주소 ( 127.0.0.1
또는 ::1
)을 사용하여 확립 된 TCP 연결 또는 Unix 소켓 파일 명명 된 파이프 또는 공유 메모리를 사용하여 확립 된 연결은 캐시를 사용하지 않습니다.
새로운 클라이언트 접속마다 서버는 클라이언트 IP 주소를 사용하여 클라이언트 호스트 이름이 호스트 캐시에 있는지 여부를 확인합니다. 없으면 서버는 호스트 이름 확인을 시도합니다. 첫째, IP 주소를 호스트 이름으로 확인하고 호스트 이름을 다시 IP 주소를 확인합니다. 다음은 그 결과와 원래의 IP 주소를 비교하여 그들이 동일한 지 확인합니다. 서버는이 작업 결과에 대한 정보를 호스트 캐시에 저장합니다. 캐시가 가득 찬 경우 가장 최근에 사용되지 않은 항목이 삭제됩니다.
host_cache
성능 스키마 테이블은 SELECT
문을 사용하여 조사 할 수 있도록 호스트 캐시의 내용을 공개합니다. 이것은 연결 문제의 원인 진단에 도움이 될 수 있습니다. 섹션 22.9.10.1 "host_cache 테이블" 을 참조하십시오.
서버는 다음과 같이 호스트 캐시의 항목을 처리합니다.
첫 번째 TCP 클라이언트 연결이 지정된 IP 주소에서 서버에 도달하면 클라이언트 IP 호스트 이름 및 클라이언트 조회 검증 플래그를 기록하는 새로운 항목이 생성됩니다. 먼저 호스트 이름이
NULL
로 설정된 플래그는 false입니다. 이 항목은 동일한 원본 IP에서 후속 클라이언트 연결에 사용됩니다.클라이언트 IP 항목의 검증 플래그가 false의 경우, 서버는 IP 호스트 이름에 대한 DNS의 해결을 시도합니다. 그것이 성공하면 호스트 이름이 해결 된 호스트 이름으로 업데이트되고 검증 플래그가 true로 설정됩니다. 해결이 성공하지 않으면 취한 조치는 오류가 영구적 또는 일시적 따라 다릅니다. 영구적 인 오류의 경우 호스트 이름은
NULL
로 남아 검증이 true로 설정됩니다. 일시적인 오류의 경우 호스트 이름 및 검증 플래그는 변경되지 않은 상태입니다. (다음에 클라이언트가이 IP를 사용했을 때는 다른 DNS 해결의 시도가 이루어집니다.)특정 IP 주소에서 들어오는 클라이언트 연결을 처리하는 동안 오류가 발생하면 서버는 IP 항목에서 해당 오류 카운터를 업데이트합니다. 기록 된 오류에 대한 설명은 섹션 22.9.10.1 "host_cache 테이블" 을 참조하십시오.
운영 체제로 thread 세이프 인 gethostbyaddr_r()
및 gethostbyname_r()
호출을 지원하는 경우 서버는 그들을 사용하여 호스트 이름 확인을 수행합니다. 그렇지 않은 경우 조회를 실행하는 스레드는 상호 배타적 잠금을 실행하고 대신 gethostbyaddr()
과 gethostbyname()
를 호출합니다. 이 경우 상호 배타적 잠금을 보유하는 스레드가 그것을 해제 할 때까지 다른 스레드는 호스트 캐시에없는 호스트 이름을 확인할 수 없습니다.
서버는 어떤 목적으로 호스트 캐시를 사용합니다.
IP와 호스트 이름 조회 결과를 캐시하면 서버는 클라이언트 연결 당 DNS 조회 실행을 방지합니다. 대신 특정 호스트에 대한 호스트에서의 초기 연결에서만 조회를 실행해야합니다.
캐시는 연결 과정에서 발생한 오류에 대한 정보가 포함됩니다. 일부 오류는 "차단"으로 간주됩니다. 성공적인 연결이없는 특정 호스트에서 이러한 많은이 연속해서 발생하는 경우 서버는 호스트에서 그 연결을 차단합니다.
max_connect_errors
시스템 변수는 블록 될 때까지 허용되는 오류의 수를 지정합니다. 섹션 B.5.2.6 '호스트'host_name '거부되었습니다 " 를 참조하십시오.
차단 된 호스트의 차단을 해제하려면 FLUSH HOSTS
명령문을 실행하거나 mysqladmin flush-hosts 명령을 실행하여 호스트 캐시를 플러시합니다.
차단 된 호스트에서의 마지막 연결 시도 이후 다른 호스트에서의 활동이 발생했을 경우, FLUSH HOSTS
를 사용하지 않아도 차단 된 호스트의 차단을 해제 할 수 있습니다. 이것은 캐시에없는 클라이언트 IP에서 연결이 도착했을 때 캐시가 가득 인 경우, 서버가 최근에 사용되지 않은 캐시 항목을 삭제하고 새 항목을위한 공간을 만들기 위해 발생 할 수 있습니다. 삭제 된 항목이 차단 된 호스트 인 경우 호스트 차단을 해제됩니다.
호스트 캐시는 기본적으로 활성화되어 있습니다. 그것을 해제하려면 서버를 시작하고 실행할 때 host_cache_size
시스템 변수를 0으로 설정합니다.
DNS 호스트 이름 조회를 해제하려면 --skip-name-resolve
옵션으로 서버를 시작합니다. 이 경우 서버는 IP 주소 만 사용하고 호스트 이름을 사용하지 않고 연결된 호스트를 MySQL 부여 테이블의 행과 일치합니다. IP 주소를 사용하여 해당 테이블에 지정된 계정 만 사용할 수 있습니다.
현저하게 느린 DNS와 많은 호스트가있는 경우, --skip-name-resolve
에서 DNS 조회를 비활성화하거나 host_cache_size
값을 늘려 호스트 캐시를 크게함으로써 성능을 향상시킬 수 있습니다.
TCP / IP 연결을 완전히 금지하려면 --skip-networking
옵션으로 서버를 시작합니다.
일부 연결 오류는 TCP 연결과 연관된 않거나 연결 프로세스의 매우 초기에 (IP 주소도 발견하기 전에) 발생하거나 특정 IP 주소에 특정 없습니다 (메모리 부족 상황 등). 이러한 오류는 Connection_errors_
상태 변수를 확인하십시오 ( 섹션 5.1.6 "서버 상태 변수" 를 참조하십시오). xxx