首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 業務高峰期 TPS 統計方案:定時任務 + 實時計算雙腳本架構

     編輯:MySQL 綜合教學

MySQL 業務高峰期 TPS 統計方案:定時任務 + 實時計算雙腳本架構

針對「每天 09:00-18:00 核心業務時段 TPS」的監控需求,單次採樣無法反映全時段趨勢。本文設計雙腳本協作方案:Job 腳本每天 09:00 定時採集基線值;查詢腳本隨時計算「從 09:00 到當前」的累積平均 TPS。

架構設計

┌──────────────────┐     基線文件      ┌──────────────────┐
│  09:00 定時 Job  │ ───────────────▶  │  實時查詢腳本    │
│  采集 Com_* 計數 │  tps_everydat_9   │  讀取基線 + 當前 │
│  記錄啟動時間戳  │  tps_lastime      │  計算累積 TPS    │
└──────────────────┘                   └──────────────────┘

腳本一:每日基線採集 Job(tps_daily_baseline.sh)

#!/bin/bash
# 每天 09:00 通過 crontab 執行:0 9 * * * /path/tps_daily_baseline.sh

MYSQL_USER="root"
MYSQL_PASS="123"
MYSQL_HOST="localhost"
DATE_TAG=$(date +%Y%m%d)
BASE_DIR="/root/monitor"

# 輸出文件
BASELINE_FILE="${BASE_DIR}/tps_everydat_9.${DATE_TAG}.txt"
TIME_FILE="${BASE_DIR}/tps_lastime.${DATE_TAG}.txt"

# 記錄基線時間
date "+%Y-%m-%d %H:%M:%S" > "${TIME_FILE}"

# 采集三大寫入計數器
get_counter() {
    mysql -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASS" -N -e \
        "SHOW GLOBAL STATUS WHERE Variable_name IN ('Com_insert','Com_update','Com_delete');" |
    awk '{sum+=$2} END {print sum}'
}

tps_sum=$(get_counter)
echo "$tps_sum" > "${BASELINE_FILE}"

echo "[$(date)] Baseline recorded: TPS_SUM=$tps_sum, TIME=$(cat ${TIME_FILE})"

腳本二:實時 TPS 查詢(tps_realtime_query.sh)

#!/bin/bash
# 隨時執行,計算 09:00 至今的平均 TPS

MYSQL_USER="root"
MYSQL_PASS="123"
MYSQL_HOST="localhost"
DATE_TAG=$(date +%Y%m%d)
BASE_DIR="/root/monitor"

BASELINE_FILE="${BASE_DIR}/tps_everydat_9.${DATE_TAG}.txt"
TIME_FILE="${BASE_DIR}/tps_lastime.${DATE_TAG}.txt"

# 檢查基線文件是否存在
[[ ! -f "$BASELINE_FILE" ]] && { echo "❌ 基線文件不存在,請確認 09:00 Job 是否執行"; exit 1; }

# 讀取基線
tps_old=$(cat "$BASELINE_FILE")
start_time_str=$(cat "$TIME_FILE")

# 獲取當前計數器
get_counter() {
    mysql -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASS" -N -e \
        "SHOW GLOBAL STATUS WHERE Variable_name IN ('Com_insert','Com_update','Com_delete');" |
    awk '{sum+=$2} END {print sum}'
}

tps_new=$(get_counter)

# 計算時間差(秒)
start_sec=$(date -d "$start_time_str" +%s)
end_sec=$(date +%s)
elapsed=$((end_sec - start_sec))

# 防除零
[[ $elapsed -le 0 ]] && { echo "⏱ 時間異常"; exit 1; }

# 計算累積 TPS
tps_diff=$((tps_new - tps_old))
tps_avg=$(awk "BEGIN {printf \"%.2f\", $tps_diff / $elapsed}")

echo "=========================================="
echo "  統計區間: ${start_time_str} ~ $(date '+%Y-%m-%d %H:%M:%S')"
echo "  歷時: ${elapsed} 秒"
echo "  寫入增量: ${tps_diff}"
echo "  平均 TPS: ${tps_avg}"
echo "=========================================="

部署與自動化

# 1. 創建目錄並賦權
mkdir -p /root/monitor
chmod +x tps_daily_baseline.sh tps_realtime_query.sh

# 2. 配置 crontab (root)
crontab -e
# 每天 09:00 採集基線
0 9 * * * /root/monitor/tps_daily_baseline.sh >> /root/monitor/tps_job.log 2>&1

# 3. 可選:每 5 分鐘自動推送到監控系統
*/5 * * * * /root/monitor/tps_realtime_query.sh --prom >> /var/lib/node_exporter/textfile_collector/tps_business.prom

關鍵指標對比

指標單次採樣 TPS業務時段累積 TPS
反映範圍當前瞬間吞吐全時段平均水平
適用場景性能抖動排查、容量壓測業務健康度、SLA 考核、趨势分析
抗干擾性受瞬時大事務影響大平滑短時尖峰,更穩健

進階優化建議

  1. 多維度拆解:分別統計 Insert TPS、Update TPS、Delete TPS,識別寫入熱點類型。
  2. 分時段統計:上午/下午/晚高峰分別建立基線,產出更精細曲線。
  3. 異常自動告警:TPS 連續 3 次採樣低於基線 50% 或高於 200% 觸發告警。
  4. 持久化存儲:寫入 InfluxDB/TimescaleDB,Grafana 繪製「業務時段 TPS 熱力圖」。

總結

「定時基線 + 實時差值」雙腳本模式,以極低開銷實現業務級 TPS 連續觀測。核心優勢:**無侵入、無中間件、標準 SQL 計數器、易於集成現有監控體系**。配合 crontab 與文本文件收集器,即可構建生產級「業務時段吞吐儀表盤」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved