1. 首页 > MySQL教程 > 正文

MySQL教程FG224-MySQL主从复制监控

Part01-基础概念与理论知识

1.1 主从复制监控概述

主从复制监控是确保MySQL主从复制正常运行的关键,通过监控复制状态、延迟和错误,可以及时发现和处理复制问题。风哥教程参考MySQL官方文档Replication部分的相关内容。更多视频教程www.fgedu.net.cn

# 主从复制监控的定义
主从复制监控是指对MySQL主从复制的状态、性能和错误进行监控,确保复制正常运行的过程。

# 主从复制监控的目标
1. 实时监控复制状态:确保复制线程正常运行
2. 监控复制延迟:确保从库与主库的数据一致性
3. 监控复制错误:及时发现和处理复制错误
4. 预测复制问题:通过监控数据,预测可能出现的复制问题
5. 自动化告警:当复制出现问题时,及时发送告警

# 主从复制监控的组成部分
1. 监控工具:用于收集和分析复制相关的指标
2. 监控指标:用于评估复制状态的各项指标
3. 告警机制:用于在复制出现问题时发送告警
4. 监控面板:用于可视化展示复制状态

1.2 主从复制监控的重要性

主从复制监控的重要性在于确保复制的正常运行,及时发现和处理复制问题,避免数据不一致和服务中断。学习交流加群风哥微信: itpux-com

主从复制监控的重要性:1. 确保复制正常运行:及时发现和处理复制问题,确保复制的连续性;2. 避免数据不一致:通过监控复制延迟,确保从库与主库的数据一致性;3. 提高系统可靠性:提前发现潜在问题,提高系统的整体可靠性;4. 减少停机时间:在复制出现问题时,及时处理,减少停机时间;5. 优化复制性能:通过监控复制性能指标,优化复制配置;6. 满足合规要求:某些行业要求对系统进行监控,确保服务的可用性;7. 提高运维效率:通过自动化监控和告警,减少人工干预,提高运维效率。

1.3 主从复制监控的指标

主从复制监控的指标包括复制状态、复制延迟、复制错误等,这些指标可以帮助评估复制的健康状况。学习交流加群风哥QQ113257174

# 主从复制监控的指标
1. 复制状态指标:
– Slave_IO_Running:IO线程是否正常运行
– Slave_SQL_Running:SQL线程是否正常运行
– Last_IO_Error:IO线程的最后错误
– Last_SQL_Error:SQL线程的最后错误

2. 复制延迟指标:
– Seconds_Behind_Master:从库落后主库的秒数
– Relay_Log_Space:中继日志的大小

3. 复制性能指标:
– Binlog_Dump_Threads:主库的binlog dump线程数
– Slave_Running_Threads:从库的运行线程数
– Replication_Apply_Lag:复制应用延迟

4. 系统资源指标:
– CPU使用率:主库和从库的CPU使用率
– 内存使用率:主库和从库的内存使用率
– 磁盘IO:主库和从库的磁盘IO情况
– 网络流量:主从库之间的网络流量

# 关键监控指标
| 指标 | 描述 | 正常范围 | 告警阈值 |
|——|——|———-|———-|
| Slave_IO_Running | IO线程状态 | Yes | No |
| Slave_SQL_Running | SQL线程状态 | Yes | No |
| Seconds_Behind_Master | 复制延迟 | 0 | > 300秒 |
| Last_IO_Error | IO线程错误 | 空 | 非空 |
| Last_SQL_Error | SQL线程错误 | 空 | 非空 |
| Relay_Log_Space | 中继日志大小 | 合理范围 | > 1GB |

Part02-生产环境规划与建议

2.1 监控系统规划

监控系统规划是确保监控效果的关键,以下是监控系统规划的要点。风哥提示:生产环境中应根据系统规模和业务需求,规划合理的监控系统。

监控系统规划:1. 确定监控范围:根据系统规模,确定需要监控的主从复制实例;2. 选择监控工具:根据技术团队的熟悉程度和系统需求,选择合适的监控工具;3. 设计监控架构:根据系统架构,设计合理的监控架构,如集中式或分布式;4. 配置监控指标:根据业务需求,配置关键的监控指标;5. 制定告警策略:根据业务重要性,制定合理的告警策略;6. 建立监控文档:记录监控系统的配置和操作流程。

