这个 GPFS 集群监控项目提供了全面的监控能力,主要包括:
-
GPFS 集群监控:
- 监控各节点的 GPFS 状态(active/down 等)
- 跟踪 GPFS 版本信息
- 记录节点状态变化历史
-
物理服务器监控:
- CPU 使用率和负载监控
- 内存使用情况监控
- 磁盘空间和使用率监控
- 网络流量监控
-
数据可视化:
- Web 界面展示所有节点状态概览
- 单个节点详细监控数据
- 性能指标趋势图表(CPU、内存等)
- 状态变化历史记录
部署步骤
前提条件
- 所有节点(包括监控服务器)需安装 Python 3.6+
- 节点间网络互通,开放 9876(代理)和 5000(Web)端口
- 执行用户需具有 sudo 权限
- 所有节点已安装 GPFS 客户端并可执行相关命令
手动部署步骤
- 部署节点代理(每个需要监控的节点):
# 复制agent目录到节点
cd agent
# 执行安装脚本
sudo ./install_agent.sh
2.部署监控服务器
# 编辑配置文件,设置需要监控的节点列表
vi server/config.py
# 复制server目录到监控服务器
cd server
# 执行启动脚本
sudo ./start_server.sh
批量部署步骤
如果需要监控的节点较多,可以使用批量部署脚本:
# 语法:./deploy_all.sh <节点1> <节点2> ... <监控服务器>
# 示例:
./deploy_all.sh node1.example.com node2.example.com node3.example.com monitor.example.com
代码如下:
agent
#!/usr/bin/env python3
from flask import Flask, jsonify
import psutil
import subprocess
import platform
import re
from datetime import datetime
app = Flask(__name__)
def get_gpfs_status():
"""获取本地节点的GPFS状态信息"""
try:
# 执行GPFS状态命令
result = subprocess.run(
['mmgetstate'],
capture_output=True,
text=True,
check=True,
timeout=10
)
# 解析节点编号和状态
node_number = None
node_state = None
# 处理mmgetstate命令输出
for line in result.stdout.splitlines():
if line.strip().startswith('Node number'):
continue # 跳过表头
match = re.match(r'\s*(\d+)\s+\S+\s+(\w+)\s*', line.strip())
if match:
node_number = match.group(1)
node_state = match.group(2)
# 获取GPFS版本
version_result = subprocess.run(
['mmgetversion', '--brief'],
capture_output=True,
text=True,
check=True,
timeout=5
)
gpfs_version = version_result.stdout.strip()
return {
'node_number': node_number,
'state': node_state,
'version': gpfs_version,
'error': None
}
except Exception as e:
return {
'node_number': None,
'state': 'unknown',
'version': None,
'error': str(e)
}
def get_system_metrics():
"""获取系统性能指标"""
# CPU信息
cpu_percent = psutil.cpu_percent(interval=1)
cpu_cores = psutil.cpu_count(logical=False)
cpu_logical_cores = psutil.cpu_count(logical=True)
cpu_load = psutil.getloadavg()
# 内存信息
mem = psutil.virtual_memory()
# 磁盘信息
disks = []
for part in psutil.disk_partitions():
if 'cdrom' in part.fstype or part.fstype == '':
continue
try:
usage = psutil.disk_usage(part.mountpoint)
disks.append({
'device': part.device,
'mount_point': part.mountpoint,
'fstype': part.fstype,
'total': round(usage.total / (1024**3), 2), # GB
'used': round(usage.used / (1024**3), 2),
'free': round(usage.free / (1024**3), 2),
'used_percent': usage.percent
})
except PermissionError:
continue
# 网络信息
net_io = psutil.net_io_counters(pernic=True)
network = []
for iface, stats in net_io.items():
network.append({
'interface': iface,
'bytes_sent': stats.bytes_sent,
'bytes_recv': stats.bytes_recv,
'packets_sent': stats.packets_sent,
'packets_recv': stats.packets_recv,
'errin': stats.errin,
'errout': stats.errout,
'dropin': stats.dropin,
'dropout': stats.dropout
})
return {
'cpu': {
'usage_percent': cpu_percent,
'cores_physical': cpu_cores,
'cores_logical': cpu_logical_cores,
'load_avg': {
'1min': round(cpu_load[0], 2),
'5min': round(cpu_load[1], 2),
'15min': round(cpu_load[2], 2)
}
},
'memory': {
'total': round(mem.total / (1024**3), 2), # GB
'used': round(mem.used / (1024**3), 2),
'available': round(mem.available / (1024**3), 2),
'used_percent': mem.percent
},
'disks': disks,
'network': network
}
@app.route('/metrics', methods=['GET'])
def metrics():
"""提供节点监控数据的API接口"""
return jsonify({
'hostname': platform.node(),
'ip_address': psutil.net_if_addrs()['eth0'][0].address if 'eth0' in psutil.net_if_addrs() else 'unknown',
'timestamp': datetime.now().isoformat(),
'gpfs': get_gpfs_status(),
'system': get_system_metrics()
})
if __name__ == '__main__':
# 启动HTTP服务,监听所有网络接口的9876端口
app.run(host='0.0.0.0', port=9876, debug=False)
agent安装方式
#!/bin/bash
# 节点代理安装脚本
# 安装依赖
echo "安装必要的依赖包..."
sudo pip3 install flask psutil requests
# 创建工作目录
echo "创建工作目录..."
sudo mkdir -p /opt/gpfs_monitor/agent
sudo chmod 755 /opt/gpfs_monitor/agent
# 复制代理程序
echo "部署代理程序..."
sudo cp node_agent.py /opt/gpfs_monitor/agent/
sudo chmod 755 /opt/gpfs_monitor/agent/node_agent.py
# 创建systemd服务
echo "配置系统服务..."
sudo tee /etc/systemd/system/gpfs-monitor-agent.service <<EOF
[Unit]
Description=GPFS Monitor Agent
After=network.target
[Service]
User=root
WorkingDirectory=/opt/gpfs_monitor/agent
ExecStart=/usr/bin/python3 /opt/gpfs_monitor/agent/node_agent.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 启动服务并设置开机自启
echo "启动服务..."
sudo systemctl daemon-reload
sudo systemctl start gpfs-monitor-agent
sudo systemctl enable gpfs-monitor-agent
# 开放防火墙端口
echo "配置防火墙..."
if command -v firewall-cmd &> /dev/null; then
sudo firewall-cmd --add-port=9876/tcp --permanent
sudo firewall-cmd --reload
elif command -v ufw &> /dev/null; then
sudo ufw allow 9876/tcp
fi
# 验证安装
echo "验证安装..."
if curl -s "http://localhost:9876/metrics" > /dev/null; then
echo "节点代理安装成功!"
else
echo "节点代理安装失败,请检查日志。"
exit 1
fi
服务端部署:
需部署web层
控制层
配置层
数据库层
调度层
在配置启动server层的脚本