本文档风哥主要介绍TiDB周期性巡检脚本开发相关知识,包括巡检基础、脚本开发基础、TiDB巡检特性、巡检规划、脚本规划、性能建议、巡检实施方案、脚本实施方案、部署实施方案等内容,风哥教程参考TiDB官方文档运维章节,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 巡检基础
巡检的核心概念:
- 巡检:定期对系统进行检查,发现潜在问题并及时处理。
- 周期性巡检:按照固定的时间间隔进行巡检,如每日、每周、每月。
- 巡检指标:用于评估系统状态的具体指标,如CPU使用率、内存使用率、磁盘使用率等。
- 巡检报告:巡检完成后生成的报告,包含巡检结果和建议。
- 巡检自动化:使用脚本和工具自动执行巡检任务。
- 及时发现系统异常
- 预防系统故障
- 优化系统性能
- 延长系统寿命
- 保障业务稳定运行
1.2 脚本开发基础
脚本开发的核心概念:
- 脚本:一系列命令的集合,用于自动执行特定任务。
- 脚本语言:用于编写脚本的编程语言,如Bash、Python、Perl等。
- 脚本执行:运行脚本文件,执行其中的命令。
- 脚本参数:传递给脚本的参数,用于控制脚本行为。
- 脚本输出:脚本执行过程中产生的输出信息。
- 脚本错误处理:处理脚本执行过程中出现的错误。
风哥提示:
## 1. 脚本语言选择
– Bash:适合简单的系统管理任务
– Python:适合复杂的数据分析和处理
– Perl:适合文本处理和系统管理
– PowerShell:适合Windows环境
## 2. 脚本结构
– 脚本头部:包含脚本解释器和注释
– 变量定义:定义脚本中使用的变量
– 函数定义:定义脚本中使用的函数
– 主逻辑:脚本的主要执行逻辑
– 错误处理:处理脚本执行过程中的错误
– 输出处理:处理脚本的输出信息
## 3. 脚本执行
– 直接执行:使用 ./script.sh 执行
– 通过解释器执行:使用 bash script.sh 执行
– 定时执行:使用 crontab 定时执行
– 后台执行:使用 nohup 后台执行
## 4. 脚本参数
– 位置参数:$1, $2, …, $n
– 特殊参数:$0, $#, $*, $@, $?
– 选项参数:使用 getopt 或 getopts 处理
– 环境变量:使用 export 定义环境变量
## 5. 脚本错误处理
– 错误检测:使用 $? 检测命令执行结果
– 错误处理:使用 if 语句处理错误
– 错误退出:使用 exit 命令退出脚本
– 错误日志:记录错误信息到日志文件
1.3 TiDB巡检特性
TiDB巡检的特性:
## 1. 核心组件巡检
– TiDB:检查连接数、QPS、慢查询等
– TiKV:检查存储状态、Raft状态、 RocksDB状态等
– PD:检查集群状态、调度状态等
– 主机:检查CPU、内存、磁盘、网络等
## 2. 关键指标巡检
– 性能指标:QPS、响应时间、吞吐量等
– 资源使用:CPU使用率、内存使用率、磁盘使用率等
– 存储状态:磁盘空间、I/O性能等
– 网络状态:网络延迟、带宽使用率等
– 集群状态:节点状态、副本状态等
## 3. 巡检工具
– tiup:TiDB官方部署和管理工具
– pd-ctl:PD集群管理工具
– tikv-ctl:TiKV管理工具
– mysql-client:MySQL客户端工具
– Prometheus:监控数据采集工具
## 4. 巡检内容
– 集群健康状态:检查集群是否正常运行
– 性能状态:检查系统性能是否正常
– 资源使用:检查资源使用是否合理
– 配置状态:检查配置是否正确
– 安全状态:检查安全配置是否合理
## 5. 巡检频率
– 日常巡检:每日执行,检查基本状态
– 周度巡检:每周执行,检查详细状态
– 月度巡检:每月执行,检查全面状态
– 季度巡检:每季度执行,进行深度检查
Part02-生产环境规划与建议
2.1 巡检规划
巡检规划:
## 1. 巡检目标
– 全面覆盖:覆盖所有TiDB组件和主机
– 及时发现:及时发现系统异常和潜在问题
– 预防故障:预防系统故障的发生
– 优化性能:优化系统性能和配置
– 保障稳定:保障系统稳定运行学习交流加群风哥QQ113257174
## 2. 巡检内容
– 集群状态:检查集群是否正常运行
– 组件状态:检查各组件是否正常运行
– 性能状态:检查系统性能是否正常
– 资源使用:检查资源使用是否合理
– 配置状态:检查配置是否正确
– 安全状态:检查安全配置是否合理
– 备份状态:检查备份是否正常
## 3. 巡检频率
– 日常巡检:每日执行,检查基本状态
– 周度巡检:每周执行,检查详细状态
– 月度巡检:每月执行,检查全面状态
– 季度巡检:每季度执行,进行深度检查
## 4. 巡检流程
– 准备阶段:准备巡检工具和脚本
– 执行阶段:执行巡检任务
– 分析阶段:分析巡检结果
– 报告阶段:生成巡检报告
– 处理阶段:处理发现的问题
## 5. 巡检责任
– 日常巡检:由值班人员负责
– 周度巡检:由DBA团队负责
– 月度巡检:由高级DBA负责
– 季度巡检:由技术负责人负责
2.2 脚本规划
脚本规划:
## 1. 脚本目标
– 自动化执行:自动执行巡检任务
– 全面覆盖:覆盖所有巡检内容
– 准确可靠:巡检结果准确可靠
– 易于维护:脚本易于维护和扩展
– 可定制化:支持用户定制化需求
## 2. 脚本类型
– 日常巡检脚本:执行日常巡检任务
– 周度巡检脚本:执行周度巡检任务
– 月度巡检脚本:执行月度巡检任务
– 专项巡检脚本:执行专项巡检任务
## 3. 脚本功能
– 数据采集:采集系统和数据库的各项指标
– 数据分析:分析采集到的数据
– 问题检测:检测系统中存在的问题
– 报告生成:生成巡检报告
– 告警通知:发送告警通知
## 4. 脚本结构
– 配置模块:处理脚本配置
– 采集模块:采集系统和数据库指标
– 分析模块:分析采集到的数据
– 报告模块:生成巡检报告
– 告警模块:发送告警通知
## 5. 脚本技术选型
– 脚本语言:Bash、Python等
– 工具依赖:tiup、pd-ctl、tikv-ctl等
– 存储方式:文件、数据库等
– 通知方式:邮件、短信、微信等
2.3 性能建议
性能建议:
## 1. 脚本性能建议
– 执行效率:优化脚本执行效率,减少执行时间
– 资源消耗:减少脚本资源消耗,避免影响系统性能
– 并发执行:支持并发执行,提高执行效率
– 错误处理:完善错误处理,避免脚本中断
– 日志记录:记录详细日志,便于问题排查
## 2. 巡检频率建议
– 日常巡检:每日执行,检查基本状态
– 周度巡检:每周执行,检查详细状态
– 月度巡检:每月执行,检查全面状态
– 季度巡检:每季度执行,进行深度检查
## 3. 巡检内容建议
– 核心指标:重点检查核心指标
– 异常指标:关注异常指标的变化
– 趋势分析:分析指标的变化趋势
– 阈值设置:设置合理的阈值,及时发现异常
– 对比分析:与历史数据进行对比分析
## 4. 告警建议
– 告警级别:根据问题严重程度设置不同的告警级别
– 告警频率:设置合理的告警频率,避免告警风暴
– 告警渠道:使用多种告警渠道,确保告警及时送达
– 告警聚合:聚合相关告警,减少告警噪音
– 告警确认:建立告警确认机制,避免告警遗漏
## 5. 报告建议
– 报告格式:使用清晰、易读的报告格式
– 报告内容:包含巡检结果、问题分析和建议
– 报告分发:及时分发报告给相关人员
– 报告归档:归档历史报告,便于查阅
– 报告分析:分析报告数据,发现系统趋势
Part03-生产环境项目实施方案
3.1 巡检实施方案
3.1.1 日常巡检实施方案
## 1. 巡检内容
– 集群状态:检查集群是否正常运行
– 组件状态:检查TiDB、TiKV、PD是否正常运行
– 性能状态:检查QPS、响应时间等
– 资源使用:检查CPU、内存、磁盘使用率
– 连接状态:检查连接数是否正常
## 2. 巡检脚本
$ cat > daily_check.sh << EOF #!/bin/bash # daily_check.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web:
http://www.fgedu.net.cn # 配置 TIUP_BIN="/tidb/app/tiup/bin/tiup" MYSQL_BIN="/tidb/app/mysql/bin/mysql"
HOST="192.168.1.100" PORT="4000" USER="root" PASSWORD="password" DB="fgedudb"
LOG_FILE="/tidb/logs/daily_check.log" # 日志函数 log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1”
}
# 检查集群状态
log “开始检查集群状态”
$TIUP_BIN cluster display fgedu-tidb-cluster >> $LOG_FILE
# 检查TiDB状态
log “开始检查TiDB状态”
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Queries’;” >> $LOG_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Slow_queries’;” >> $LOG_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Threads_connected’;” >> $LOG_FILE
# 检查资源使用
log “开始检查资源使用”
top -b -n 1 | head -20 >> $LOG_FILE
df -h >> $LOG_FILE
free -h >> $LOG_FILE
# 检查磁盘空间
log “开始检查磁盘空间”
df -h | grep /tidb >> $LOG_FILE
# 检查网络状态
log “开始检查网络状态”
ping -c 4 $HOST >> $LOG_FILE
netstat -tuln | grep 4000 >> $LOG_FILE
log “日常巡检完成”
EOF
## 3. 执行脚本
$ chmod +x daily_check.sh
$ ./daily_check.sh
## 4. 定时执行
$ crontab -e
# 添加以下内容
0 8 * * * /tidb/scripts/daily_check.sh
3.1.2 周度巡检实施方案
## 1. 巡检内容
– 日常巡检内容
– 集群配置:检查集群配置是否正确
– 备份状态:检查备份是否正常
– 慢查询分析:分析慢查询
– 性能趋势:分析性能趋势
## 2. 巡检脚本
$ cat > weekly_check.sh << EOF #!/bin/bash # weekly_check.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web:
http://www.fgedu.net.cn # 配置 TIUP_BIN="/tidb/app/tiup/bin/tiup" MYSQL_BIN="/tidb/app/mysql/bin/mysql"
HOST="192.168.1.100" PORT="4000" USER="root" PASSWORD="password" DB="fgedudb"
LOG_FILE="/tidb/logs/weekly_check.log" REPORT_FILE="/tidb/reports/weekly_report_$(date +'%Y%m%d').txt" # 日志函数
log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1”
}
# 生成报告
generate_report() {
echo “# TiDB周度巡检报告” > $REPORT_FILE
echo “生成时间: $(date +’%Y-%m-%d %H:%M:%S’)” >> $REPORT_FILE
echo “” >> $REPORT_FILE
echo “## 1. 集群状态” >> $REPORT_FILE
$TIUP_BIN cluster display fgedu-tidb-cluster >> $REPORT_FILE
echo “” >> $REPORT_FILE
echo “## 2. 性能状态” >> $REPORT_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Queries’;” >> $REPORT_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Slow_queries’;” >> $REPORT_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Threads_connected’;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
echo “## 3. 资源使用” >> $REPORT_FILE
top -b -n 1 | head -20 >> $REPORT_FILE
df -h >> $REPORT_FILE
free -h >> $REPORT_FILE
echo “” >> $REPORT_FILE
echo “## 4. 慢查询分析” >> $REPORT_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SELECT * FROM information_schema.slow_query_log ORDER BY
start_time DESC LIMIT 10;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
echo “## 5. 备份状态” >> $REPORT_FILE
ls -la /tidb/backup >> $REPORT_FILE
}
# 执行巡检
log “开始周度巡检”
# 检查集群状态
log “开始检查集群状态”
$TIUP_BIN cluster display fgedu-tidb-cluster >> $LOG_FILE
# 检查TiDB状态
log “开始检查TiDB状态”
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Queries’;” >> $LOG_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Slow_queries’;” >> $LOG_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Threads_connected’;” >> $LOG_FILE
# 检查资源使用
log “开始检查资源使用”
top -b -n 1 | head -20 >> $LOG_FILE
df -h >> $LOG_FILE
free -h >> $LOG_FILE
# 检查磁盘空间
log “开始检查磁盘空间”
df -h | grep /tidb >> $LOG_FILE
# 检查网络状态
log “开始检查网络状态”
ping -c 4 $HOST >> $LOG_FILE
netstat -tuln | grep 4000 >> $LOG_FILE
# 检查备份状态
log “开始检查备份状态”
ls -la /tidb/backup >> $LOG_FILE
# 分析慢查询
log “开始分析慢查询”
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SELECT * FROM information_schema.slow_query_log ORDER BY
start_time DESC LIMIT 10;” >> $LOG_FILE
# 生成报告
log “开始生成巡检报告”
generate_report
log “周度巡检完成”
EOF
## 3. 执行脚本
$ chmod +x weekly_check.sh
$ ./weekly_check.sh
## 4. 定时执行
$ crontab -e
# 添加以下内容
0 9 * * 1 /tidb/scripts/weekly_check.sh
3.2 脚本实施方案
3.2.1 基础巡检脚本
## 1. 脚本结构
$ cat > basic_check.sh << EOF #!/bin/bash # basic_check.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web:
http://www.fgedu.net.cn # 配置 TIUP_BIN="/tidb/app/tiup/bin/tiup" MYSQL_BIN="/tidb/app/mysql/bin/mysql"
HOST="192.168.1.100" PORT="4000" USER="root" PASSWORD="password" DB="fgedudb"
LOG_FILE="/tidb/logs/basic_check.log" # 日志函数 log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1”
}
# 错误处理函数
error_handler() {
log “错误: $1”
exit 1
}
# 检查命令是否存在
check_command() {
if ! command -v $1 &> /dev/null; then
error_handler “命令 $1 不存在”
fi
}
# 检查集群状态
check_cluster_status() {
log “检查集群状态”
$TIUP_BIN cluster display fgedu-tidb-cluster >> $LOG_FILE
if [ $? -ne 0 ]; then
error_handler “集群状态检查失败”
fi
}
# 检查TiDB状态
check_tidb_status() {
log “检查TiDB状态”
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Queries’;” >> $LOG_FILE
if [ $? -ne 0 ]; then
error_handler “TiDB状态检查失败”
fi
}
# 检查资源使用
check_resource_usage() {
log “检查资源使用”
top -b -n 1 | head -20 >> $LOG_FILE
df -h >> $LOG_FILE
free -h >> $LOG_FILE
}
# 检查磁盘空间
check_disk_space() {
log “检查磁盘空间”
df -h | grep /tidb >> $LOG_FILE
DISK_USAGE=$(df -h | grep /tidb | awk ‘{print $5}’ | sed ‘s/%//g’)
if [ $DISK_USAGE -gt 80 ]; then
log “警告: 磁盘使用率超过80%”
fi
}
# 检查网络状态
check_network_status() {
log “检查网络状态”
ping -c 4 $HOST >> $LOG_FILE
netstat -tuln | grep 4000 >> $LOG_FILE
}
# 主函数
main() {
log “开始基础巡检”
# 检查命令
check_command $TIUP_BIN
check_command $MYSQL_BIN
# 检查集群状态
check_cluster_status
# 检查TiDB状态
check_tidb_status
# 检查资源使用
check_resource_usage
# 检查磁盘空间
check_disk_space
# 检查网络状态
check_network_status
log “基础巡检完成”
}
# 执行主函数
main
EOF
## 2. 执行脚本
$ chmod +x basic_check.sh
$ ./basic_check.sh
## 3. 测试脚本
$ ./basic_check.sh
# 输出示例
# [2024-01-01 00:00:00] 开始基础巡检
# [2024-01-01 00:00:00] 检查集群状态
# [2024-01-01 00:00:00] 检查TiDB状态
# [2024-01-01 00:00:00] 检查资源使用
# [2024-01-01 00:00:00] 检查磁盘空间
# [2024-01-01 00:00:00] 检查网络状态
# [2024-01-01 00:00:00] 基础巡检完成
3.2.2 高级巡检脚本
## 1. 脚本结构
$ cat > advanced_check.py << EOF #!/usr/bin/env python3 # advanced_check.py # from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn import os import sys import subprocess import datetime import smtplib from
email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart # 配置
TIUP_BIN="/tidb/app/tiup/bin/tiup" MYSQL_BIN="/tidb/app/mysql/bin/mysql" HOST="192.168.1.100" PORT="4000"
USER="root" PASSWORD="password" DB="fgedudb" LOG_FILE="/tidb/logs/advanced_check.log"
REPORT_FILE="/tidb/reports/advanced_report_{}.txt" .format(datetime.datetime.now().strftime("%Y%m%d")) # 日志函数
def log(message): timestamp=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") log_message="[{}] {}"
.format(timestamp, message) with open(LOG_FILE, "a" ) as f: f.write(log_message + "\n" ) print(log_message) #
错误处理函数 def error_handler(message): log("错误: {}".format(message)) sys.exit(1) # 检查命令是否存在 def
check_command(command): if subprocess.call(["which", command], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
!=0: error_handler("命令 {} 不存在".format(command)) # 执行命令 def execute_command(command): try:
result=subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT, universal_newlines=True) return
result except subprocess.CalledProcessError as e: error_handler("命令执行失败: {}\n输出: {}".format(command, e.output))
# 检查集群状态 def check_cluster_status(): log("检查集群状态") result=execute_command("{} cluster display
fgedu-tidb-cluster".format(TIUP_BIN)) with open(LOG_FILE, "a" ) as f: f.write(result) return result # 检查TiDB状态
def check_tidb_status(): log("检查TiDB状态") queries=execute_command("{} -h {} -P {} -u {} -p{}
-e 'SHOW STATUS LIKE "Queries";'"
.format(MYSQL_BIN, HOST, PORT, USER, PASSWORD))
slow_queries = execute_command(" {} -h {} -P {} -u {} -p{} -e 'SHOW STATUS LIKE "Slow_queries";'"
.format(MYSQL_BIN, HOST, PORT, USER, PASSWORD))
connections = execute_command(" {} -h {} -P {} -u {} -p{} -e 'SHOW STATUS LIKE "Threads_connected";'"
.format(MYSQL_BIN, HOST, PORT, USER, PASSWORD))
with open(LOG_FILE, " a") as f: f.write(queries) f.write(slow_queries) f.write(connections) return queries,
slow_queries, connections # 检查资源使用 def check_resource_usage(): log("检查资源使用") top=execute_command("top -b -n 1 |
head -20") df=execute_command("df -h") free=execute_command("free -h") with open(LOG_FILE, "a" ) as f:
f.write(top) f.write(df) f.write(free) return top, df, free # 检查磁盘空间 def check_disk_space(): log("检查磁盘空间")
df=execute_command("df -h | grep /tidb") with open(LOG_FILE, "a" ) as f: f.write(df) # 检查磁盘使用率 for line in
df.split("\n"): if line: parts=line.split() if len(parts)>= 5:
usage = parts[4].replace(“%”, “”)
if int(usage) > 80:
log(“警告: 磁盘使用率超过80%: {}”.format(line))
return df
# 检查网络状态
def check_network_status():
log(“检查网络状态”)
ping = execute_command(“ping -c 4 {}”.format(HOST))
netstat = execute_command(“netstat -tuln | grep 4000”)
with open(LOG_FILE, “a”) as f:
f.write(ping)
f.write(netstat)
return ping, netstat
# 检查备份状态
def check_backup_status():
log(“检查备份状态”)
backup = execute_command(“ls -la /tidb/backup”)
with open(LOG_FILE, “a”) as f:
f.write(backup)
return backup
# 分析慢查询
def analyze_slow_queries():
log(“分析慢查询”)
slow_queries = execute_command(“{} -h {} -P {} -u {} -p{} -e ‘SELECT * FROM information_schema.slow_query_log
ORDER BY start_time DESC LIMIT 10;'”
.format(MYSQL_BIN, HOST, PORT, USER, PASSWORD))
with open(LOG_FILE, “a”) as f:
f.write(slow_queries)
return slow_queries
# 生成报告
def generate_report(cluster_status, tidb_status, resource_usage, disk_space, network_status, backup_status,
slow_queries):
log(“生成巡检报告”)
with open(REPORT_FILE, “w”) as f:
f.write(“# TiDB高级巡检报告\n”)
f.write(“生成时间: {}\n\n”.format(datetime.datetime.now().strftime(“%Y-%m-%d %H:%M:%S”)))
f.write(“## 1. 集群状态\n”)
f.write(cluster_status)
f.write(“\n”)
f.write(“## 2. TiDB状态\n”)
f.write(tidb_status[0])
f.write(tidb_status[1])
f.write(tidb_status[2])
f.write(“\n”)
f.write(“## 3. 资源使用\n”)
f.write(resource_usage[0])
f.write(resource_usage[1])
f.write(resource_usage[2])
f.write(“\n”)
f.write(“## 4. 磁盘空间\n”)
f.write(disk_space)
f.write(“\n”)
f.write(“## 5. 网络状态\n”)
f.write(network_status[0])
f.write(network_status[1])
f.write(“\n”)
f.write(“## 6. 备份状态\n”)
f.write(backup_status)
f.write(“\n”)
f.write(“## 7. 慢查询分析\n”)
f.write(slow_queries)
f.write(“\n”)
return REPORT_FILE
# 发送邮件
def send_email(report_file):
log(“发送巡检报告”)
# 邮件配置
smtp_server = “smtp.example.com”
smtp_port = 587
smtp_user = “admin@example.com”
smtp_password = “password”
sender = “admin@example.com”
receivers = [“admin@example.com”]
# 读取报告内容
with open(report_file, “r”) as f:
report_content = f.read()
# 创建邮件
msg = MIMEMultipart()
msg[“From”] = sender
msg[“To”] = “, “.join(receivers)
msg[“Subject”] = “TiDB高级巡检报告”
# 添加邮件正文
part = MIMEText(report_content, “plain”, “utf-8”)
msg.attach(part)
# 发送邮件
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(smtp_user, smtp_password)
server.send_message(msg)
server.quit()
log(“邮件发送成功”)
except Exception as e:
error_handler(“邮件发送失败: {}”.format(e))
# 主函数
def main():
log(“开始高级巡检”)
# 检查命令
check_command(TIUP_BIN)
check_command(MYSQL_BIN)
# 检查集群状态
cluster_status = check_cluster_status()
# 检查TiDB状态
tidb_status = check_tidb_status()
# 检查资源使用
resource_usage = check_resource_usage()
# 检查磁盘空间
disk_space = check_disk_space()
# 检查网络状态
network_status = check_network_status()
# 检查备份状态
backup_status = check_backup_status()
# 分析慢查询
slow_queries = analyze_slow_queries()
# 生成报告
report_file = generate_report(cluster_status, tidb_status, resource_usage, disk_space, network_status,
backup_status, slow_queries)
# 发送邮件
send_email(report_file)
log(“高级巡检完成”)
# 执行主函数
if __name__ == “__main__”:
main
EOF
## 2. 执行脚本
$ chmod +x advanced_check.py
$ python3 advanced_check.py
## 3. 测试脚本
$ python3 advanced_check.py
# 输出示例
# [2024-01-01 00:00:00] 开始高级巡检
# [2024-01-01 00:00:00] 检查集群状态
# [2024-01-01 00:00:00] 检查TiDB状态
# [2024-01-01 00:00:00] 检查资源使用
# [2024-01-01 00:00:00] 检查磁盘空间
# [2024-01-01 00:00:00] 检查网络状态
# [2024-01-01 00:00:00] 检查备份状态
# [2024-01-01 00:00:00] 分析慢查询
# [2024-01-01 00:00:00] 生成巡检报告
# [2024-01-01 00:00:00] 发送巡检报告
# [2024-01-01 00:00:00] 邮件发送成功
# [2024-01-01 00:00:00] 高级巡检完成
3.3 部署实施方案
3.3.1 脚本部署
## 1. 创建脚本目录
$ mkdir -p /tidb/scripts
$ mkdir -p /tidb/logs
$ mkdir -p /tidb/reports
## 2. 复制脚本
$ cp daily_check.sh /tidb/scripts/
$ cp weekly_check.sh /tidb/scripts/
$ cp basic_check.sh /tidb/scripts/
$ cp advanced_check.py /tidb/scripts/
## 3. 设置权限
$ chmod +x /tidb/scripts/*.sh
$ chmod +x /tidb/scripts/*.py
## 4. 配置环境变量
$ cat > /etc/profile.d/tidb_scripts.sh << EOF export TIUP_BIN="/tidb/app/tiup/bin/tiup" export
MYSQL_BIN="/tidb/app/mysql/bin/mysql" export TIDB_HOST="192.168.1.100" export TIDB_PORT="4000" export
TIDB_USER="root" export TIDB_PASSWORD="password" export TIDB_DB="fgedudb" EOF $ source
/etc/profile.d/tidb_scripts.sh ## 5. 测试脚本 $ /tidb/scripts/daily_check.sh $ /tidb/scripts/weekly_check.sh $
/tidb/scripts/basic_check.sh $ python3 /tidb/scripts/advanced_check.py ## 6. 配置定时任务 $ crontab -e # 添加以下内容 # 日常巡检
0 8 * * * /tidb/scripts/daily_check.sh # 周度巡检 0 9 * * 1 /tidb/scripts/weekly_check.sh # 基础巡检 0 12 * * *
/tidb/scripts/basic_check.sh # 高级巡检 0 10 * * 0 /tidb/scripts/advanced_check.py
3.3.2 告警集成
## 1. 配置告警脚本
$ cat > alert.sh << EOF #!/bin/bash # alert.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web:
http://www.fgedu.net.cn # 配置 ALERT_LEVEL="$1" ALERT_MESSAGE="$2" LOG_FILE="/tidb/logs/alert.log" # 日志函数
log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1″
}
# 发送邮件
send_email() {
# 邮件配置
SMTP_SERVER=”smtp.example.com”
SMTP_PORT=”587″
SMTP_USER=”admin@example.com”
SMTP_PASSWORD=”password”
SENDER=”admin@example.com”
RECEIVERS=”admin@example.com”
# 创建邮件内容
SUBJECT=”[TiDB告警] $ALERT_LEVEL: $ALERT_MESSAGE”
BODY=”告警级别: $ALERT_LEVEL\n告警信息: $ALERT_MESSAGE\n告警时间: $(date +’%Y-%m-%d %H:%M:%S’)”
# 发送邮件
echo “$BODY” | mail -s “$SUBJECT” -r “$SENDER” $RECEIVERS
}
# 发送微信通知
send_wechat() {
# 微信配置
CORP_ID=”your_corp_id”
AGENT_ID=”your_agent_id”
API_SECRET=”your_api_secret”
TO_USER=”@all”
# 创建消息内容
MESSAGE=”告警级别: $ALERT_LEVEL\n告警信息: $ALERT_MESSAGE\n告警时间: $(date +’%Y-%m-%d %H:%M:%S’)”
# 发送微信通知
# 这里需要调用企业微信API,具体实现略
echo “发送微信通知: $MESSAGE”
}
# 主函数
main() {
log “告警: $ALERT_LEVEL – $ALERT_MESSAGE”
# 发送邮件
send_email
# 发送微信通知
send_wechat
}
# 执行主函数
main
EOF
## 2. 配置巡检脚本调用告警
$ cat >> /tidb/scripts/daily_check.sh << EOF # 检查磁盘空间 log "开始检查磁盘空间" df -h | grep /tidb>> $LOG_FILE
DISK_USAGE=$(df -h | grep /tidb | awk ‘{print $5}’ | sed ‘s/%//g’)
if [ $DISK_USAGE -gt 80 ]; then
log “警告: 磁盘使用率超过80%”
/tidb/scripts/alert.sh “WARNING” “磁盘使用率超过80%”
fi
# 检查连接数
log “开始检查连接数”
CONNECTIONS=$($MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Threads_connected’;”
| grep Threads_connected | awk ‘{print $2}’)
if [ $CONNECTIONS -gt 5000 ]; then
log “警告: 连接数超过5000”
/tidb/scripts/alert.sh “WARNING” “连接数超过5000”
fi
# 检查慢查询
log “开始检查慢查询”
SLOW_QUERIES=$($MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Slow_queries’;” |
grep Slow_queries | awk ‘{print $2}’)
if [ $SLOW_QUERIES -gt 100 ]; then
log “警告: 慢查询数超过100”
/tidb/scripts/alert.sh “WARNING” “慢查询数超过100”
fi
EOF
## 3. 测试告警
$ /tidb/scripts/alert.sh “TEST” “测试告警”
## 4. 配置告警阈值
$ cat > /tidb/scripts/alert_thresholds.conf << EOF # 告警阈值配置 # 磁盘使用率阈值 DISK_USAGE_THRESHOLD=80 # 连接数阈值
CONNECTIONS_THRESHOLD=5000 # 慢查询数阈值 SLOW_QUERIES_THRESHOLD=100 # QPS阈值 QPS_THRESHOLD=10000 EOF ## 5.
修改脚本使用配置文件 $ cat> /tidb/scripts/daily_check.sh << EOF #!/bin/bash # daily_check.sh #
from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn # 配置
TIUP_BIN="/tidb/app/tiup/bin/tiup" MYSQL_BIN="/tidb/app/mysql/bin/mysql" HOST="192.168.1.100"
PORT="4000" USER="root" PASSWORD="password" DB="fgedudb" LOG_FILE="/tidb/logs/daily_check.log"
ALERT_SCRIPT="/tidb/scripts/alert.sh" THRESHOLD_CONFIG="/tidb/scripts/alert_thresholds.conf" # 加载阈值配置
source $THRESHOLD_CONFIG # 日志函数 log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1”
}
# 检查磁盘空间
check_disk_space() {
log “开始检查磁盘空间”
df -h | grep /tidb >> $LOG_FILE
DISK_USAGE=$(df -h | grep /tidb | awk ‘{print $5}’ | sed ‘s/%//g’)
if [ $DISK_USAGE -gt $DISK_USAGE_THRESHOLD ]; then
log “警告: 磁盘使用率超过${DISK_USAGE_THRESHOLD}%”
$ALERT_SCRIPT “WARNING” “磁盘使用率超过${DISK_USAGE_THRESHOLD}%”
fi
}
# 检查连接数
check_connections() {
log “开始检查连接数”
CONNECTIONS=$($MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE
‘Threads_connected’;” | grep Threads_connected | awk ‘{print $2}’)
if [ $CONNECTIONS -gt $CONNECTIONS_THRESHOLD ]; then
log “警告: 连接数超过${CONNECTIONS_THRESHOLD}”
$ALERT_SCRIPT “WARNING” “连接数超过${CONNECTIONS_THRESHOLD}”
fi
}
# 检查慢查询
check_slow_queries() {
log “开始检查慢查询”
SLOW_QUERIES=$($MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Slow_queries’;”
| grep Slow_queries | awk ‘{print $2}’)
if [ $SLOW_QUERIES -gt $SLOW_QUERIES_THRESHOLD ]; then
log “警告: 慢查询数超过${SLOW_QUERIES_THRESHOLD}”
$ALERT_SCRIPT “WARNING” “慢查询数超过${SLOW_QUERIES_THRESHOLD}”
fi
}
# 主函数
main() {
log “开始日常巡检”
# 检查集群状态
log “开始检查集群状态”
$TIUP_BIN cluster display fgedu-tidb-cluster >> $LOG_FILE
# 检查TiDB状态
log “开始检查TiDB状态”
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Queries’;” >> $LOG_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Slow_queries’;” >> $LOG_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Threads_connected’;” >>
$LOG_FILE
# 检查资源使用
log “开始检查资源使用”
top -b -n 1 | head -20 >> $LOG_FILE
df -h >> $LOG_FILE
free -h >> $LOG_FILE
# 检查磁盘空间
check_disk_space
# 检查连接数
check_connections
# 检查慢查询
check_slow_queries
# 检查网络状态
log “开始检查网络状态”
ping -c 4 $HOST >> $LOG_FILE
netstat -tuln | grep 4000 >> $LOG_FILE
log “日常巡检完成”
}
# 执行主函数
main
EOF
Part04-生产案例与实战讲解
4.1 巡检脚本开发案例
巡检脚本开发案例:
## 案例1:日常巡检脚本
### 步骤1:编写脚本
$ cat > daily_check.sh << EOF #!/bin/bash # daily_check.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web:
http://www.fgedu.net.cn # 配置 TIUP_BIN="/tidb/app/tiup/bin/tiup" MYSQL_BIN="/tidb/app/mysql/bin/mysql"
HOST="192.168.1.100" PORT="4000" USER="root" PASSWORD="password" DB="fgedudb"
LOG_FILE="/tidb/logs/daily_check.log" ALERT_SCRIPT="/tidb/scripts/alert.sh" # 日志函数 log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1”
}
# 检查集群状态
check_cluster_status() {
log “检查集群状态”
$TIUP_BIN cluster display fgedu-tidb-cluster >> $LOG_FILE
if [ $? -ne 0 ]; then
log “错误: 集群状态检查失败”
$ALERT_SCRIPT “ERROR” “集群状态检查失败”
fi
}
# 检查TiDB状态
check_tidb_status() {
log “检查TiDB状态”
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Queries’;” >> $LOG_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Slow_queries’;” >> $LOG_FILE
$MYSQL_BIN -h $HOST -P $PORT -u $USER -p$PASSWORD -e “SHOW STATUS LIKE ‘Threads_connected’;” >> $LOG_FILE
}
# 检查资源使用
check_resource_usage() {
log “检查资源使用”
top -b -n 1 | head -20 >> $LOG_FILE
df -h >> $LOG_FILE
free -h >> $LOG_FILE
}
# 检查磁盘空间
check_disk_space() {
log “检查磁盘空间”
df -h | grep /tidb >> $LOG_FILE
DISK_USAGE=$(df -h | grep /tidb | awk ‘{print $5}’ | sed ‘s/%//g’)
if [ $DISK_USAGE -gt 80 ]; then
log “警告: 磁盘使用率超过80%”
$ALERT_SCRIPT “WARNING” “磁盘使用率超过80%”
fi
}
# 检查网络状态
check_network_status() {
log “检查网络状态”
ping -c 4 $HOST >> $LOG_FILE
netstat -tuln | grep 4000 >> $LOG_FILE
}
# 主函数
main() {
log “开始日常巡检”
# 检查集群状态
check_cluster_status
# 检查TiDB状态
check_tidb_status
# 检查资源使用
check_resource_usage
# 检查磁盘空间
check_disk_space
# 检查网络状态
check_network_status
log “日常巡检完成”
}
# 执行主函数
main
EOF
### 步骤2:测试脚本
$ chmod +x daily_check.sh
$ ./daily_check.sh
### 步骤3:配置定时任务
$ crontab -e
# 添加以下内容
0 8 * * * /tidb/scripts/daily_check.sh
## 案例2:高级巡检脚本
### 步骤1:编写脚本
$ cat > advanced_check.py << EOF #!/usr/bin/env python3 # advanced_check.py #
from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn import os import sys import subprocess
import datetime import smtplib from email.mime.text import MIMEText from email.mime.multipart import
MIMEMultipart # 配置 TIUP_BIN="/tidb/app/tiup/bin/tiup" MYSQL_BIN="/tidb/app/mysql/bin/mysql"
HOST="192.168.1.100" PORT="4000" USER="root" PASSWORD="password" DB="fgedudb"
LOG_FILE="/tidb/logs/advanced_check.log" REPORT_FILE="/tidb/reports/advanced_report_{}.txt"
.format(datetime.datetime.now().strftime("%Y%m%d")) # 日志函数 def log(message):
timestamp=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") log_message="[{}] {}" .format(timestamp,
message) with open(LOG_FILE, "a" ) as f: f.write(log_message + "\n" ) print(log_message) # 执行命令 def
execute_command(command): try: result=subprocess.check_output(command, shell=True,
stderr=subprocess.STDOUT, universal_newlines=True) return result except subprocess.CalledProcessError as
e: log("命令执行失败: {}\n输出: {}".format(command, e.output)) return "" # 检查集群状态 def check_cluster_status():
log("检查集群状态") result=execute_command("{} cluster display fgedu-tidb-cluster".format(TIUP_BIN)) return
result # 检查TiDB状态 def check_tidb_status(): log("检查TiDB状态") queries=execute_command("{} -h {} -P {} -u {}
-p{} -e 'SHOW STATUS LIKE "Queries";'"
.format(MYSQL_BIN, HOST, PORT, USER, PASSWORD))
slow_queries = execute_command(" {} -h {} -P {} -u {} -p{} -e 'SHOW STATUS LIKE "Slow_queries";'"
.format(MYSQL_BIN, HOST, PORT, USER, PASSWORD))
connections = execute_command(" {} -h {} -P {} -u {} -p{} -e 'SHOW STATUS LIKE "Threads_connected";'"
.format(MYSQL_BIN, HOST, PORT, USER, PASSWORD))
return queries, slow_queries, connections
# 生成报告
def generate_report(cluster_status, tidb_status):
log(" 生成巡检报告") with open(REPORT_FILE, "w" ) as f: f.write("# TiDB高级巡检报告\n") f.write("生成时间:
{}\n\n".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) f.write("## 1. 集群状态\n")
f.write(cluster_status) f.write("\n") f.write("## 2. TiDB状态\n") f.write(tidb_status[0])
f.write(tidb_status[1]) f.write(tidb_status[2]) return REPORT_FILE # 主函数 def main(): log("开始高级巡检")
cluster_status=check_cluster_status() tidb_status=check_tidb_status()
report_file=generate_report(cluster_status, tidb_status) log("高级巡检完成,报告已生成: {}".format(report_file)) if
__name__=="__main__" : main() EOF ### 步骤2:测试脚本 $ chmod +x advanced_check.py $ python3 advanced_check.py
### 步骤3:配置定时任务 $ crontab -e # 添加以下内容 0 10 * * 0 /tidb/scripts/advanced_check.py
4.2 部署案例
部署案例:
## 案例1:脚本部署
### 步骤1:创建目录结构
$ mkdir -p /tidb/scripts
$ mkdir -p /tidb/logs
$ mkdir -p /tidb/reports
### 步骤2:复制脚本
$ cp daily_check.sh /tidb/scripts/
$ cp weekly_check.sh /tidb/scripts/
$ cp basic_check.sh /tidb/scripts/
$ cp advanced_check.py /tidb/scripts/
$ cp alert.sh /tidb/scripts/
### 步骤3:设置权限
$ chmod +x /tidb/scripts/*.sh
$ chmod +x /tidb/scripts/*.py
### 步骤4:配置环境变量
$ cat > /etc/profile.d/tidb_scripts.sh << EOF export TIUP_BIN="/tidb/app/tiup/bin/tiup" export
MYSQL_BIN="/tidb/app/mysql/bin/mysql" export TIDB_HOST="192.168.1.100" export TIDB_PORT="4000" export
TIDB_USER="root" export TIDB_PASSWORD="password" export TIDB_DB="fgedudb" EOF $ source
/etc/profile.d/tidb_scripts.sh ### 步骤5:测试脚本 $ /tidb/scripts/daily_check.sh $
/tidb/scripts/weekly_check.sh $ /tidb/scripts/basic_check.sh $ python3 /tidb/scripts/advanced_check.py
### 步骤6:配置定时任务 $ crontab -e # 添加以下内容 0 8 * * * /tidb/scripts/daily_check.sh 0 9 * * 1
/tidb/scripts/weekly_check.sh 0 12 * * * /tidb/scripts/basic_check.sh 0 10 * * 0
/tidb/scripts/advanced_check.py ## 案例2:监控集成 ### 步骤1:配置Prometheus采集脚本执行状态 $ cat> script_status.sh <<
EOF #!/bin/bash # script_status.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web:
http://www.fgedu.net.cn # 配置 LOG_DIR="/tidb/logs" METRICS_FILE="/tidb/metrics/script_status.prom" #
创建指标文件目录 mkdir -p /tidb/metrics # 检查脚本执行状态 check_script_status() { SCRIPT_NAME=$1
LOG_FILE="${LOG_DIR}/${SCRIPT_NAME}.log" if [ -f $LOG_FILE ]; then LAST_EXECUTION=$(tail -1
$LOG_FILE | grep "完成" ) if [ -n "$LAST_EXECUTION" ]; then STATUS=1 else STATUS=0 fi else STATUS=0 fi
echo "# HELP tidb_script_status Script execution status" echo "# TYPE tidb_script_status gauge"
echo "tidb_script_status{script=\" $SCRIPT_NAME\"} $STATUS" } # 生成指标 cat> $METRICS_FILE << EOF
$(check_script_status "daily_check" ) $(check_script_status "weekly_check" )
$(check_script_status "basic_check" ) $(check_script_status "advanced_check" ) EOF EOF ###
步骤2:配置Prometheus采集 $ cat>> prometheus.yml << EOF - job_name: 'script_status' static_configs: -
targets: ['localhost:9101'] metrics_path: '/metrics' EOF ### 步骤3:启动指标服务 $ nohup bash
-c 'while true; do ./script_status.sh; sleep 60; done' & $ python3 -m http.server 9101
--directory /tidb/metrics ## 案例3:告警集成 ### 步骤1:配置告警脚本 $ cat> alert.sh << EOF #!/bin/bash #
alert.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn # 配置
ALERT_LEVEL="$1" ALERT_MESSAGE="$2" LOG_FILE="/tidb/logs/alert.log" # 日志函数 log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1″
}
# 发送邮件
send_email() {
# 邮件配置
SMTP_SERVER=”smtp.example.com”
SMTP_PORT=”587″
SMTP_USER=”admin@example.com”
SMTP_PASSWORD=”password”
SENDER=”admin@example.com”
RECEIVERS=”admin@example.com”
# 创建邮件内容
SUBJECT=”[TiDB告警] $ALERT_LEVEL: $ALERT_MESSAGE”
BODY=”告警级别: $ALERT_LEVEL\n告警信息: $ALERT_MESSAGE\n告警时间: $(date +’%Y-%m-%d %H:%M:%S’)”
# 发送邮件
echo “$BODY” | mail -s “$SUBJECT” -r “$SENDER” $RECEIVERS
}
# 主函数
main() {
log “告警: $ALERT_LEVEL – $ALERT_MESSAGE”
send_email
}
# 执行主函数
main
EOF
### 步骤2:修改巡检脚本添加告警
$ cat >> /tidb/scripts/daily_check.sh << EOF # 检查磁盘空间 DISK_USAGE=$(df -h | grep /tidb |
awk '{print $5}' | sed 's/%//g' ) if [ $DISK_USAGE -gt 80 ]; then
/tidb/scripts/alert.sh "WARNING" "磁盘使用率超过80%" fi # 检查连接数 CONNECTIONS=$($MYSQL_BIN -h $HOST
-P $PORT -u $USER -p$PASSWORD -e "SHOW STATUS LIKE 'Threads_connected';" | grep
Threads_connected | awk '{print $2}' ) if [ $CONNECTIONS -gt 5000 ]; then
/tidb/scripts/alert.sh "WARNING" "连接数超过5000" fi EOF ### 步骤3:测试告警 $
/tidb/scripts/alert.sh "TEST" "测试告警"
4.3 告警集成案例
告警集成案例:
## 案例1:邮件告警
### 步骤1:配置邮件告警
$ cat > email_alert.sh << EOF #!/bin/bash # email_alert.sh #
from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn # 配置
ALERT_LEVEL="$1" ALERT_MESSAGE="$2" LOG_FILE="/tidb/logs/alert.log" # 日志函数 log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1″
}
# 发送邮件
send_email() {
# 邮件配置
SMTP_SERVER=”smtp.example.com”
SMTP_PORT=”587″
SMTP_USER=”admin@example.com”
SMTP_PASSWORD=”password”
SENDER=”admin@example.com”
RECEIVERS=”admin@example.com”
# 创建邮件内容
SUBJECT=”[TiDB告警] $ALERT_LEVEL: $ALERT_MESSAGE”
BODY=”告警级别: $ALERT_LEVEL\n告警信息: $ALERT_MESSAGE\n告警时间: $(date +’%Y-%m-%d %H:%M:%S’)”
# 发送邮件
echo “$BODY” | mail -s “$SUBJECT” -r “$SENDER” $RECEIVERS
}
# 主函数
main() {
log “告警: $ALERT_LEVEL – $ALERT_MESSAGE”
send_email
}
# 执行主函数
main
EOF
### 步骤2:配置巡检脚本调用告警
$ cat >> /tidb/scripts/daily_check.sh << EOF # 检查磁盘空间 DISK_USAGE=$(df -h | grep /tidb |
awk '{print $5}' | sed 's/%//g' ) if [ $DISK_USAGE -gt 80 ]; then
/tidb/scripts/email_alert.sh "WARNING" "磁盘使用率超过80%" fi EOF ### 步骤3:测试邮件告警 $
/tidb/scripts/email_alert.sh "TEST" "测试邮件告警" ## 案例2:微信告警 ### 步骤1:配置微信告警 $ cat>
wechat_alert.sh << EOF #!/bin/bash # wechat_alert.sh #
from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn # 配置
ALERT_LEVEL="$1" ALERT_MESSAGE="$2" LOG_FILE="/tidb/logs/alert.log" # 日志函数 log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1">> $LOG_FILE
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1″
}
# 发送微信通知
send_wechat() {
# 企业微信配置
CORP_ID=”your_corp_id”
AGENT_ID=”your_agent_id”
API_SECRET=”your_api_secret”
TO_USER=”@all”
# 获取access_token
ACCESS_TOKEN=$(curl -s
“https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CORP_ID&corpsecret=$API_SECRET”
| jq -r ‘.access_token’)
# 创建消息内容
MESSAGE=”告警级别: $ALERT_LEVEL\n告警信息: $ALERT_MESSAGE\n告警时间: $(date +’%Y-%m-%d
%H:%M:%S’)”
# 发送微信通知
curl -s -X POST
“https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$ACCESS_TOKEN” \
-H “Content-Type: application/json” \
-d “{
\”touser\”: \”$TO_USER\”,
\”msgtype\”: \”text\”,
\”agentid\”: $AGENT_ID,
\”text\”: {
\”content\”: \”$MESSAGE\”
},
\”safe\”: 0
}”
}
# 主函数
main() {
log “告警: $ALERT_LEVEL – $ALERT_MESSAGE”
send_wechat
}
# 执行主函数
main
EOF
### 步骤2:配置巡检脚本调用微信告警
$ cat >> /tidb/scripts/daily_check.sh << EOF # 检查连接数 CONNECTIONS=$($MYSQL_BIN -h
$HOST -P $PORT -u $USER -p$PASSWORD -e "SHOW STATUS LIKE 'Threads_connected';" |
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