2.2 监控工具选择

选择合适的监控工具可以提高监控的效率和可靠性,以下是监控工具选择的要点。更多学习教程公众号风哥教程itpux_com

# 监控工具选择
1. 内置工具:
– MySQL命令行工具:如SHOW SLAVE STATUS、SHOW STATUS等
– MySQL Enterprise Monitor:MySQL官方提供的监控工具

2. 开源工具:
– Prometheus + Grafana:开源的监控和可视化工具
– Zabbix:开源的监控系统
– Nagios:开源的监控系统
– Icinga:Nagios的分支,提供更现代化的界面

3. 商业工具:
– Datadog:云原生监控平台
– New Relic:应用性能监控平台
– AppDynamics:应用性能监控平台

# 监控工具比较
| 工具 | 优点 | 缺点 | 适用场景 |
|——|——|——|———-|
| MySQL命令行工具 | 简单直接,无需额外安装 | 无法实时监控,需要手动执行 | 临时检查,小型系统 |
| Prometheus + Grafana | 开源,功能强大,可视化效果好 | 配置复杂,需要一定的技术知识 | 中大型系统,需要详细的监控和可视化 |
| Zabbix | 开源,功能全面,支持多种监控方式 | 配置复杂,资源消耗较大 | 中大型系统,需要全面的监控 |
| Datadog | 云原生,易于部署,功能丰富 | 付费,成本较高 | 云环境,大型系统 |

# 推荐监控工具组合
– 小型系统:MySQL命令行工具 + 简单的脚本监控
– 中型系统:Prometheus + Grafana
– 大型系统:Prometheus + Grafana + 商业监控工具

2.3 告警策略规划

告警策略规划是确保及时发现和处理复制问题的关键,以下是告警策略规划的要点。from MySQL:www.itpux.com

# 告警策略规划
1. 告警级别:
– 紧急:需要立即处理的问题,如复制线程停止
– 严重:需要尽快处理的问题,如复制延迟较大
– 警告:需要关注的问题,如复制延迟轻微增加
– 信息:仅供参考的信息,如复制状态正常

2. 告警方式:
– 邮件:适合非紧急的告警
– 短信:适合紧急的告警
– 电话:适合非常紧急的告警
– 即时通讯工具:如钉钉、微信等,适合团队协作

3. 告警频率:
– 紧急告警:立即发送,每5分钟重发一次,直到问题解决
– 严重告警:立即发送,每15分钟重发一次,直到问题解决
– 警告:立即发送,每30分钟重发一次,直到问题解决
– 信息:仅发送一次

4. 告警接收人:
– 紧急告警:所有运维人员
– 严重告警:主要运维人员
– 警告:值班人员
– 信息:相关人员

# 推荐告警策略
| 告警类型 | 级别 | 方式 | 频率 | 接收人 |
|———-|——|——|——|——–|
| 复制线程停止 | 紧急 | 邮件 + 短信 | 每5分钟 | 所有运维人员 |
| 复制延迟 > 300秒 | 严重 | 邮件 + 短信 | 每15分钟 | 主要运维人员 |
| 复制延迟 > 60秒 | 警告 | 邮件 | 每30分钟 | 值班人员 |
| 复制状态正常 | 信息 | 邮件 | 一次 | 相关人员 |

Part03-生产环境项目实施方案

3.1 基于MySQL命令的监控

基于MySQL命令的监控是最基本的监控方式,通过执行MySQL命令来检查复制状态,以下是具体的实施方案。

# 基于MySQL命令的监控
# 步骤1:创建监控脚本
# vi /mysql/scripts/monitor_replication.sh
#!/bin/bash
# monitor_replication.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

LOG_FILE=”/mysql/logs/replication_monitor.log”
ALERT_EMAIL=”admin@example.com”

# 检查复制状态
SLAVE_STATUS=$(mysql -u root -pPassword123! -e “SHOW SLAVE STATUS\G”)

