主机监测平台(一) ---监测脚本与部署
主机监测平台(一) ---监测脚本与部署
创新实践课程项目,打算自己好好做一个完整的项目
设计思路
其实这个设想真的是一步一步递进的
具体的架构设计是在老师和朋友的推进下完成的
-
最初的草案
使用Docker将各类微服务:监测域+展示域+代理域
当时的想法比较简单,只是想用脚本抓数据,然后使用某种数据库存一下,然后后端获取,前端发送请求后展示,通过反向代理来实现网站访问
-
进阶版:监测域(临时存储)+存储域(持久存储)+通信域+模型域+后台+代理
因为朋友在移动端不能直接连接或监听我开的redis数据库端口,所以我要重构一下,开一个websocket服务器连接移动端和web端的前端,实现实时展示
同时,老师提到了一个问题,关于我的数据存储架构,一开始我想的比较简单,可能想到了redis存实时数据,然后由web端后台或者移动端再开数据库存一下历史数据,方便后续的调用或者模型训练
于是有了如下的架构
感觉,相对比较完善,再进阶下去,可以要到服务器集群了,到时候可以用上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服务,进行如下操作:
-
修改订阅脚本中的端口号(不是写入!!)
-
改端口容器映射的主机端口号
-
在云服务供应商的控制平台,创建对应的安全组规则
因为在容器内部,redis的端口还是6379,而不是自己刚开的,所以在容器内部运行的脚本,访问redis的端口依旧是 6379
ports: - "6388:6379" # 这里的 6388 是服务器端口,6379是容器端口
项目仓库
README.md含部署教程
参考资料
每日小知识:
Linux系统中的 SWAP 交换分区
- 为什么要有SWAP的存在:
- 当你的Linux系统本身物理内存不足时,系统会将部分较不活跃的数据页转移到SWAP分区
- 有助于虚拟内存进行内存管理
- 操作系统休眠的时候,需要将RAM(内存)的内容转移至SWAP,方便马上恢复
如何配置可以看深入理解swap交换分区理解及扩存或者
一键部署脚本
wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh