• MySQL 连接数相关参数设置


    当我们的数据库服务器遇到如下的错误:ERROR: Too many connections

    一种可能性就是我们的压力确实很大,需要增加服务器硬件资源或者增加数据库服务器。但是大多数情况下是我们的连接数配置不合理造成的。

    在MySQL中,有如下几个参数是和连接数配置相关的:

    Max_connections

    Max_used_connections

    Connections

    Max_user_connections

    Back_log

    Max_connect_errors

    接下来我们逐一来分析这些参数的意义:

    Max_connections:

    是指整个数据库服务器所允许的最大连接数,可使用以下命令进行查询:

    Show variables like ‘max_connections’;

     

    在Windows平台该数值一般默认为151,如果超过该数值,由于限制那么系统就会产生等待的情况,从而影响系统的并发量和吞吐量。

    通常情况下,我们会根据服务器的性能适当的调整一个合适的值,比如500-800,但是要注意该数值的最大值为16384,请不要超过这个值。

    由于数据库会为每个连接,分配一定内存资源和缓冲区,通常为每个连接分配256KB资源,所以设置要慎重一些,建议不要超过实际用户的1.5倍。

    在我们评估最大连接数数值的时候,我们可以使用以下的一些命令,来查看一下历史数据,提供参考数据:

    Show global status like ‘max_used_connection’;

     

    这个命令用于查询,服务器自启动以来运行期间的最大连接数。

    show global status like 'Connections';

    这个命令可以查询服务器自启动以来的连接数的总数,这是一个累计值,可以查看数据库连接的频率。

    通过检测这些数据,我们就能得到是否需要增加Max_connections的证据。

    如果max_used_connections 已经等于或者接近Max_connections,那么我们就需要增加数据库的最大值。

    按照通用的20/80法则,我们建议留有20%的连接数用于系统备用,即Max_used_connections/Max_connections *100% < 80%。

    按照经验,我们会留比较大的连接数,比如留50%的连接数用于备用。

    Max_user_connections

    是指对每个用户允许的最大连接数。

    一般情况下我们都会让其保持默认值,除非有特定的需要或者临时性的用户,我们才做出限制。

    该参数会限制单个用户的最大连接值,通常是对单用户并发用户进行限制。

    Back_log

    show variables like 'back_log';

     

    该参数是用来缓存用户连接的,相当于一个排队的连接池。

    在数据库达到最大连接数的时候,新的连接请求会被存放在堆栈中,并等待其他连接释放资源。

    如果等待的连接数超过这个值,那么新的连接将不会被接受。

    这个数值不能超过系统的TCP/IP连接的监听队列数,否则无效。

    Linux系统我们推荐设置为小于512的整数。

    注意每个队列会消耗256kb的内存资源。

    Max_connect_errors

    show variables like 'max_connect_errors';

     

    该参数是指,当连接的错误数达到这个阈值的时候,系统会终止用户的连接服务。

    需要使用flush hosts来清除错误,否则就会报错:

    Host *** is blocked because of many connection errors.Unblock with ‘mysqladmin flush-hosts’.

    当数据库达到这个阈值的时候,数据库认定系统出现了一个错误,并且会阻止该用户后续的请求操作,除非使用命令刷新系统。

    如果是内网环境,建议可以将数值设置的高一点,并使用任务机制定期刷新hosts。

    Connect_timeout

    show variables like '%connect_timeout%';

     

    指定MySQL服务等待应答的时间,如果超时那么客户端会返回一个错误,bad handshake。

    在Windows环境下默认值为10秒。

    如果是局域网或者高并发的环境下,可以适当提高该数值,比如15-20 秒,以避免出现连接错误。

    建议该数值要结合thread_cache_size建议适当提高该数值,以便提高更多的连接数。

    Skip_name_resolve

    show variables like '%skip_name_resolve%';

     

    该设置是用于提高数据库服务器的连接速度。

    MySQL在获得连接请求的时候,会根据请求中的IP地址,来反向查询服务器的主机名,然后再次获取该服务器的IP地址。

    如果两次获取的IP地址一致,那么才会建立连接。

    按照这种设计,一次连接会耗费较长的时间,主要是一种安全上的验证。

    但是我们不推荐在广域网环境下,打开这个设置,以防止黑客的攻击。

  • 相关阅读:
    Cg:访问OpenGL的状态
    C++ Exception Handling
    C语言的调用规约(Calling Convension)之参数传递和返回值
    Why is FBX readonly in animation editor when imported?
    如何在Visual Studio中编译wxWidgets
    ICU字符集编码转换一例
    VisTools
    关于数值分析和LCP问题的一些开源项目
    C++: The Case Against Global Variables
    老男孩筷子兄弟
  • 原文地址:https://www.cnblogs.com/wanghao4023030/p/8708222.html
Copyright © 2020-2023  润新知