因线上机器基本都是单机多实例,有时候会出现因为某个实例而影响了整个机器的性能。因缺少进程级别的监控,事后想分析是哪个实例跑满了系统资源往往比较困难。为了解决这一运维痛点,迫切希望实现进程级别的监控。
进程级别的资源监控,包括但是不限于CPU, 内存, 磁盘IO, 网络流量。
$ uname -a
Linux 3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
其他环境没有测试, 可能会出现异常,请根据实际情况解决。
进到虚拟环境安装必要的模块
virtualenv -p /usr/local/python3/bin/python3 py37env
source py37env/bin/activate
pip install -r init/requirements.txt
用自带的虚拟环境,这三个操作就不用做了
ip,top,netstat,df,awk,grep,sed,free,lscpu,uptime,iftop,iotop,md5sum,tr,cd,ssh,rsync,python3,timeout
- 线程1
这个线程会做三个事情:
(1)在server重启的时候会去读【tb_monitor_version】表,判断当前版本号跟MySQL记录的版本号是否一致,如果不一致就会去更新MySQL记录的版本号。然后将【tb_monitor_host_config】表所有istate=2的节点更新为istate=1。
(2)管理client上线下线,每30s去读一次【tb_monitor_host_config】表,将需要上线的节点或者需要下线的节点进行维护。istate=1表示需要上线,就会去部署监控脚本(升级就更新代码),并更新为istate=2,istate=0表示需要下线,会去下线该client节点并更新为istate=-1。
(3)管理client状态,每30s去读一次【tb_monitor_host_config,tb_monitor_alert_info,tb_monitor_host_info】表(三表关联),将最近两分钟没有上报的client且最近5min没有被告警的节点统计出来并告警。
- 线程2
这个线程做两个事:
(1)等待client上报监控数据,然后进行二次分析并写到MySQL中。
(2)返回当前版本号给client。
client端会做三个事情
(1)六线程并行去采集【机器cpu】【机器内存】【机器磁盘】【机器网络】【进程网络】【进程io,进程cpu,进程内存】。采集完毕后,主线程会进行分析并上报给server端。
(2)在上报过程中如果遇到连续三次server都是异常状态就会将server异常记录(避免多个client同时告警)到【tb_monitor_alert_info】表发送告警。
(3)上报完成后会判断自己的版本号跟server端返回的版本号是否一致,如果不一致就会退出程序,等待crontab拉起,以此完成升级。
server端完成代码更新,在重启server的时候会将新代码同步到各个client。
MySQL的作用是存版本信息,client ip配置,监控数据,以及告警状态等。
grafana的作用是从MySQL读取监控数据并展示出来。
采用企业微信的机器人作为告警通道。
客户端数据采集/分析部分可以参考这个文章第三部分第二点 https://mp.weixin.qq.com/s/UCSZWYJ5D4_EoK6mud2pPQ
软件版本可能存在兼容性问题,所以其他版本不确定是否能用,请各自测试调试。
mkdir -p /opt/soft/git
cd /opt/soft/git
git clone https://gitee.com/mo-shan/rpc_for_process_monitor.git
依赖Python3环境,建议3.7.4,要求python3在PATH里面,安装过程略。
cp -r /opt/soft/git/rpc_for_process_monitor /opt/soft/rpc_for_monitor #注意这里的目录是有区别的, 主要是希望开发环境跟实际部署的目录不一样, 避免失误
cd /opt/soft/rpc_for_monitor
$ tree -L 2
.
├── conf
│ └── config.ini #配置文件
├── img #忽略
│ ├── all-info.png
│ ├── cpu-info.png
│ ├── disk-info.png
│ ├── grafana-data-source-1.png
│ ├── grafana-data-source-2.png
│ ├── grafana-data-source-3.png
│ ├── grafana-data-source-4.png
│ ├── grafana-data-source-5.png
│ ├── grafana-data-source-6.png
│ ├── grafana-data-source-7.png
│ ├── mem-info.png
│ ├── net-info.png
│ └── process-info.png
├── init #初始化文件
│ ├── grafana.json #grafana配置模板
│ ├── init.sql #MySQL建表语句
│ └── requirements.txt #python3依赖的模块
├── lib #库文件
│ ├── Config.py #解析config.ini
│ ├── ConnectMySQL.py #连接并操作MySQL
│ ├── globalVar.py #全局变量
│ ├── Public.py #公共函数
│ └── __pycache__
├── LICENSE
├── logs #日志目录
│ └── info.log #日志文件
├── py37env #虚拟环境,要求在/opt/soft/rpc_for_monitor/py37env下才能使用(activate等文件的路径写死了)
│ ├── bin
│ ├── include
│ ├── lib
│ └── pip-selfcheck.json
├── README.md #帮助文档
├── rpc.py #主程序
├── start_server.sh #server端的启动脚本
└── state #忽略
└── state.log
11 directories, 28 files
vim conf/config.ini #根据实际情况进行编辑
[global]
version = 1.1 #版本号, 通过这个变量控制server和client的代码,如果server和client版本号不一样client会进行重启,以此达到升级效果
interval_time = 30 #监控采集粒度单位是秒,即30秒一次,这个不是完全精确的30一次
retention_day = 30 #监控数据保留天数,即30天
log_file = /opt/soft/rpc_for_monitor/logs/info.log #日志文件
script_dir = /opt/soft/rpc_for_monitor #脚本目录,不建议变更
mount_part = /work #数据盘挂载点, 也可以不配置,置为空,但是不能删除这个配置项
log_size = 20 #日志文件大小(MB)限制,超过这个值就会删除历史日志
[RULE]
cpu = 200 #采集的阈值,200表示某个进程使用cpu大于等于200%才会被采集
mem = 10 #采集的阈值,10表示某个进程使用内存大于等于10GB才会被采集
io = 10240 #采集的阈值,10240表示某个进程使用io(读写有一个就算)大于等于10MB才会被采集
net = 10240 #采集的阈值,10240表示某个进程使用网络(进出有一个就算)大于等于10MB才会被采集
[CLIENT]
path = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin #预定义一下操作系统的path,因为client会维护一个cront任务,所以避免因为环境变量问题导致脚本执行报错,需要定义一下path
python3 = /usr/local/python3 #python3安装目录
py3env = /opt/soft/rpc_for_monitor/py37env #python3虚拟环境目录,工程自带了一个虚拟环境,可以直接用(前提是脚本目录没有变更)
[MSM]
wx_url = xxxx #企业微信报警url,告警功能需要用户自己修改一下并测试(如果是告警机器人url+key,可以直接配上就能用,本例就是通过企业微信机器人发送告警)
[Monitor] #存放监控数据的MySQL的配置
mysql_host = xxxx
mysql_port = xxxx
mysql_user = xxxx
mysql_pass = xxxx
省略部分不建议变更的配置
所有目录不建议修改, 要不然需要变更的地方太多了
安装MySQL略,建议的版本:5.7
用MySQL管理员用户登录并操作。
create user 'monitor_ro'@'192.%' identified by 'pass1';
grant select on dbzz_monitor.* to 'monitor_ro'@'192.%';
create user 'monitor_rw'@'192.%' identified by 'pass2';
grant select,insert,update,delete on dbzz_monitor.* to 'monitor_rw'@'192.%';
monitor_ro用户给grafana使用, monitor_rw用户是给程序写入监控数据的(server端写数据,client上报给server)。所以注意的是,monitor_ro用户要给grafana机器授权,monitor_rw用户要给所有监控对象授权,这个目的是用来控制当server失联了,第一个发现的client就会向表里写一条告警记录并告警,避免其他client重复操作。
用MySQL管理员用户登录并操作。
cd /opt/soft/rpc_for_monitor
mysql < init/init.sql
所有表放在dbzz_monitor库下
(dba:3306)@[dbzz_monitor]>show tables;
+----------------------------+
| Tables_in_dbzz_monitor |
+----------------------------+
| tb_monitor_alert_info | # 告警表, 触发告警就会在里面写入一条记录, 避免同一时间多次告警。
| tb_monitor_disk_info | # 磁盘信息表,多个盘会记录多条记录
| tb_monitor_host_config | # client配置表,需要采集监控的机器配置到这里面就行
| tb_monitor_host_info | # 系统层面的监控记录到这里面
| tb_monitor_port_net_info | # 端口级别的网络监控会记录到这里面
| tb_monitor_process_info | # 这里面是记录了进程信息,全局的
| tb_monitor_process_io_info | # 这里是记录的进程的网络监控数据
+----------------------------+
6 rows in set (0.00 sec)
(dba:3306)@[dbzz_monitor]>
所有表都有详细的注释,请看表的建表注释。
配置客户端很简单,只需要往MySQL表里面写入一条记录。
use dbzz_monitor;
insert into tb_monitor_host_config select 0,'192.168.168.11',1; #多个机器就写多条记录
这里有个限制条件,这个client端已经有python3环境,否则可能会报错。
安装略。
grafana版本:8.3.1,建议小版本也要一致。 https://dl.grafana.com/enterprise/release/grafana-enterprise-8.3.1.linux-amd64.tar.gz
这部分涉及到grafana的配置,所有的配置都已经导成json文件,用户直接导入即可。
具体的操作如下。
新建一个数据源
需要选择MySQL数据源
数据源的名称要求写【dba_process_monitor】,如果跟grafana配置不一致可能会有影响。
$ ll init/grafana.json
-rw-r--r-- 1 root root 47875 Jun 23 14:28 init/grafana.json
本配置是在grafana 8.3.1 版本下生成的。需要注意一下版本,不同版本可能不兼容。
将server端的启动脚本配置到crontab中,可以起到守护进程的作用。
echo "*/1 * * * * bash /opt/soft/rpc_for_monitor/start_server.sh" >> /var/spool/cron/root
client端不用管,server启动以后会自动去管理client。
配置完成后,等待一分钟查看日志【/opt/soft/rpc_for_monitor/logs/info.log】,可以看到类似下面的日志。
[ 2022-06-30 15:13:01 ] [ INFO ] [ V1.1 Listening for '0.0.0.0:9300' ]
[ 2022-06-30 15:13:04 ] [ INFO ] [ 新加监控节点成功 ] [ 192.168.168.11 ]
[ 2022-06-30 15:13:11 ] [ INFO ] [ 监控数据上报成功 ] [ 192.168.168.11 ]
端口默认是9300,可以通过修改【/opt/soft/rpc_for_monitor/start_server.sh】这个文件就行变更监听端口。
总共有五个ROW,前面五个是机器级别的监控图,process是进程的监控图
整个机器的CPU使用情况。
整个机器的内存使用情况。
整个机器的磁盘使用情况,如果没有定义具体的挂载点,会采集所有的挂载点。
整个机器的网络使用情况。
会看到具体的进程对系统资源的使用情况
-
server,client端一定要有python3环境。
-
如果有多个server,在启动server的时候就要指定多个(用逗号隔开),要不然在部署client的时候只会配上单个server,配置多个的好处就是如果第一个宕机/异常,client会上报给其他的server。
-
server在运行过程中可以添加client,只需要在【tb_monitor_host_config】表添加istate为1的记录即可。同理,如果下线的话就更新istate为0即可,运行中的istate为2,下线后的istate为-1。
-
该工具有告警功能(如果配置),server挂了(client连续三次都连不上server),会由第一个发现的client记录到MySQL里面,并发送告警,如果client挂了,server会发现并告警(超过两分钟未上报告警数据)。
-
如果需要升级代码,只需要测试好新代码,确认无误后,更新到server的部署脚本目录,然后kill掉server进程即可,等待crontab拉起就行了,client端的代码不用人为进行更新。需要注意,新代码一定要记得修改配置文件的版本号,要不然server端不会发现版本不一致,也就不会下发相关任务去更新client的代码。
-
如果需要修改部署目录请根据实际情况修改【conf/config.ini】【lib/Config.py】,注意这时候自带的虚拟环境将不能使用了。强烈不建议变更目录结构或者目录名。
-
因考虑到MySQL性能问题及grafana渲染性能问题,所以增加了采集阈值功能,所以部分面板的监控数据可能会没有(该时间段的进程没有满足采集阈值的数据)。
本文所有内容仅供参考,因各自环境不同,在使用文中代码时可能碰上未知的问题。如有线上环境操作需求,请在测试环境充分测试。