不知道大家在维护节点过程中有没有遇到各种异常情况导致的节点进程挂掉,节点不出块了,磁盘满了,节点网络有问题,发现了一些bug等等五花八门的问题最后导致节点被罚out出局的情况。
我们可以对照浏览器看一下现在各节点的稳定性状况,以下是在4月3日23:00左右前几位的节点的信息截图,其中稳定性一栏中黄色图标后面的数字即为节点被罚的次数,要知道现在的机制是只要被罚一次就会被踢出验证人列表,先不说这个惩罚是否过于严苛了。我们能发现即使是这些排名前列的节点被罚次数也是相当多的,一次没有被罚的节点连一半都不到。尽管新版本将会延长不出块惩罚时间,但是如果没有及时发现节点服务问题始终会面临被罚风险。那么问题来了,节点被罚现象是如此普遍,如何才能尽量避免呢,或者说有什么方法可以去减小我们节点故障的持续时间从而降低节点被罚的概率呢?解决方法是肯定有的,使用一些监控服务去监控我们的节点,在节点出现问题的时候及时发出报警,这样我们就有机会赶在被罚之前把节点的问题解决。
那么我们该选择哪种监控服务比较合适呢?
相信有过运维经验的小伙伴会说用一些开源的监控平台比如zabbix,nagios之类的就很好。没错对一些经验丰富的技术人员来说为节点搭一套zabbix或者nagios监控平台能很有效地解决这一问题。但是大多数人所管理的只有几个或者只有一个platon节点,如果为了这一两个节点再去部署一套监控平台不管是从人力成本还是主机资源成本上都是不太划算的。所以这里为大家推荐一款轻量级并且免费开源的监控服务 –Monit,Monit官网地址
下面为大家简要说下Monit监控服务安装与配置,详细地安装配置步骤也可以在官方的文档中进行查找。
一、 Monit服务安装
Monit的安装方式可以通过二进制包安装,也可以通过系统的安装工具比如apt-install方式安装,或者采用源码的方式。这里我使用最简单的apt方式安装,如过想了解其他安装方式也可以查看Monit的官方文档。
1) 更新apt源
sudo apt update
2) apt安装Monit
sudo apt install monit -y
3) 安装html2text以自动解析最新版本
sudo apt install html2text -y
4) 创建私有SSL证书(如果不启用SSL可以省略)
mkdir -p /var/certs/
openssl req -new -x509 -days 365 -nodes -out /var/certs/monit.pem -keyout /var/certs/monit.pem
chmod 0700 /var/certs/monit.pem
二、 Monit服务基本配置与操作:
1) monit5.25.1版本服务主配置文件为/etc/monit/monitrc
vim /etc/monit/monitrc
set daemon 60 #check services every 60 seconds
set logfile /var/log/monit.log
set idfile /var/lib/monit/id
set statefile /var/lib/monit/state
set eventqueue
basedir /var/lib/monit/events # set the base directory where events will be stored
slots 100 # optionally limit the queue size
set httpd port 52822 address 0.0.0.0 # 配置端口为adapters
ssl enable #启用 SSL
pemfile /var/certs/monit.pem #生成的SSL地址
allow 0.0.0.0/0.0.0.0 # 允许访问的IP
allow admin:“admin123!” # 账号为admin,密码为admin123!
以上配置可作为参考
2) Monit服务启动,停止,重载
启动:sudo service monit start
停止:sudo service monit stop
重启:sudo service monit restart
重载:sudo monit reload
3) Monit服务自定义监控配置
自定义监控项配置文件默认放在/etc/monit/conf.d目录中
3.1 监控服务配置语法
3.1.1 监控服务类型
check <类型> <服务名> [PATH ] [ADDRESS ]
其中类型是monit支持的监控类型,一共有:system、file、process、fifo、filesystem、directory、host、network、program。
服务名必需是英文且唯一,不可以出现重复,后面的带[]是根据类型需要添加的。
3.1.2服务类型语法
每个服务条目由关键字组成check,后面是服务类型。每个条目需要唯一的描述性名称,可以自由选择。此名称由Monit用于在内部和与用户的所有交互中引用该服务。
目前,支持九种类型的检查语句:
a. 进程
CHECK PROCESS <PIDFILE | MATCHING >
是程序的pid文件的绝对路径。pid文件是一个包含进程唯一ID的文件。如果pid文件不存在或不包含正在运行的进程的PID编号,则Monit将调用该条目的start方法(如果已定义)。
当进程没有pid文件时,可以使用进程名称匹配方式并使用进程名称模式匹配来查找要监视的进程。选择具有最长正常运行时间的最顶部匹配的父级,因此如果进程名称是唯一的,则此检查形式是最有用的。应该尽可能使用Pid文件,因为它定义了预期的PID。您可以测试一个进程是否匹配来自命令行使用的模式monit procmatch “regex-pattern”。这将列出匹配或不匹配的所有进程,regex模式。
b. 文件
CHECK FILE PATH
是文件的绝对路径。如果文件不存在,Monit将调用该条目的start方法(如果已定义),如果不指向常规文件类型(例如目录),Monit将禁用此条目的监视。如果Monit在被动模式下运行或者没有定义start方法,Monit只会在错误时发送警报。
c. Fifo
CHECK FIFO PATH
是fifo的绝对路径。如果fifo不存在,Monit将定义调用该条目的start方法,如果没有指向fifo类型(例如目录),Monit将禁用对该条目的监视。如果Monit在被动模式下运行或者没有定义start方法,Monit只会在错误时发送警报。
d. 文件系统
CHECK FILESYSTEM PATH
是设备/磁盘,安装点,文件或作为文件系统一部分的目录的路径。建议直接使用块特殊文件(例如Linux上的/dev/hda1或Solaris上的/dev/dsk/c0t0d0s1等)如果使用挂载点(例如/data),请注意文件系统是卸载的测试仍然是真的,因为挂载点存在。
如果文件系统不可用,Monit将调用该条目的start方法(如果已定义)。如果不指向文件系统,Monit将禁用对此条目的监视。如果Monit在被动模式下运行或者没有定义start方法,Monit只会在错误时发送警报。
e. 目录
CHECK DIRECTORY PATH
是目录的绝对路径。如果目录不存在,Monit将调用该条目的start方法(如果已定义)。如果不指向目录,monit将禁用对此条目的监视。如果Monit在被动模式下运行或者没有定义启动方法,Monit只会在错误时发送警报。
f. 远程主机
CHECK HOST ADDRESS
主机地址可以指定为主机名字符串或点分十进制格式的IP地址字符串。例如,tildeslash.com或“64.87.72.95”。
g. 系统
CHECK SYSTEM
唯一的名称通常是本地主机名,而是可以使用任何描述性名称。如果使用变量$ HOST作为名称,它将扩展为主机名。此检查允许监控一般系统资源,如CPU使用率,总内存使用或负载平均。该唯一名称在邮件警报中用作系统主机名,在M/Monit中用作主机条目的初始名称。
h. 自定义
CHECK PROGRAM PATH [TIMEOUT SECONDS]
是可执行程序或脚本的绝对路径。该方式通过检查程序的退出状态来触发报警。如果程序没有在秒内完成执行,Monit将终止它。默认程序超时为300秒(5分钟)。程序的输出被记录并在用户界面和警报中可用,默认情况下最大为512B。您可以使用set limits语句自定义限制。
i. 网络
CHECK NETWORK <ADDRESS | INTERFACE >
是受监视网络接口的IPv4或IPv6地址。也可以在Linux上使用接口名称,例如“eth0”。
3.2 服务检测时间
可以使用every语句修改服务检查计划。
有三种变体:
1) 轮询周期倍数
EVERY [number] CYCLES
2) Cron风格
EVERY [cron]
every * * * * * #分 时 日 月 周
3) 与Cron-style相反(do-not-check)
NOT EVERY [cron]
示例1: 每两个周期检查一次nginx服务
check process nginx with pidfile /var/run/nginx.pid
every 2 cycles
示例2:在星期日0AM到3AM之间运行检查
check process mysqld with pidfile /var/run/mysqld.pid
every “0-3 * * 0”
示例3: 在星期日0AM到3AM之间不要在备份窗口中运行检查,其他时间则运行具有常规轮询周期频率的检查。
check process mysqld with pidfile /var/run/mysqld.pid
not every “* 0-3 * * 0”
3.3 服务重启限制
Monit提供了一种重启限制机制,用于服务在较长时间内拒绝启动或响应的情况。
超时语句的语法如下(关键字在大写):
IF RESTART CYCLE(S) THEN
该行动值是常见的任何一个动作或超时(为向后兼容,等于取消监视行动)。
下面是一个示例,如果Monit将在3个周期内重新启动服务2次,将取消监视服务:
if 2 restarts within 3 cycles then unmonitor
- 一个完整的监控配置实例
a. 主配置
/etc/monit/monitrc
set daemon 60 #设置系统基本检测周期为60s
set logfile /var/log/monit.log
set idfile /var/lib/monit/id
set statefile /var/lib/monit/state
#Event queue
set eventqueue
basedir /var/lib/monit/events # set the base directory where events will be stored
slots 100 # optionally limit the queue size
#Mail settings
set mail-format {
from: xxxx@163.com #警告邮件发件人邮箱
subject: [$SERVICE] $EVENT
message:
[$SERVICE] $EVENT
Date: $DATE
Action: $ACTION
Host: 主机地址
Description: $DESCRIPTION
Your faithful employee,
Monit }
set mailserver xxx@xx.com smtp.exmail.qq.com port 465 #发件邮箱smtp服务器地址端口,这里以腾讯企业邮箱为例
username postmaster@HOST password "YOURPASSWORD" #邮箱账户名,密码,一般填入客户端密码非登录密码
set alert xxx@163.com #警告邮件收件人邮箱
#http settings
set httpd port 52822 address 0.0.0.0 # 配置端口为adapters
ssl enable #启用 SSL
pemfile /var/certs/monit.pem #生成的SSL地址
allow 0.0.0.0/0.0.0.0 # 允许访问的IP
allow admin:"Admin123!" # 账号为admin ,密码为Admin123!
#allow modular structure
include /etc/monit/conf.d/*
include /etc/monit/conf-enabled/*
b. 监控配置/etc/monit.d/test
## system 系统告警
check system $HOST
if loadavg (1min) > 4 then alert
if loadavg (5min) > 2 then alert
if cpu usage > 95% for 10 cycles then alert
if memory usage > 75% then alert
if swap usage > 25% then alert
check filesystem rootfs with path /dev/sda1 #查看sda1磁盘分区空间大小
if space usage > 80% for 5 times within 15 cycles then alert #在15个检测周期中有5次使用率超过80%报警
if space usage > 90% for 5 cycles then exec '/try/to/free/the/space' #超过磁盘90%则自动执行清理磁盘脚本,当然这里脚本需要自己根据实际情况编写。
## process 进程告警
check process platon_6789 with MATCHING platon
start program = "/home/robert/platon_node/start.sh" #节点启动脚本
stop program = "/homerobert/platon_node/stop.sh" #节点停止脚本
if cpu > 60% for 2 cycles then alert #节点占用cpu超过60%触发报警
if cpu > 80% for 5 cycles then alert #节点占用cpu超过80%触发报警
if failed host 127.0.0.1 port 6789 then alert #如果本地6789端口监听失败报警
if failed host 127.0.0.1 port 6789 then restart #如果本地6789端口监听失败尝试重启节点
if 5 restarts within 5 cycles then timeout #在5个周期中尝试重启5次,之后不再重启
check program blcok_num with path "/etc/monit/scripts/block_num.sh" #使用节点块高检测脚本检测节点块高增长,如果脚本返回值不为0触发报警
if status !=0 then alert
这里顺便贴上节点块高检测脚本block_num.sh
#!/bin/bash
block_num01=`platon attach http://localhost:6789 -exec "platon.blockNumber"`
sleep 2
block_num02=`platon attach http://localhost:6789 -exec "platon.blockNumber"`
if [ $block_num01 -eq $block_num02 ];then
exit 1 #2s后块高不变,该节点出块异常
fi
4) 开始使用Monit
配置完成后,在终端重启 Monit,如果一切顺利的话,你就会立刻收到一封 Monti 启动的邮件,没错,默认的规则是会将 Monit 的关闭和启动都会发送邮件的。之后你可以通过浏览器访问Monit的web页面https://monitIP (启用https) ,如果使用的是云主机则地址为Monit所在主机的公网IP,需开放443端口。
如果没有收到邮件,那么一定是哪里配置出了问题,比如邮件服务出问题的话,你可以在 Log 里面看到「Relaying denied」之类的信息,总之查看 Log 即可:
sudo tailf /var/log/monit.log