zabbix如何监控mysql主从
时间: 2025-08-04 22:40:15 浏览: 2
<think>我们被要求使用Zabbix监控MySQL主从复制状态。根据提供的引用,有几种方法可以实现,包括使用Percona插件和自己编写脚本。我们将结合引用内容,给出清晰的步骤。
主要步骤包括:
1. 在MySQL从库上准备监控脚本(检查IO线程和SQL线程状态,或者延迟时间)。
2. 配置Zabbix Agent以允许调用这些脚本。
3. 在Zabbix Server上配置监控项、触发器等。
4. 测试并验证。
我们将分步说明:
### 步骤1:准备监控脚本
根据引用[3],我们可以编写一个脚本来检查Slave_IO_Running和Slave_SQL_Running的状态。脚本可以放在从库服务器的`/etc/zabbix/script/`目录下。
脚本示例(mysql_slave_status.sh):
```bash
#!/bin/bash
# 监控MySQL主从同步线程状态
USER="slave" # 替换为实际的MySQL用户
PASSWD="Zabbix@root818" # 替换为实际密码
HOST="192.168.158.136" # 如果是本机,可以用127.0.0.1
MYSQL_CMD="/usr/local/mysql/bin/mysql" # 替换为实际的mysql命令路径
function IO {
Slave_IO_Running=`$MYSQL_CMD -h$HOST -u$USER -p$PASSWD -e "show slave status\G;" 2> /dev/null | grep -w "Slave_IO_Running" | awk '{print $2}'`
if [[ $Slave_IO_Running == "Yes" ]]; then
echo 0
else
echo 1
fi
}
function SQL {
Slave_SQL_Running=`$MYSQL_CMD -h$HOST -u$USER -p$PASSWD -e "show slave status\G;" 2> /dev/null | grep -w "Slave_SQL_Running" | awk '{print $2}'`
if [[ $Slave_SQL_Running == "Yes" ]]; then
echo 0
else
echo 1
fi
}
case $1 in
io)
IO
;;
sql)
SQL
;;
*)
echo "Usage: $0 [io | sql]"
exit 1
esac
```
注意:需要给脚本执行权限:
```bash
chmod +x /etc/zabbix/script/mysql_slave_status.sh
```
另外,引用[4]提供了一个监控延迟的简单方法(监控Seconds_Behind_Master):
```bash
#!/bin/bash
# 监控MySQL主从延迟
delay=$(mysql -uroot -p123456 -e 'show slave status\G' 2>/dev/null | grep 'Seconds_Behind_Master' | awk '{print $2}')
echo ${delay:-0} # 如果为空,则输出0(可能表示主从正常没有延迟,或者主从已经断开?需要根据实际情况判断)
```
我们可以根据需要选择监控线程状态还是延迟,或者两者都监控。
### 步骤2:配置Zabbix Agent
在从库的Zabbix Agent配置文件中(通常是`/etc/zabbix/zabbix_agentd.conf`或`/etc/zabbix/zabbix_agentd.d/`下的配置文件)添加UserParameter,允许Zabbix Server调用这些脚本。
例如,添加以下内容:
```ini
UserParameter=mysql.slave.status[*],/etc/zabbix/script/mysql_slave_status.sh $1
UserParameter=mysql.slave.delay,/etc/zabbix/script/mysql_delay.sh # 如果有延迟监控脚本
```
然后重启Zabbix Agent服务:
```bash
systemctl restart zabbix-agent
```
### 步骤3:在Zabbix Server上配置
1. 创建模板(或者直接在主机上添加监控项)
2. 创建监控项:
- 监控IO线程:键值 `mysql.slave.status[io]`
- 监控SQL线程:键值 `mysql.slave.status[sql]`
- 监控延迟(可选):键值 `mysql.slave.delay`
3. 创建触发器:
- 当IO线程不为0(即不是"Yes")时触发告警:`{Template MySQL Slave:mysql.slave.status[io].last()}<>0`
- 当SQL线程不为0时触发告警:`{Template MySQL Slave:mysql.slave.status[sql].last()}<>0`
- 延迟超过一定阈值(例如300秒)触发告警:`{Template MySQL Slave:mysql.slave.delay.last()}>300`
4. 创建图形(可选)。
5. 将模板关联到MySQL从库主机。
### 步骤4:测试
在Zabbix Server上使用zabbix_get测试:
```bash
zabbix_get -s <从库IP> -k mysql.slave.status[io]
zabbix_get -s <从库IP> -k mysql.slave.status[sql]
zabbix_get -s <从库IP> -k mysql.slave.delay
```
预期返回0(正常)或1(异常)或者延迟的秒数。
注意事项:
- 确保MySQL用户有权限执行`show slave status`。
- 确保脚本中的MySQL客户端路径正确。
- 确保Zabbix Agent有权限执行脚本。
引用[1]提到Percona提供的插件,但这里我们使用了自定义脚本。Percona插件可能更全面,但自定义脚本更灵活。
以上是使用Zabbix监控MySQL主从复制状态的基本方法。
§§相关问题§§
1. 如何监控MySQL主从复制的延迟时间?
2. 如果MySQL主从复制中断,除了Zabbix告警,还有哪些方法可以快速发现?
3. Zabbix监控MySQL主从复制状态时,如何确保监控脚本的安全性?</think>### Zabbix监控MySQL主从复制配置方法
#### 一、核心原理
Zabbix通过Agent在MySQL从库上执行监控脚本,获取主从复制状态的关键指标(如`Slave_IO_Running`、`Slave_SQL_Running`、`Seconds_Behind_Master`),并通过触发器实现异常告警[^3][^4]。
#### 二、配置步骤
##### 1. 准备监控脚本
在MySQL从库创建监控脚本(示例路径:`/etc/zabbix/script/mysql_slave_status.sh`):
```bash
#!/bin/bash
USER="slave" # MySQL监控账号
PASSWD="YourPassword" # 替换为实际密码
HOST="127.0.0.1" # MySQL地址
MYSQL_CMD="/usr/bin/mysql" # MySQL命令路径
function IO {
status=$($MYSQL_CMD -h$HOST -u$USER -p$PASSWD -e "SHOW SLAVE STATUS\G" 2>/dev/null | awk '/Slave_IO_Running/{print $2}')
[[ $status == "Yes" ]] && echo 0 || echo 1
}
function SQL {
status=$($MYSQL_CMD -h$HOST -u$USER -p$PASSWD -e "SHOW SLAVE STATUS\G" 2>/dev/null | awk '/Slave_SQL_Running/{print $2}')
[[ $status == "Yes" ]] && echo 0 || echo 1
}
function DELAY {
delay=$($MYSQL_CMD -h$HOST -u$USER -p$PASSWD -e "SHOW SLAVE STATUS\G" 2>/dev/null | awk '/Seconds_Behind_Master/{print $2}')
echo ${delay:-9999} # 无数据返回9999(异常)
}
case $1 in
io) IO ;;
sql) SQL ;;
delay) DELAY ;;
*) echo "Usage: $0 [io|sql|delay]" ;;
esac
```
**权限设置**:
```bash
chmod +x /etc/zabbix/script/mysql_slave_status.sh
chown zabbix:zabbix /etc/zabbix/script/mysql_slave_status.sh
```
##### 2. 配置Zabbix Agent
编辑Agent配置文件(`/etc/zabbix/zabbix_agentd.conf`):
```ini
UserParameter=mysql.replication[*],/etc/zabbix/script/mysql_slave_status.sh $1
```
重启服务生效:
```bash
systemctl restart zabbix-agent
```
##### 3. Zabbix Server测试
```bash
zabbix_get -s 从库IP -k mysql.replication[io] # 应返回0(正常)或1(异常)
zabbix_get -s 从库IP -k mysql.replication[delay] # 返回延迟秒数
```
##### 4. Web界面配置
1. **创建监控项**:
| 名称 | 键值 | 值类型 |
|---------------------|-------------------------|--------|
| MySQL IO Thread | `mysql.replication[io]` | 整数 |
| MySQL SQL Thread | `mysql.replication[sql]`| 整数 |
| Replication Delay | `mysql.replication[delay]`| 整数 |
2. **创建触发器**:
```plaintext
# IO线程异常
{Template:mysql.replication[io].last()}=1
# SQL线程异常
{Template:mysql.replication[sql].last()}=1
# 延迟超过300秒
{Template:mysql.replication[delay].last()}>300
```
3. **关联模板**:将模板绑定到MySQL从库主机
#### 三、关键注意事项
1. **MySQL账号权限**:监控账号需有`REPLICATION CLIENT`权限
```sql
CREATE USER 'slave'@'localhost' IDENTIFIED BY 'YourPassword';
GRANT REPLICATION CLIENT ON *.* TO 'slave'@'localhost';
```
2. **防火墙配置**:确保Zabbix Server可访问从库的10050端口
3. **脚本调试**:手动执行脚本验证输出(如`/etc/zabbix/script/mysql_slave_status.sh io`)
#### 四、监控效果
- **正常状态**:IO/SQL线程返回0,延迟为数字
- **异常状态**:
- IO/SQL线程返回1(线程停止)
- 延迟返回9999(主从断开)
- 触发器触发告警通知[^3]
[^1]: 使用Percona插件监控MySQL复制
[^2]: Zabbix监控主从延迟的基础方法
[^3]: 通过脚本监控线程状态的完整实现
[^4]: 延迟监控的简化脚本实现
阅读全文
相关推荐

















