You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript或PHP编写脚本检查MySQL Galera Cluster状态?

实现PHP/JavaScript检查MySQL Galera Cluster状态的方法及可行性

用PHP或JavaScript(Node.js环境)检查Galera集群状态完全可行,核心逻辑是通过数据库连接执行Galera专属的状态查询语句,解析集群节点的同步状态、连接情况等关键指标。以下是具体实现方案:

PHP实现

前置条件

确保PHP已安装mysqli或PDO扩展(绝大多数环境默认已预装),同时给监控用的数据库账号分配仅SELECT权限(避免使用root账号):

CREATE USER 'monitor_user'@'%' IDENTIFIED BY 'your_secure_password';
GRANT SELECT ON mysql.* TO 'monitor_user'@'%';
FLUSH PRIVILEGES;

代码示例

<?php
// 替换为你的Galera集群节点信息
$dbConfig = [
    'host' => '192.168.1.100',
    'user' => 'monitor_user',
    'pass' => 'your_secure_password',
    'db'   => 'mysql'
];

try {
    // 建立PDO连接
    $pdo = new PDO(
        "mysql:host={$dbConfig['host']};dbname={$dbConfig['db']};charset=utf8mb4",
        $dbConfig['user'],
        $dbConfig['pass'],
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    // 查询Galera专属状态变量
    $stmt = $pdo->query("SHOW STATUS LIKE 'wsrep_%'");
    $galeraStats = [];
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $galeraStats[$row['Variable_name']] = $row['Value'];
    }

    // 解析核心健康指标
    $healthCheck = [
        '集群节点数' => $galeraStats['wsrep_cluster_size'],
        '已连接集群' => $galeraStats['wsrep_connected'] === 'ON' ? '是' : '否',
        '可提供服务' => $galeraStats['wsrep_ready'] === 'ON' ? '是' : '否',
        '节点状态' => $galeraStats['wsrep_local_state_comment'],
        '已同步' => $galeraStats['wsrep_local_state'] == 4 ? '是' : '否'
    ];

    // 输出结果(可根据需求改为JSON格式供监控系统调用)
    foreach ($healthCheck as $item => $status) {
        echo "{$item}: {$status}\n";
    }

} catch (PDOException $e) {
    die("检查失败: " . $e->getMessage());
}
?>

Node.js(JavaScript)实现

前置条件

先安装mysql2库(支持Promise,更适合异步场景):

npm install mysql2

代码示例

const mysql = require('mysql2/promise');

// 替换为你的Galera集群节点信息
const dbConfig = {
    host: '192.168.1.100',
    user: 'monitor_user',
    password: 'your_secure_password',
    database: 'mysql'
};

async function checkGaleraHealth() {
    let connection;
    try {
        connection = await mysql.createConnection(dbConfig);
        // 查询Galera状态变量
        const [rows] = await connection.execute("SHOW STATUS LIKE 'wsrep_%'");
        
        // 转换为键值对格式
        const galeraStats = rows.reduce((acc, row) => {
            acc[row.Variable_name] = row.Value;
            return acc;
        }, {});

        // 解析核心健康指标
        const healthCheck = {
            clusterSize: galeraStats.wsrep_cluster_size,
            isConnected: galeraStats.wsrep_connected === 'ON',
            isReady: galeraStats.wsrep_ready === 'ON',
            localState: galeraStats.wsrep_local_state_comment,
            isSynced: galeraStats.wsrep_local_state == 4
        };

        console.log('Galera集群健康检查结果:', healthCheck);
    } catch (err) {
        console.error('检查失败:', err.message);
    } finally {
        if (connection) await connection.end();
    }
}

// 执行检查
checkGaleraHealth();

关键指标说明

解析结果时重点关注以下几个Galera状态变量:

  • wsrep_cluster_size: 集群总节点数,若数值小于预期,说明有节点离线
  • wsrep_connected: 当前节点是否已加入集群(ON为正常)
  • wsrep_ready: 当前节点是否可接受客户端查询(ON为正常)
  • wsrep_local_state: 节点同步状态,4代表Synced(已完成同步,可正常提供服务)
  • wsrep_local_state_comment: 状态的文字描述,比如Synced、Joining(正在加入集群)、Donor(正在为新节点同步数据)

额外建议

  • 可以同时连接多个集群节点做交叉验证,避免单个节点故障导致误判
  • 若用于生产环境监控,可将脚本封装为定时任务,或把结果推送到监控系统实现告警

内容的提问来源于stack exchange,提问作者arti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:10:31