返回官网

PHP+mysql的熔断机制 pt-kill

狒狒 2019-11-11 技术札记 1130 次
纯PHP + MYSQL的项目如何应对数据库雪崩?
数据库中间件处理
我想绝大用PHP + MYSQL的中小公司是没有MYSQL中间件的,有中间件的可以在数据库中间件处理
有用Swoole写MYSQL中间件的案例
缓存要顶用
设计好Redis机制,最小量的请求落在MYSQL上
用MySQL Query Rewrite Plugin 进行SQL语句重写
MySQL · 5.7新特性 · Query Rewrite Plugin
用pt-kill自动杀掉过长的慢查询
pt-kill是Percona-Toolkit系列之一,Percona公司出品的工具都没用过,绝对有相见恨晚的感觉。
pt-kill杀掉慢查询,这算是一个简单粗暴的“熔断方案”,都已经到了让数据库雪崩的阶段,与其业务都不可用,还不如有损服务。
需要注意的是只结束从库的SELECT慢查询
直接上手,pt-kill常驻进程自动结束SQL慢查询实例
以下实例作用是
* 127.0.0.1这台msyql实例上
* 字符集指定为 utf8
* 查询中有关键字 “SELECT|select” (支持正则)
* mysql帐号是 “业务mysql帐号”
* 查询时间大于60秒
* kill掉查询,不kill mysql连接
* 表示从匹配的结果中选择,类似SQL中的where部分,all是全部的查询
* 10秒检查一次
* 日志记录位置
* 打印日志
* 守护进程的方式运行

pt-kill \
--host 127.0.0.1 --port 3306 --user 'root' --password 'password' \
--charset utf8 \
--match-info "SELECT|select" \
--match-user 业务mysql帐号 \
--busy-time 60 \
--kill-query \
--victims all \
--interval 10 \
--log=/var/log/mysql-pt-kill.log \
--print \
--daemonize

 
pt-kill \
--host 127.0.0.1 --port 3306 --user 'root' --password 'password' \
--charset utf8 \
--match-info "SELECT|select" \
--match-user 业务mysql帐号 \
--busy-time 60 \
--kill-query \
--victims all \
--interval 10 \
--log=/var/log/mysql-pt-kill.log \
--print \
--daemonize
 
常用参数说明
host 连接数据库的地址
port 连接数据库的端口
user 连接数据库的用户名
passowrd 连接数据库的密码
charset 指定字符集
match-command 指定杀死的查询类型
match-user 指定杀死的用户名,即杀死该用户的查询
match-info 匹配查询的信息
busy-time 指定杀死超过多少秒的查询
kill 执行kill命令
kill-query 与kill匹配查询的连接不同,此选项只会kill查询,而不会杀死连接
victims 表示从匹配的结果中选择,类似SQL中的where部分,all是全部的查询
interal 每隔多少秒检查一次
print 把kill的查询打印出来
log 输出日志到文件仅在 daemonize 守护进程的时候
daemonize 守护进程(常驻进程)
更多参考官方pt-kill手册
监控多个mysql
如果多个mysql都需要用pt-kill监控慢查询并干掉,那么运行多个即可

/usr/bin/pt-kill \
--host 10.10.0.1 \
--port 3306 \
--user ptkill \ 
--password ptkill账号密码 \
--charset utf8 \
--match-info 'SELECT|select' \ 
--match-user 业务mysql帐号 \
--busy-time 20 \
--victims all \
--interval 10 \
--log=/var/log/pt-kill-mysql-slave1.log \
--pid=/var/run/pt-kill-mysql-slave1.pid \
--kill \
--print \ 
--daemonize

/usr/bin/pt-kill \
--host 10.10.0.2 \
--port 3306 \
--user ptkill \ 
--password ptkill账号密码 \
--charset utf8 \
--match-info 'SELECT|select' \ 
--match-user 业务mysql帐号 \
--busy-time 20 \
--victims all \
--interval 10 \
--log=/var/log/pt-kill-mysql-slave2.log \
--pid=/var/run/pt-kill-mysql-slave2.pid \
--kill \
--print \ 
--daemonize

 
/usr/bin/pt-kill \
--host 10.10.0.1 \
--port 3306 \
--user ptkill \ 
--password ptkill账号密码 \
--charset utf8 \
--match-info 'SELECT|select' \ 
--match-user 业务mysql帐号 \
--busy-time 20 \
--victims all \
--interval 10 \
--log=/var/log/pt-kill-mysql-slave1.log \
--pid=/var/run/pt-kill-mysql-slave1.pid \
--kill \
--print \ 
--daemonize
 
/usr/bin/pt-kill \
--host 10.10.0.2 \
--port 3306 \
--user ptkill \ 
--password ptkill账号密码 \
--charset utf8 \
--match-info 'SELECT|select' \ 
--match-user 业务mysql帐号 \
--busy-time 20 \
--victims all \
--interval 10 \
--log=/var/log/pt-kill-mysql-slave2.log \
--pid=/var/run/pt-kill-mysql-slave2.pid \
--kill \
--print \ 
--daemonize
 
pt-kill守护进程
虽然pt-kill自带参数daemonize可以后台守护运行,但是很多时候会莫名其妙的进程挂掉,
那么还需要一个外部的进程守护工具来守护他,在pt-kill自动退出后再次把进程拉起来
这里进程守护工具我们使用 Monit
配置文件参考为

#pt-kill-mysql 从库1守护
check process pt-kill-mysql-slave1 with pidfile /var/run/pt-kill-mysql-slave1.pid
   start program  "/usr/bin/pt-kill --host 10.10.0.1 --port 3306 --user ptkill --password ptkill账号密码 --charset utf8 --match-info 'SELECT|select' --match-user 业务mysql帐号 --busy-time 20 --victims all --interval 10 --log=/var/log/pt-kill-mysql-slave1.log --kill --print --pid=/var/run/pt-kill-mysql-slave1.pid --daemonize"
   stop program  "kill `cat /var/run/pt-kill-mysql-slave1.pid`"
   if changed pid then start

#pt-kill-mysql 从库2守护
check process pt-kill-mysql-slave2 with pidfile /var/run/pt-kill-mysql-slave2.pid
   start program "/usr/bin/pt-kill --host 10.10.0.2 --port 3306 --user ptkill --password ptkill账号密码 --charset utf8 --match-info 'SELECT|select' --match-user 业务mysql帐号 --busy-time 20 --victims all --interval 10 --log=/var/log/pt-kill-mysql-slave2.log --kill --print --pid=/var/run/pt-kill-mysql-slave2.pid --daemonize"
   stop program  "kill `cat /var/run/pt-kill-mysql-slave2.pid`"
   if changed pid then start


 
#pt-kill-mysql 从库1守护
check process pt-kill-mysql-slave1 with pidfile /var/run/pt-kill-mysql-slave1.pid
   start program  "/usr/bin/pt-kill --host 10.10.0.1 --port 3306 --user ptkill --password ptkill账号密码 --charset utf8 --match-info 'SELECT|select' --match-user 业务mysql帐号 --busy-time 20 --victims all --interval 10 --log=/var/log/pt-kill-mysql-slave1.log --kill --print --pid=/var/run/pt-kill-mysql-slave1.pid --daemonize"
   stop program  "kill `cat /var/run/pt-kill-mysql-slave1.pid`"
   if changed pid then start
 
#pt-kill-mysql 从库2守护
check process pt-kill-mysql-slave2 with pidfile /var/run/pt-kill-mysql-slave2.pid
   start program "/usr/bin/pt-kill --host 10.10.0.2 --port 3306 --user ptkill --password ptkill账号密码 --charset utf8 --match-info 'SELECT|select' --match-user 业务mysql帐号 --busy-time 20 --victims all --interval 10 --log=/var/log/pt-kill-mysql-slave2.log --kill --print --pid=/var/run/pt-kill-mysql-slave2.pid --daemonize"
   stop program  "kill `cat /var/run/pt-kill-mysql-slave2.pid`"
   if changed pid then start

发表评论

Copyright © 2016 DEWEBSTUDIO