主机监测平台(一) ---监测脚本与部署

创新实践课程项目,打算自己好好做一个完整的项目

设计思路

其实这个设想真的是一步一步递进的

具体的架构设计是在老师和朋友的推进下完成的

  1. 最初的草案

    使用Docker将各类微服务:监测域+展示域+代理域

    当时的想法比较简单,只是想用脚本抓数据,然后使用某种数据库存一下,然后后端获取,前端发送请求后展示,通过反向代理来实现网站访问

  2. 进阶版:监测域(临时存储)+存储域(持久存储)+通信域+模型域+后台+代理

    因为朋友在移动端不能直接连接或监听我开的redis数据库端口,所以我要重构一下,开一个websocket服务器连接移动端和web端的前端,实现实时展示

    同时,老师提到了一个问题,关于我的数据存储架构,一开始我想的比较简单,可能想到了redis存实时数据,然后由web端后台或者移动端再开数据库存一下历史数据,方便后续的调用或者模型训练

    于是有了如下的架构

    image-20231012160122946.png

    感觉,相对比较完善,再进阶下去,可以要到服务器集群了,到时候可以用上K8s,Hadoop之类的分布式框架

监测脚本

这部分比较简单,因为python中早就有对应的库了---psutil

顺带一提,这个库是跨平台的,所以脚本部署在服务器或者自己的主机都可以监测

import psutil
# 获取进程信息
processes = []
for process in psutil.process_iter(attrs=['pid', 'name', 'cpu_percent', 'memory_percent']):
    processes.append(process.info)
# 获取内存使用情况
memory = psutil.virtual_memory()
# 获取网卡流量
network = psutil.net_io_counters(pernic=True)
# 获取CPU使用率
cpu_usage = psutil.cpu_percent(interval=1, percpu=True)

其实这边只写了监控方面的代码

psutil还提供了一些函数可以实现,远程kill进程之类的函数

以此结合后续的一些阈值判断或者警示机制,可以实现一些后端业务逻辑

附上一个redis读取的示例:

client = redis.StrictRedis(host='106.54.***.**', port=6380, db=0)

try:
    # 获取键的值
    value = client.get('memory')
    print('Value:', value.decode('utf-8'))

except Exception as e:
    print('Error:', e)

finally:
    # 关闭连接
    client.close()

redis数据库

考虑到监控数据需要实时读写,我选择了redis缓存型数据库来存储我的实时数据。

import redis
# 连接到Redis数据库
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

# 将监控数据写入Redis数据库,使用JSON格式进行存储
redis_client.set('processes', json.dumps(processes))
redis_client.set('memory', json.dumps(memory._asdict()))
redis_client.set('network', json.dumps(network))
redis_client.set('cpu_usage', json.dumps(cpu_usage))

**注意:**redis官方中不提供windows版本,GitHub社区中有分支版本,博主自己并没有开windows版redis,而是头铁直接部署在服务器上(导致后续Docker部署的时候出现端口冲突 ( ,,•́ . •̀,, )

在老师提醒下,我决定再开一个SQLite存储一些持久化数据(下一期)

Docker部署

在Docker部署的时候需要注意

本身的微服务包括两部分:redis、python脚本

建议在python脚本对应的Docker 配置使用 Dockerfile

理由:分离redis和python,我一开始使用docker-compose.yml直接部署两个服务时,出现了问题要分别去检查redis和脚本,还要进入容器后才能进行相关调试,非常麻烦

文件结构

├── docker-compose.yml └── host-monitoring-platform ├── Dockerfile ├── monitor.py ├── README.md └── requirements.txt

Dockerfile:

# 使用官方Python运行时作为基础镜像                                 
FROM python:3.10

# 设置工作目录
WORKDIR /app

# 将requirements.txt复制到容器中的/app目录
COPY requirements.txt /app/

# 安装所需的Python依赖项
RUN pip install --no-cache-dir -r requirements.txt

# 将当前目录下的所有文件复制到容器的/app目录
COPY . /app/

# 指定容器启动时要执行的命令
CMD ["python3", "monitor.py"]

docker-compose.yml:

version: '3'                                                       
services:
  redis:
    image: "redis:latest"
    ports:
      - "6380:6379"
    volumes:
      - redis_data:/data

  monitoring_script:
    build:
      context: ./host-monitoring-platform
    volumes:
      - ./host-monitoring-platform:/app
    depends_on:
      - redis

volumes:
  redis_data:
  

部署:

docker-compose up -d

Tips

在容器环境里使用的python脚本连接redis 数据库 必须是容器内部的,而不是服务器本身的

因此,下面这句代码中的 host 应该改成 docker启动的服务名称 如 'redis'

redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

同时要注意,如果服务器本身开了redis服务,进行如下操作:

  1. 修改订阅脚本中的端口号(不是写入!!)

  2. 改端口容器映射的主机端口号

  3. 在云服务供应商的控制平台,创建对应的安全组规则

    因为在容器内部,redis的端口还是6379,而不是自己刚开的,所以在容器内部运行的脚本,访问redis的端口依旧是 6379

    ports:
      - "6388:6379"
    # 这里的 6388 是服务器端口,6379是容器端口
    

项目仓库

gitee仓库

README.md含部署教程


参考资料

Python常用库之psutil使用指南

小内存服务器生存指南 ——SWAP 虚拟内存


每日小知识:

Linux系统中的 SWAP 交换分区

  • 为什么要有SWAP的存在:
    1. 当你的Linux系统本身物理内存不足时,系统会将部分较不活跃的数据页转移到SWAP分区
    2. 有助于虚拟内存进行内存管理
    3. 操作系统休眠的时候,需要将RAM(内存)的内容转移至SWAP,方便马上恢复

如何配置可以看深入理解swap交换分区理解及扩存或者

一键部署脚本

wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh
文章作者: P4ul
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 打工人驿站
开发 数据库 容器 gitee python Docker
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