MYSQL 高并发情况下的数据库层的熔断方案,避免业务雪崩

读写分离

主库、从库设置后,可用中间件完成对查询、写入的自动分流,对业务系统透明

loose_max_statement_time

用于控制 MYSQL 最长查询时间,如果超过该参数设置的值,那么会自动失败,默认不限制,对业务逻辑复杂的慢查询并发情况下会打垮库造成雪崩,根据业务量大小,主库可设置为180000MS,从库用于中台数据查询不设置。

loose_rds_threads_running_high_watermark

用于控制MySQL并发的查询数目,比如将rds_threads_running_high_watermark的值设置为100,则允许MySQL同时进行的并发查询为100个,超过限制数量的查询将会被拒绝掉,可根据历史日志,查看数据库服务器承载量大小,可设置 100-300 不等。

业务系统友好展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env php
<?php
try{

}catch (Exception $exception) {
if ($exception instanceof Illuminate\Database\QueryException) {
$code = $exception->getCode();
$code_array = array(
'1037' => "当前排队拥挤,请一会再来哦~", //系统内存不足,请重启数据库或重启服务器
'1038' => "当前排队拥挤,请一会再来哦~", //用于排序的内存不足,请增大排序缓冲区
'1040' => "当前排队拥挤,请一会再来哦~", //已到达数据库的最大连接数,请加大数据库可用连接数
'1081' => "当前排队拥挤,请一会再来哦~", //不能建立Socket连接
'1129' => "当前排队拥挤,请一会再来哦~", //数据库出现异常,请重启数据库
'1158' => "当前排队拥挤,请一会再来哦~", //网络错误,出现读错误,请检查网络连接状况
'1159' => "当前排队拥挤,请一会再来哦~", //网络错误,读超时,请检查网络连接状况
'1160' => "当前排队拥挤,请一会再来哦~", //网络错误,出现写错误,请检查网络连接状况
'1161' => "当前排队拥挤,请一会再来哦~", //网络错误,写超时,请检查网络连接状况
'1203' => "当前排队拥挤,请一会再来哦~", //当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
'1226' => "当前排队拥挤,请一会再来哦~", //当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
'1045' => "数据库账号密码错误,请重试", //账号密码错误
);
}
}

K8S Istio GateWay 实现熔断

可设置设置TCP类型的 ServiceEntry ,配置连接池实现流量管理和熔断