# 提取关键信息
SLAVE_IO_RUNNING=$(echo “$SLAVE_STATUS” | grep “Slave_IO_Running” | awk ‘{print $2}’)
SLAVE_SQL_RUNNING=$(echo “$SLAVE_STATUS” | grep “Slave_SQL_Running” | awk ‘{print $2}’)
SECONDS_BEHIND_MASTER=$(echo “$SLAVE_STATUS” | grep “Seconds_Behind_Master” | awk ‘{print $2}’)
LAST_IO_ERROR=$(echo “$SLAVE_STATUS” | grep “Last_IO_Error” | sed ‘s/Last_IO_Error: //’)
LAST_SQL_ERROR=$(echo “$SLAVE_STATUS” | grep “Last_SQL_Error” | sed ‘s/Last_SQL_Error: //’)

# 记录监控信息
echo “[$(date +%Y-%m-%d%H:%M:%S)] Replication status check” >> $LOG_FILE
echo “Slave_IO_Running: $SLAVE_IO_RUNNING” >> $LOG_FILE
echo “Slave_SQL_Running: $SLAVE_SQL_RUNNING” >> $LOG_FILE
echo “Seconds_Behind_Master: $SECONDS_BEHIND_MASTER” >> $LOG_FILE
echo “Last_IO_Error: $LAST_IO_ERROR” >> $LOG_FILE
echo “Last_SQL_Error: $LAST_SQL_ERROR” >> $LOG_FILE

# 检查IO线程状态
if [ “$SLAVE_IO_RUNNING” != “Yes” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: Slave IO thread is not running!” >> $LOG_FILE
# 发送告警邮件
echo “Slave IO thread is not running!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: Slave IO thread stopped” $ALERT_EMAIL
fi

# 检查SQL线程状态
if [ “$SLAVE_SQL_RUNNING” != “Yes” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: Slave SQL thread is not running!” >> $LOG_FILE
# 发送告警邮件
echo “Slave SQL thread is not running!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: Slave SQL thread stopped” $ALERT_EMAIL
fi

# 检查复制延迟
if [ “$SECONDS_BEHIND_MASTER” -gt 300 ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] WARNING: Replication delay is $SECONDS_BEHIND_MASTER seconds!” >> $LOG_FILE
# 发送告警邮件
echo “Replication delay is $SECONDS_BEHIND_MASTER seconds!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: High replication delay” $ALERT_EMAIL
fi

# 检查IO错误
if [ -n “$LAST_IO_ERROR” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: IO error: $LAST_IO_ERROR” >> $LOG_FILE
# 发送告警邮件
echo “IO error: $LAST_IO_ERROR\n\n$SLAVE_STATUS” | mail -s “Replication Alert: IO error” $ALERT_EMAIL
fi

# 检查SQL错误
if [ -n “$LAST_SQL_ERROR” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: SQL error: $LAST_SQL_ERROR” >> $LOG_FILE
# 发送告警邮件
echo “SQL error: $LAST_SQL_ERROR\n\n$SLAVE_STATUS” | mail -s “Replication Alert: SQL error” $ALERT_EMAIL
fi

# 步骤2:设置执行权限
chmod +x /mysql/scripts/monitor_replication.sh

# 步骤3:添加cron任务
# crontab -e
*/5 * * * * /mysql/scripts/monitor_replication.sh

# 步骤4:验证监控效果
# 查看监控日志
tail -f /mysql/logs/replication_monitor.log

# 模拟复制错误
# 在从库上执行
mysql> STOP SLAVE IO_THREAD;

# 检查是否收到告警邮件

3.2 基于Prometheus的监控

基于Prometheus的监控是一种现代化的监控方式,通过Prometheus收集指标,Grafana进行可视化展示,以下是具体的实施方案。

# 基于Prometheus的监控
# 步骤1:安装Prometheus
# 下载并安装Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.40.0/prometheus-2.40.0.linux-amd64.tar.gz
tar -xzf prometheus-2.40.0.linux-amd64.tar.gz
mv prometheus-2.40.0.linux-amd64 /usr/local/prometheus

# 配置Prometheus
# vi /usr/local/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s

scrape_configs:
– job_name: ‘mysql’
static_configs:
– targets: [‘192.168.1.100:9104’, ‘192.168.1.101:9104’]

# 启动Prometheus
nohup /usr/local/prometheus/prometheus –config.file=/usr/local/prometheus/prometheus.yml &

# 步骤2:安装MySQL Exporter
# 下载并安装MySQL Exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz
tar -xzf mysqld_exporter-0.14.0.linux-amd64.tar.gz
mv mysqld_exporter-0.14.0.linux-amd64 /usr/local/mysqld_exporter

# 创建监控用户
mysql> CREATE USER ‘exporter’@’localhost’ IDENTIFIED BY ‘ExporterPassword123!’;
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO ‘exporter’@’localhost’;
mysql> FLUSH PRIVILEGES;

# 创建配置文件
# vi /etc/.mysqld_exporter.cnf
[client]
user=exporter
password=ExporterPassword123!

# 启动MySQL Exporter
nohup /usr/local/mysqld_exporter/mysqld_exporter –config.my-cnf=/etc/.mysqld_exporter.cnf &

# 步骤3:安装Grafana
# 下载并安装Grafana
yum install -y https://dl.grafana.com/oss/release/grafana-9.0.0-1.x86_64.rpm
systemctl start grafana-server
systemctl enable grafana-server

# 步骤4:配置Grafana
# 登录Grafana,添加Prometheus数据源
# 访问 http://localhost:3000
# 用户名:admin,密码:admin

# 导入MySQL监控面板
# 导入ID为7362的MySQL监控面板

# 步骤5:配置告警
# 在Grafana中配置告警规则
# 配置邮件告警

# 步骤6:验证监控效果
# 访问Grafana面板
# http://localhost:3000

# 查看MySQL复制状态
# 查看复制延迟
# 查看复制错误

3.3 基于Zabbix的监控

基于Zabbix的监控是一种全面的监控方式,支持多种监控指标和告警方式,以下是具体的实施方案。

# 基于Zabbix的监控
# 步骤1:安装Zabbix Server
# 安装Zabbix Server
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent

# 创建Zabbix数据库
mysql> CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
mysql> CREATE USER ‘zabbix’@’localhost’ IDENTIFIED BY ‘ZabbixPassword123!’;
mysql> GRANT ALL PRIVILEGES ON zabbix.* TO ‘zabbix’@’localhost’;
mysql> FLUSH PRIVILEGES;

# 导入Zabbix数据库 schema
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -u zabbix -p zabbix

# 配置Zabbix Server
# vi /etc/zabbix/zabbix_server.conf
DBPassword=ZabbixPassword123!

# 启动Zabbix Server
systemctl start zabbix-server zabbix-agent httpd

systemctl enable zabbix-server zabbix-agent httpd

# 步骤2:安装Zabbix Agent
# 在主库和从库上安装Zabbix Agent
yum install -y zabbix-agent

# 配置Zabbix Agent
# vi /etc/zabbix/zabbix_agentd.conf
Server=192.168.1.100

# 启动Zabbix Agent
systemctl start zabbix-agent
systemctl enable zabbix-agent

# 步骤3:配置Zabbix监控项
# 登录Zabbix Web界面
# 访问 http://localhost/zabbix
# 用户名:Admin,密码:zabbix

# 添加主机
# 配置MySQL监控模板

# 添加自定义监控项
# 监控复制状态
# 监控复制延迟
# 监控复制错误

# 步骤4:配置告警
# 在Zabbix中配置告警规则
# 配置邮件告警

# 步骤5:验证监控效果
# 访问Zabbix Web界面
# 查看MySQL复制状态
# 查看复制延迟
# 查看复制错误

Part04-生产案例与实战讲解

4.1 主从复制状态监控

主从复制状态监控是确保复制正常运行的基础,以下是具体的监控案例。

# 主从复制状态监控
# 步骤1:创建监控脚本
# vi /mysql/scripts/monitor_replication_status.sh
#!/bin/bash
# monitor_replication_status.sh

LOG_FILE=”/mysql/logs/replication_status.log”
ALERT_EMAIL=”admin@example.com”

# 检查复制状态
SLAVE_STATUS=$(mysql -u root -pPassword123! -e “SHOW SLAVE STATUS\G”)

# 提取关键信息
SLAVE_IO_RUNNING=$(echo “$SLAVE_STATUS” | grep “Slave_IO_Running” | awk ‘{print $2}’)
SLAVE_SQL_RUNNING=$(echo “$SLAVE_STATUS” | grep “Slave_SQL_Running” | awk ‘{print $2}’)
LAST_IO_ERROR=$(echo “$SLAVE_STATUS” | grep “Last_IO_Error” | sed ‘s/Last_IO_Error: //’)
LAST_SQL_ERROR=$(echo “$SLAVE_STATUS” | grep “Last_SQL_Error” | sed ‘s/Last_SQL_Error: //’)

# 记录监控信息
echo “[$(date +%Y-%m-%d%H:%M:%S)] Replication status check” >> $LOG_FILE
echo “Slave_IO_Running: $SLAVE_IO_RUNNING” >> $LOG_FILE
echo “Slave_SQL_Running: $SLAVE_SQL_RUNNING” >> $LOG_FILE
echo “Last_IO_Error: $LAST_IO_ERROR” >> $LOG_FILE
echo “Last_SQL_Error: $LAST_SQL_ERROR” >> $LOG_FILE

# 检查IO线程状态
if [ “$SLAVE_IO_RUNNING” != “Yes” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: Slave IO thread is not running!” >> $LOG_FILE
# 发送告警邮件
echo “Slave IO thread is not running!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: Slave IO thread stopped” $ALERT_EMAIL
fi

# 检查SQL线程状态
if [ “$SLAVE_SQL_RUNNING” != “Yes” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: Slave SQL thread is not running!” >> $LOG_FILE
# 发送告警邮件
echo “Slave SQL thread is not running!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: Slave SQL thread stopped” $ALERT_EMAIL
fi

# 检查IO错误
if [ -n “$LAST_IO_ERROR” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: IO error: $LAST_IO_ERROR” >> $LOG_FILE
# 发送告警邮件
echo “IO error: $LAST_IO_ERROR\n\n$SLAVE_STATUS” | mail -s “Replication Alert: IO error” $ALERT_EMAIL
fi

# 检查SQL错误
if [ -n “$LAST_SQL_ERROR” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: SQL error: $LAST_SQL_ERROR” >> $LOG_FILE
# 发送告警邮件
echo “SQL error: $LAST_SQL_ERROR\n\n$SLAVE_STATUS” | mail -s “Replication Alert: SQL error” $ALERT_EMAIL
fi

# 步骤2:设置执行权限
chmod +x /mysql/scripts/monitor_replication_status.sh

# 步骤3:添加cron任务
# crontab -e
*/5 * * * * /mysql/scripts/monitor_replication_status.sh

# 步骤4:验证监控效果
# 查看监控日志
tail -f /mysql/logs/replication_status.log

# 模拟复制错误
# 在从库上执行
mysql> STOP SLAVE IO_THREAD;

# 检查是否收到告警邮件

4.2 复制延迟监控

复制延迟监控是确保数据一致性的关键,以下是具体的监控案例。

# 复制延迟监控
# 步骤1:创建监控脚本
# vi /mysql/scripts/monitor_replication_delay.sh
#!/bin/bash
# monitor_replication_delay.sh

LOG_FILE=”/mysql/logs/replication_delay.log”
ALERT_EMAIL=”admin@example.com”

# 检查复制延迟
SLAVE_STATUS=$(mysql -u root -pPassword123! -e “SHOW SLAVE STATUS\G”)
SECONDS_BEHIND_MASTER=$(echo “$SLAVE_STATUS” | grep “Seconds_Behind_Master” | awk ‘{print $2}’)

# 记录监控信息
echo “[$(date +%Y-%m-%d%H:%M:%S)] Replication delay check” >> $LOG_FILE
echo “Seconds_Behind_Master: $SECONDS_BEHIND_MASTER” >> $LOG_FILE

# 检查复制延迟
if [ “$SECONDS_BEHIND_MASTER” -gt 300 ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] WARNING: Replication delay is $SECONDS_BEHIND_MASTER seconds!” >> $LOG_FILE
# 发送告警邮件
echo “Replication delay is $SECONDS_BEHIND_MASTER seconds!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: High replication delay” $ALERT_EMAIL
elif [ “$SECONDS_BEHIND_MASTER” -gt 60 ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] NOTICE: Replication delay is $SECONDS_BEHIND_MASTER seconds!” >> $LOG_FILE
# 发送通知邮件
echo “Replication delay is $SECONDS_BEHIND_MASTER seconds!\n\n$SLAVE_STATUS” | mail -s “Replication Notice: Replication delay” $ALERT_EMAIL
else
echo “[$(date +%Y-%m-%d%H:%M:%S)] INFO: Replication delay is $SECONDS_BEHIND_MASTER seconds” >> $LOG_FILE
fi

# 步骤2:设置执行权限
chmod +x /mysql/scripts/monitor_replication_delay.sh

# 步骤3:添加cron任务
# crontab -e
*/5 * * * * /mysql/scripts/monitor_replication_delay.sh

# 步骤4:验证监控效果
# 查看监控日志
tail -f /mysql/logs/replication_delay.log

# 模拟复制延迟
# 在主库上执行大量写操作
mysql> CREATE DATABASE test_delay;
mysql> USE test_delay;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(1000));
# 插入10000条数据
mysql> DELIMITER //
mysql> CREATE PROCEDURE insert_data()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 10000 DO INSERT INTO test_table (data) VALUES (REPEAT('a', 1000)); SET i = i + 1; END WHILE; END // mysql> DELIMITER ;
mysql> CALL insert_data();

# 检查复制延迟
mysql> SHOW SLAVE STATUS\G | grep Seconds_Behind_Master

# 检查是否收到告警邮件

4.3 复制错误监控

复制错误监控是及时发现和处理复制问题的关键,以下是具体的监控案例。

# 复制错误监控
# 步骤1:创建监控脚本
# vi /mysql/scripts/monitor_replication_errors.sh
#!/bin/bash
# monitor_replication_errors.sh

LOG_FILE=”/mysql/logs/replication_errors.log”
ALERT_EMAIL=”admin@example.com”

# 检查复制错误
SLAVE_STATUS=$(mysql -u root -pPassword123! -e “SHOW SLAVE STATUS\G”)
LAST_IO_ERROR=$(echo “$SLAVE_STATUS” | grep “Last_IO_Error” | sed ‘s/Last_IO_Error: //’)
LAST_SQL_ERROR=$(echo “$SLAVE_STATUS” | grep “Last_SQL_Error” | sed ‘s/Last_SQL_Error: //’)

# 记录监控信息
echo “[$(date +%Y-%m-%d%H:%M:%S)] Replication errors check” >> $LOG_FILE
echo “Last_IO_Error: $LAST_IO_ERROR” >> $LOG_FILE
echo “Last_SQL_Error: $LAST_SQL_ERROR” >> $LOG_FILE

# 检查IO错误
if [ -n “$LAST_IO_ERROR” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: IO error: $LAST_IO_ERROR” >> $LOG_FILE
# 发送告警邮件
echo “IO error: $LAST_IO_ERROR\n\n$SLAVE_STATUS” | mail -s “Replication Alert: IO error” $ALERT_EMAIL
fi

# 检查SQL错误
if [ -n “$LAST_SQL_ERROR” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: SQL error: $LAST_SQL_ERROR” >> $LOG_FILE
# 发送告警邮件
echo “SQL error: $LAST_SQL_ERROR\n\n$SLAVE_STATUS” | mail -s “Replication Alert: SQL error” $ALERT_EMAIL
fi

# 步骤2:设置执行权限
chmod +x /mysql/scripts/monitor_replication_errors.sh

# 步骤3:添加cron任务
# crontab -e
*/5 * * * * /mysql/scripts/monitor_replication_errors.sh

# 步骤4:验证监控效果
# 查看监控日志
tail -f /mysql/logs/replication_errors.log

# 模拟复制错误
# 在主库上创建表
mysql> CREATE DATABASE test_error;
mysql> USE test_error;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100));

# 在从库上手动创建相同的表,但结构不同
mysql> CREATE DATABASE test_error;
mysql> USE test_error;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(50));

# 在主库上插入数据
mysql> INSERT INTO test_table (data) VALUES (REPEAT(‘a’, 100));

# 检查复制错误
mysql> SHOW SLAVE STATUS\G | grep Last_SQL_Error

# 检查是否收到告警邮件

4.4 监控告警自动化

监控告警自动化可以提高监控的效率和可靠性,以下是具体的自动化案例。

# 监控告警自动化
# 步骤1:创建自动化监控脚本
# vi /mysql/scripts/monitor_replication_auto.sh
#!/bin/bash
# monitor_replication_auto.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

LOG_FILE=”/mysql/logs/replication_auto.log”
ALERT_EMAIL=”admin@example.com”

# 检查复制状态
SLAVE_STATUS=$(mysql -u root -pPassword123! -e “SHOW SLAVE STATUS\G”)

# 提取关键信息
SLAVE_IO_RUNNING=$(echo “$SLAVE_STATUS” | grep “Slave_IO_Running” | awk ‘{print $2}’)
SLAVE_SQL_RUNNING=$(echo “$SLAVE_STATUS” | grep “Slave_SQL_Running” | awk ‘{print $2}’)
SECONDS_BEHIND_MASTER=$(echo “$SLAVE_STATUS” | grep “Seconds_Behind_Master” | awk ‘{print $2}’)
LAST_IO_ERROR=$(echo “$SLAVE_STATUS” | grep “Last_IO_Error” | sed ‘s/Last_IO_Error: //’)
LAST_SQL_ERROR=$(echo “$SLAVE_STATUS” | grep “Last_SQL_Error” | sed ‘s/Last_SQL_Error: //’)

# 记录监控信息
echo “[$(date +%Y-%m-%d%H:%M:%S)] Replication status check” >> $LOG_FILE
echo “Slave_IO_Running: $SLAVE_IO_RUNNING” >> $LOG_FILE
echo “Slave_SQL_Running: $SLAVE_SQL_RUNNING” >> $LOG_FILE
echo “Seconds_Behind_Master: $SECONDS_BEHIND_MASTER” >> $LOG_FILE
echo “Last_IO_Error: $LAST_IO_ERROR” >> $LOG_FILE
echo “Last_SQL_Error: $LAST_SQL_ERROR” >> $LOG_FILE

# 自动处理复制问题
# 处理IO线程停止
if [ “$SLAVE_IO_RUNNING” != “Yes” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: Slave IO thread is not running! Attempting to restart…” >> $LOG_FILE
# 尝试重启IO线程
mysql -u root -pPassword123! -e “STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;”
# 检查重启结果
SLAVE_STATUS=$(mysql -u root -pPassword123! -e “SHOW SLAVE STATUS\G”)
SLAVE_IO_RUNNING=$(echo “$SLAVE_STATUS” | grep “Slave_IO_Running” | awk ‘{print $2}’)
if [ “$SLAVE_IO_RUNNING” = “Yes” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] SUCCESS: Slave IO thread restarted successfully!” >> $LOG_FILE
# 发送恢复通知
echo “Slave IO thread restarted successfully!\n\n$SLAVE_STATUS” | mail -s “Replication Notice: Slave IO thread recovered” $ALERT_EMAIL
else
echo “[$(date +%Y-%m-%d%H:%M:%S)] FAILED: Failed to restart Slave IO thread!” >> $LOG_FILE
# 发送告警邮件
echo “Failed to restart Slave IO thread!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: Slave IO thread failed to recover” $ALERT_EMAIL
fi
fi

# 处理SQL线程停止
if [ “$SLAVE_SQL_RUNNING” != “Yes” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] ERROR: Slave SQL thread is not running! Attempting to restart…” >> $LOG_FILE
# 尝试重启SQL线程
mysql -u root -pPassword123! -e “STOP SLAVE SQL_THREAD; START SLAVE SQL_THREAD;”
# 检查重启结果
SLAVE_STATUS=$(mysql -u root -pPassword123! -e “SHOW SLAVE STATUS\G”)
SLAVE_SQL_RUNNING=$(echo “$SLAVE_STATUS” | grep “Slave_SQL_Running” | awk ‘{print $2}’)
if [ “$SLAVE_SQL_RUNNING” = “Yes” ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] SUCCESS: Slave SQL thread restarted successfully!” >> $LOG_FILE
# 发送恢复通知
echo “Slave SQL thread restarted successfully!\n\n$SLAVE_STATUS” | mail -s “Replication Notice: Slave SQL thread recovered” $ALERT_EMAIL
else
echo “[$(date +%Y-%m-%d%H:%M:%S)] FAILED: Failed to restart Slave SQL thread!” >> $LOG_FILE
# 发送告警邮件
echo “Failed to restart Slave SQL thread!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: Slave SQL thread failed to recover” $ALERT_EMAIL
fi
fi

# 处理复制延迟
if [ “$SECONDS_BEHIND_MASTER” -gt 300 ]; then
echo “[$(date +%Y-%m-%d%H:%M:%S)] WARNING: Replication delay is $SECONDS_BEHIND_MASTER seconds!” >> $LOG_FILE
# 发送告警邮件
echo “Replication delay is $SECONDS_BEHIND_MASTER seconds!\n\n$SLAVE_STATUS” | mail -s “Replication Alert: High replication delay” $ALERT_EMAIL
fi

# 步骤2:设置执行权限
chmod +x /mysql/scripts/monitor_replication_auto.sh

# 步骤3:添加cron任务
# crontab -e
*/5 * * * * /mysql/scripts/monitor_replication_auto.sh

# 步骤4:验证自动化效果
# 查看监控日志
tail -f /mysql/logs/replication_auto.log

# 模拟复制问题
# 在从库上执行
mysql> STOP SLAVE IO_THREAD;

# 检查是否自动重启IO线程
mysql> SHOW SLAVE STATUS\G | grep Slave_IO_Running

# 检查是否收到通知邮件

Part05-风哥经验总结与分享

通过多年的MySQL数据库管理经验,我总结了以下关于MySQL主从复制监控的关键点:

风哥提示:MySQL主从复制监控是确保复制正常运行的关键,需要配置完善的监控和告警机制。

1. 监控工具选择:根据系统规模和业务需求,选择合适的监控工具,如MySQL命令行工具、Prometheus + Grafana或Zabbix。

2. 监控指标配置:配置关键的监控指标,如复制状态、复制延迟和复制错误,确保能够及时发现和处理复制问题。

3. 告警策略制定:制定合理的告警策略,包括告警级别、方式、频率和接收人,确保在复制出现问题时能够及时通知相关人员。

4. 自动化处理:通过自动化脚本,实现对常见复制问题的自动处理,提高监控的效率和可靠性。

5. 定期检查:定期检查监控系统的运行状态,确保监控工具正常工作,告警机制有效。

6. 性能优化:根据监控数据,优化复制配置和系统资源,提高复制的性能和可靠性。

7. 文档化:建立详细的监控文档,包括监控工具的配置、告警策略和处理流程,确保相关人员熟悉监控系统的操作。

生产环境最佳实践:1. 根据系统规模和业务需求,选择合适的监控工具;2. 配置关键的监控指标,确保能够及时发现和处理复制问题;3. 制定合理的告警策略,确保在复制出现问题时能够及时通知相关人员;4. 通过自动化脚本,实现对常见复制问题的自动处理;5. 定期检查监控系统的运行状态,确保监控工具正常工作;6. 根据监控数据,优化复制配置和系统资源;7. 建立详细的监控文档,确保相关人员熟悉监控系统的操作;8. 培训相关人员,提高监控和故障处理的技能;9. 持续改进监控系统,适应业务发展和技术变化;10. 结合多种监控工具,实现全面的监控覆盖。

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息