MySQL DNS查找优化和主机缓存

2018-02-27 10:56:34来源:oschina作者:xzjie人点击

分享

原文:http://www.dev56.com/article/70


MySQL服务器在内存中维护一个包含客户端信息的主机缓存:IP地址,主机名和错误信息。服务器为非本地TCP连接使用此缓存。它不使用高速缓存来建立使用回送接口地址(127.0.0.1或::1)建立的TCP连接,也不使用使用Unix套接字文件,命名管道或共享内存建立的连接。


对于每个新的客户端连接,服务器都使用客户端IP地址来检查客户端主机名是否在主机缓存中。否则,服务器将尝试解析主机名。首先,它将IP地址解析为主机名,并将该主机名解析为IP地址。然后将结果与原始IP地址进行比较,以确保它们相同。服务器将有关此操作结果的信息存储在主机缓存中。如果缓存已满,则丢弃最近最少使用的条目。


在host_cache性能架构表暴露主机缓存,以便它可以使用被检查的内容SELECT 陈述。这可以帮助您诊断连接问题的原因。


服务器像这样处理主机高速缓存中的条目:


当第一个TCP客户端连接从给定IP地址到达服务器时,会创建一个新条目来记录客户端IP,主机名和客户端查找验证标志。最初,主机名称设置为 NULL,标志为false。此条目还用于来自相同始发IP的后续客户端连接。


如果客户端IP条目的验证标志为false,则服务器尝试IP到主机名称的DNS解析。如果成功,则用已解析的主机名更新主机名,并将验证标志设置为true。如果解决不成功,采取的行动取决于错误是永久的还是暂时的。对于永久性故障,主机名保持不变NULL ,验证标志设置为true。对于瞬态故障,主机名和验证标志保持不变。(另一个DNS解析尝试发生在下一次客户端从此IP连接。)


如果在处理来自给定IP地址的传入客户端连接时发生错误,则服务器将更新该IP的条目中的相应错误计数器。


服务器使用线程安全来执行主机名称解析, gethostbyaddr_r()并 gethostbyname_r()在操作系统支持时进行调用。否则,执行查找线程锁定一个互斥体,并呼吁gethostbyaddr()与 gethostbyname()替代。在这种情况下,除非持有互斥锁的线程释放主机名,否则其他线程不能解析主机缓存中的主机名。


服务器使用主机缓存有以下几个目的:


通过缓存IP到主机名称查找的结果,服务器可避免为每个客户端连接执行DNS查找。相反,对于给定的主机,只需要对该主机的第一个连接执行查找。


缓存包含有关在连接过程中发生的错误的信息。有些错误被认为是 “ 阻塞”。“如果连续发生太多这样的事件而没有成功的连接,则服务器将阻止来自该主机的进一步连接。的 max_connect_errors系统变量决定阻挡发生之前允许的错误的数目。


要取消阻止阻止的主机,请通过发出FLUSH HOSTS语句或执行mysqladmin flush-hosts命令来刷新主机缓存 。


即使没有FLUSH HOSTS来自被阻止的主机的上次连接尝试之后发生来自其他主机的活动,被阻止的主机也可能被解除阻塞。发生这种情况的原因可能是服务器放弃了最近最少使用的高速缓存条目,以便在连接从不在高速缓存中的客户端IP到达时,如果高速缓存已满,则为新条目腾出空间。如果丢弃的条目是针对阻止的主机,则该主机变为畅通无阻。


主机缓存默认是启用的。要禁用它,请host_cache_size在服务器启动时或运行时将系统变量设置 为0。


要禁用DNS主机名称查找,请使用该--skip-name-resolve选项启动服务器 。在这种情况下,服务器仅使用IP地址,而不使用主机名将连接主机与MySQL授权表中的行匹配。只能使用这些表中使用IP地址指定的帐户。(请确保存在指定IP地址的帐户,否则您可能无法连接。)


如果您的DNS和主机速度非常慢,则可以通过禁用DNS查找来提高性能,--skip-name-resolve或者通过提高host_cache_size主机缓存的值 来提高性能 。


要完全禁止TCP / IP连接,请使用该--skip-networking选项启动服务器。


某些连接错误与TCP连接无关,在连接过程中(甚至在知道IP地址之前)发生,或者不是特定于任何特定IP地址(如内存不足条件)。有关这些错误的信息,请检查 状态变量。 Connection_errors_xxx


原文:http://www.dev56.com/article/70

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台