如何用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
相关产品推荐
相关产品推荐

