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

Shell 腳本實現 MySQL 集群全局實時監控:monrep 多進程並發采集方案

     編輯:MySQL 綜合教學

Shell 實現 MySQL 集群全局實時監控:monrep 多進程並發采集方案

面對數十上百個 MySQL 實例組成的集群,逐台登錄 SHOW SLAVE STATUS、SHOW MASTER STATUS 效率極低。本文介紹一個基於 Linux Shell 的輕量級監控工具 monrep,通過進程池並發采集、臨時文件隔離、兩秒刷新,實現集群級實時鳥瞰。

工具特性

  • 實時刷新:默認 2 秒輪詢一次,終端動態更新。
  • 高併發采集:固定 40 進程池並發 SSH 執行采集命令,規避網絡串行瓶頸。
  • 多用戶隔離:以 PID 命名臨時文件(/tmp/monrep_$PID_*),支持多會話並行運行。
  • 零依賴部署:僅需 Bash + SSH 免密登錄 + MySQL 客戶端,無需額外監控平台。

使用方法

# 查看幫助
monrep -h
Usage: monrep [-d dbname]
  -d  Database Cluster name
  -h  Display basic help

# 監控名為 dbx 的集群
monrep -d dbx

核心實現邏輯

#!/bin/bash
# monrep - MySQL Replication Cluster Monitor
# Author: skate
# Date: 2015/01/19

CLUSTER_NAME=$1
TMP_DIR="/tmp/monrep_$$"  # PID 隔離
mkdir -p "$TMP_DIR"

# 1. 從配置文件/服務發現獲取集群主機列表
# 示例:hosts=("10.0.1.10" "10.0.1.11" "10.0.1.12")
get_cluster_hosts() {
    # 實際可對接 CMDB、Consul、Etcd 或靜態文件
    cat "/etc/monrep/clusters/${CLUSTER_NAME}.hosts"
}

# 2. 單主機采集函數(後台並發運行)
collect_host() {
    local host=$1
    local out_file="$TMP_DIR/${host}.out"
    # SSH 免密執行采集命令,超時 5 秒
    ssh -o ConnectTimeout=3 -o BatchMode=yes "$host" \
        "mysql -e 'SHOW SLAVE STATUS\G; SHOW MASTER STATUS\G;'" > "$out_file" 2>&1
}

# 3. 進程池並發控制(固定 40 並發)
run_parallel() {
    local hosts=($(get_cluster_hosts))
    local max_jobs=40
    local job_count=0
    for host in "${hosts[@]}"; do
        collect_host "$host" &
        ((job_count++))
        if ((job_count >= max_jobs)); then
            wait -n  # 等待任意一個後台任務結束
            ((job_count--))
        fi
    done
    wait  # 等待所有剩餘任務
}

# 4. 聚合輸出渲染
render_dashboard() {
    clear
    echo "=== MySQL Cluster: $CLUSTER_NAME | $(date) ==="
    printf "%-15s %-10s %-10s %-15s %-15s\n" "HOST" "IO_RUN" "SQL_RUN" "MASTER_LOG" "SEC_BEHIND"
    for f in "$TMP_DIR"/*.out; do
        host=$(basename "$f" .out)
        io_run=$(grep -i "Slave_IO_Running" "$f" | awk '{print $2}')
        sql_run=$(grep -i "Slave_SQL_Running" "$f" | awk '{print $2}')
        master_log=$(grep -i "Master_Log_File" "$f" | awk '{print $2}')
        sec_behind=$(grep -i "Seconds_Behind_Master" "$f" | awk '{print $2}')
        printf "%-15s %-10s %-10s %-15s %-15s\n" "$host" "$io_run" "$sql_run" "$master_log" "$sec_behind"
    done
}

# 主循環
trap "rm -rf $TMP_DIR; exit" INT TERM EXIT
while true; do
    run_parallel
    render_dashboard
    sleep 2
done

部署前置條件

  1. 管理機與所有 MySQL 主機互信 SSH Key(ssh-copy-id)。
  2. 管理機安裝 mysql 客戶端(yum install mysql)。
  3. MySQL 監控賬號擁有 REPLICATION CLIENT 權限:
    GRANT REPLICATION CLIENT ON *.* TO 'monrep'@'%' IDENTIFIED BY 'password';
  4. 集群主機列表文件:/etc/monrep/clusters/dbx.hosts,每行一個 IP。

擴展建議

  • 增加 SHOW GLOBAL STATUS 采集 QPS、Threads_connected、Innodb_buffer_pool_wait_free 等核心指標。
  • 輸出 JSON 格式,對接 Grafana/Prometheus 推送網關。
  • 異常閾值告警:Seconds_Behind_Master > 30 或 Slave_SQL_Running != Yes 發送郵件/鉚釘/企微。
  • 歷史數據落地 InfluxDB,支撐趨勢分析與容量規劃。

monrep 以「極簡依賴、極速部署、實時可見」解決了中小規模 MySQL 集群無監控平台時的可視化痛點,是 DBA 隨身工具箱的利器。

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