pt-heartbeat+zabbix监控mysql主从延时
前言
传统上,大家查看和监控mysql的主从延时都是通过执行show slave status命令来观察Slave_IO_Running和Slave_SQL_Running这两个线程的运行情况.以及Seconds_Behind_Master参数值来判断从库同步是否有延时.
但是.这些参数其实上并不准确.
笔者在实际工作就遇到这个问题.这个故障也很好复现.当master主库的mysql服务重启后(从库不做任何操作),这个时候从库的所有参数都是正常的.Seconds_Behind_Master参数的值也是0.但是实际上从库没有同步任何数据直到手动执行start slave命令
幸好,percona提供了一整套的维护mysql的工具箱.percona toolkit.其中就有一款pt-heartbeat工具用来监控主从复制的延时情况.
除此之外,toolkit还包含各种方便我们维护mysql的工具.关于percona的toolkit工具大家可以访问官网详细了解:percona toolkit
简介
此章主要介绍pt-heartbeat工具.包含以下几个方面:
- pt-heartbeat介绍
- pt-heartbeat安装
- pt-heartbeat前提条件
- pt-heartbeat使用
- 大并发写入的情况下,延时监控
- 生产上使用pt-heartbeat优化
- zabbix+pt-heartbeat监控主从同步延时
概述
pt-heartbeat在主库上创建一个heartbeat表,然后定期(默认1s)持续更新时间戳,
然后在从库上读取被更新的时间戳后与本地系统时间对比来得出其延迟。
所以使用heartbeat要满足2个前提:
1.主从库都需要安装pt-heartbeat工具
2.主从库的时间要保持一致.否则会出现偏差
关于官网的介绍可以参考:pt-heartbeat
测试环境:
master库: centos7 IP地址:10.0.4.230
slave库: centos7 IP地址:10.0.4.231
pt-heartbeat安装
以下主要介绍redhat/centos的yum方式
1.添加percona的Yum源
1 | sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm |
2.yum安装
1 | sudo yum install percona-toolkit |
安装完成后可以看到该工具箱包含很多管理工具:
1 | [root@server-6 ~]# ll /usr/bin/pt* |
使用pt-heartbeat的前提条件
1.保持时间始终同步
heartbeat的原理是通过接收master更新过来的时间戳,然后对比本地系统当前时间判断时间延时.这就意味着slave库和master库的时间要保持高度的一致,否则如果时间不一致,则pt-heartbeat采集到的延时数据没有任何用处,甚至会产生误导,导致意外后果.
可以通过ntpdate命令来同步网络时钟.
1 | ntpdate -u ntp.api.bz |
为了时钟保持时间同步.在每台服务器上通过crontab定时任务,定期同步时间.例如每隔30分钟同步一次:
1 | vim /etc/crontab |
另外,为了防止服务器重启后时间不一致,还需要让此命令开机自动执行.例如在centos7系统下可以如下配置:
1 | chmod +x /etc/rc.d/rc.local |
Note:理解和注意master,slave服务器的时间同步极其重要.否则会导致出现意外的误判,甚至导致严重故障
2.配置主从复制环境
pt-heartbeat工作基于主从复制,所以前提需要搭建好主从环境,并且确保他们能正常工作.master和slave数据已经同步一致.否则使用pt-heartbeat将毫无意义.
关于主从复制环境配置在此不做任何介绍,有兴趣可以翻阅我的另外一篇笔记:mysql5.7使用GTID配置主从复制
pt-heartbeat使用
以下摘取一些主要的选项:
1 | Options: |
note.如果安装后执行pt-heartbeat报如下错误:
1 | install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted. |
这可能是缺少了mysql的lib库.执行如下操作:
ln -s /usr/lib64/mysql/libmysqlclient.so.18 /lib64/
step1: 在Master主库上以守护进程方式运行heartbeat
1 | [root@localhost ~]$pt-heartbeat --user=root --ask-pass --host=127.0.0.1 --create-table -D dwd --update --replace --daemonize |
查看进程:
1 | [root@localhost ~]$ps aux | grep pt-heartbeat | grep -v grep |
查看被创建的heartbeat表:
1 | mysql> desc heartbeat; |
查看时间戳更新情况.可以看到每秒更新一次:
1 | mysql> select * from heartbeat; |
step2: 从库持续监控延时情况
1 | [root@localhost ~]$pt-heartbeat --user=root --password=xxxx -D dwd --master-server-id=230 --monitor |
monitor选项表示持续监控,并且打印结果. 如果加上–print-master-server-id还可以打印主库的server-id
上述的四个值代表:实时延时[过去1分钟延时,5分钟延时,15分钟延时]
step3 利用check选项,监控一次就退出
1 | [root@localhost ~]$pt-heartbeat --user=root --password=xxxx -D dwd --master-server-id=230 --check |
主要的使用方法就到这.
模拟大并发写入.pt-heartbeat监控延时情况
step1.master库创建一个表
1 | mysql> CREATE TABLE `t_user` ( |
step2.执行一个存储过程,模拟写入百万条数据
1 | mysql> delimiter $$ |
step3:延时明显升高
1 | 6.00s [ 6.00s, 3.30s, 1.10s ] |
生产中使用pt-heartbeat的优化
1.在从库新建一个专用于检查延时的mysql账户,且只赋予heartbeat表的select权限.例如下面创建一个heartbeat账户:
1 | mysql> create user 'heartbeat'@'localhost' identified by '密码'; |
2.默认情况下,master库每隔1秒更新时间戳.这可能会过于频繁.使用–interval参数可以设置master库的更新时间戳频率.例如,master每隔10s更新一次时间戳
1 | [root@localhost ~]$/usr/bin/pt-heartbeat --user=root --ask-pass --host=127.0.0.1 --create-table -D dwd --interval=10 --update --replace --daemonize |
检查heartbeat库,发现确实是10秒才更新一次:
1 | mysql> select * from heartbeat; |
查看slave服务器的延时.由于slave默认每秒检查所以延时会一直持续,直到第10秒时候接收到master更新.
1 | 0.00s [ 0.00s, 0.00s, 0.00s ] |
pt-heartbeat+zabbix 监控延时
工作中可以通过shell脚本来持续监控heartbeat,判断主从是否有延时.方式主要有两种
1.编写shell脚本获取heartbeat采集到的数据,并且通过crontab定期执行脚本.利用邮件方式报警延时情况
2.通过zabbix监控shell脚本采集heartbeat数据.通过邮件,微信,钉钉等报警方式通告延时情况
这里我们选择了zabbix,因为zabbix可以实时观察延时情况,而且可以分不通的报警等级.报警到工作的钉钉群
note:
1.以下的配置大部分都在slave服务器,且该服务器上安装了zabbix agent
2.我们使用的是zabbix 3.4版本.可能并不是每个步骤都适用于其他版本
接下来配置zabbix监控项
1.编写一个shell脚本.采集heartbeat的延时数据.使用–check选项.
1 | vim mysql-heartbeat.sh |
2.将该脚本移动到/etc/zabbix/script目录下(这个目录需要手动创建),且赋予执行权限.出于安全考虑.设置为只有zabbix用户可以查看
1 | [root@server-6 script]# ll /etc/zabbix/script/ |
当然,你也可以将该脚本放在任何您想存放的地方
3.在/etc/zabbix/zabbix_agentd.d目录下编写UserParameter文件
1 | [root@server-6 script]# cd /etc/zabbix/zabbix_agentd.d/ |
note: 这里的UserParameter为固定格式.
heartbeat.delay表示zabbix的监控项
后面的脚本表示监控项获取到的数据.也就是说zabbix检查heartbeat.delay监控项的数据,其实就是执行后面的shell脚本,并得到脚本的返回结果
4.配置zabbix agentd配置文件.修改include字段,让zabbix agent读取UserParameter配置文件:
1 | [root@server-6 zabbix_agentd.d]# vim /etc/zabbix/zabbix_agentd.conf |
5.重启zabbix_agentd服务
1 | pkill zabbix_agentd |
6.在zabbix server服务器检查是否可以正常获取到监控项的数据
1 | [root@server-4 ~]# zabbix_get -s 10.0.0.216 -k heartbeat.delay |
-s 参数表示zabbix agent的IP地址
-k 参数表示监控项
这里可以正常获取到监控项的数据,也就是shell脚本的执行结果
既然zabbix server通过命令行可以获取到监控项的数据,接下来只要配置zabbix的web界面就可以了.
1.在slave库配置监控项
2.配置图形
3.配置触发器
note: 为了防止因为网络抖动造成的频繁的延时报警.这里表达式设置为连续3次采集的数据都大于10秒才报警.也可以换成另外一种表达式:
{server-6:heartbeat.delay.last(0)}>30
这个表达式表示监控项的最新数据只要大于30秒就报警.大于30秒就意味着连续3次报警都延时.我认为这种效果更好
另外.再设置一档报警.比如5分钟延时报警,此时报警等级为严重.
4.查看监控数据
5.测试触发器是否工作正常
至此.成功利用zabbix来监控mysql的主从复制同步情况.
1 | install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted. |
1 | ln -s /usr/lib64/mysql/libmysqlclient.so.18 /lib64/ |