如何解决数据库负载过大的问题

如何解决数据库负载过大的问题,第1张

市面上存在两种数据库负载均衡的思路:1. 基于数据库连接的负载均衡:例如总共有100个数据库连接,50个连接登录到数据库机器A,另外50个连接登录到数据库机器B,这样每个连接中接下来的所有请求全都是发往同一台数据库机器的。 这种数据库负载均衡的思路模拟了WEB上的负载均衡方法,但是由于WEB连接是短时间连接(连接建立后,获取需要的HTML等资源后,连接马上被关闭),而数据库连接是长时间连接( 连接建立后,可长时间保持,客户可不停向数据库发送SQL请求,数据库做出回答,如此不断循环直到连接被人为或因错而断开为止),因此这种数据库负载均衡思路存在着明显的缺点:有可能会发生绝大部分的请求压力都集中到某台数据库机器上去,从而使得负载均衡效果失效。2.基于批处理请求的负载均衡:在建立数据库连接的时候,会同时与每台数据库服务器建立连接,之后针对客户端的每次请求,都会根据负载均衡算法,独立地选出某个数据库节点来执行这个请求。此种思路符合数据库长时间连接的特征,不存在上面所述的基于连接的负载均衡方法的缺点。市面上的负载均衡厂商,既有基于连接的,也有基于批处理请求的,用户需仔细辨别才能找到自己想要的合适产品。

有可能两个办法.

第一先限制Innodb的并发处理.如果innodb_thread_concurrency = 0 可以先改成 16或是64 看机器压力,如果

非常大,先改成16让机器的压力下来,然后慢慢增达,适应自已的业务.

处理方法: set global innodb_thread_concurrency=16

第二: 对于连接数已经超过600或是更多的情况,可以考虑适当的限制一下连接数,让前端报一下错,也别让DB挂了.

DB在了,总是可以用来加载一下数据,当数据加载到了nosql里了,慢慢的DB压力也会降下来的.

限制单用户连接数在500以下. 如:

set global max_user_connections=500

(MySQL随着连接数的增加性能会是下降的,这也是thread_pool出现的原因)

另外对于有的监控程序会读取information_schema下面的表的程序可以考虑关闭下面的参数

innodb_stats_on_metadata=0

set global innodb_stats_on_metadata=0

这个参数主要防止对读取information_schema时造成大量读取磁盘进行信息统计(如果慢查询中出现关于information_schema中表时,也可以考虑禁用该参数)

处理依据:

当学校的一个食堂一分钟只能为两个打饭, 忽然来了100个时人来打饭,又没排队, 不出会现了打饭的师傅要用点时间

去选择为那个用户服务了, 人越多,场面就越乱, 难免出现用户大吼该他的场面, 最后有可能就出现不是打饭了,而时之间相互

打架了,打饭的师傅也将收到同时有90个以上的Server too busy. 如果能排一下队.最多也就50分钟能处理完了.

以前办法,应该可以让MySQLD不会挂掉.如果业务支撑受到限制,还是想办法处理一下.

数据库rac的负载情况需要观察 *** 作系统的资源使用状态,如top,vmstat,topas等。并且需要查看数据库的性能报告awr,ash等。当前连接用户数可以通过gv$session来查看。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10648115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存