GPFS监控及物理监控

这个 GPFS 集群监控项目提供了全面的监控能力,主要包括:

  1. GPFS 集群监控

    • 监控各节点的 GPFS 状态(active/down 等)
    • 跟踪 GPFS 版本信息
    • 记录节点状态变化历史
  2. 物理服务器监控

    • CPU 使用率和负载监控
    • 内存使用情况监控
    • 磁盘空间和使用率监控
    • 网络流量监控
  3. 数据可视化

    • Web 界面展示所有节点状态概览
    • 单个节点详细监控数据
    • 性能指标趋势图表(CPU、内存等)
    • 状态变化历史记录

部署步骤

前提条件

  • 所有节点(包括监控服务器)需安装 Python 3.6+
  • 节点间网络互通,开放 9876(代理)和 5000(Web)端口
  • 执行用户需具有 sudo 权限
  • 所有节点已安装 GPFS 客户端并可执行相关命令

手动部署步骤

  1. 部署节点代理(每个需要监控的节点)
# 复制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层的脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值