一、背景(进程高可用)
无论是业务代码进程或者中间件等进程,在运行过程中难免会因为各种错综复杂的环境,会导致进程在某些情况意外被kill或者宕机。那么如何保证一个进程,在意外宕机的情况下,能够自动拉取,恢复正常提供服务呢? 有没有一种技术手段/方式来达到这一点,也是我们说的进程高可用。 使用supervisor是一个不错的方案之一.
Supervisor是一个用于管理和监控进程的工具,特别适用于类UNIX系统(如Linux和macOS)。它最初是由Geoffrey Talvola编写,并以Python语言实现。Supervisor的设计目标是简化进程的管理,确保即使在进程崩溃或退出的情况下,也能自动重启它们,从而保持系统的稳定性和服务的连续性。
优点和优势:
1、Linux操作系统本身就内置了Python运行环境,同时Supervisor没有过多的第三方依赖包,整个离线源码安装压缩包也就500k大小. 使用和安装门槛低,无需我们专门为安装此软件耗费过多精力或者引入第三方依赖.
2、使用者很多,开源项目活跃,遇到问题随便搜索资料都有。避免自己独自踩坑
3、项目成熟度高,不充当小白鼠,得到了市场长时间的验证
官网文档: http://www.supervisord.org/introduction.html
二、安装
1、在线安装
1、pip安装
pip install supervisor
2、centos yum安装
yum install epel-release -y && yum install supervisor -y
3、其它安装方式
安装文档: http://www.supervisord.org/installing.html
2、离线安装
1、pypi搜索 supervisor包,下载源码包:
wget "https://files.pythonhosted.org/packages/ce/37/517989b05849dd6eaa76c148f24517544704895830a50289cbbf53c7efb9/supervisor-4.2.5.tar.gz"
2、python3 setup.py install 安装即可, 如果缺什么package就补充什么package. package的安装也类似下载源码包, python执行setup.py
python setup.py install
三、基本架构说明
Supervisor的运行架构主要基于客户端/服务器(Client/Server)模型,其核心组件包括supervisord守护进程和supervisorctl客户端工具。此外,Supervisor还提供了一个HTTP服务器,可以用于远程管理和监控。
1、supervisord-服务端
supervisord是Supervisor的核心组件,它作为一个守护进程运行在服务器上。它的主要职责是:
1、读取配置文件:从配置文件中获取被监控进程的列表及其相关的参数。
2、管理进程:启动、停止和重启配置文件中定义的进程。
3、监控进程状态:监视进程的运行状态,如果进程因某种原因退出,supervisord会根据配置自动重启进程。
4、日志管理:收集被监控进程的输出并将其重定向到日志文件。
5、事件通知:当进程状态发生变化时,可以触发预定义的事件处理程序。
2、supervisorctl-客户端
supervisorctl是一个命令行工具,作为客户端,用于与supervisord守护进程通信。它可以执行以下操作:
1、管理进程:启动、停止、重启进程,以及显示进程的状态。
2、配置管理:更新配置文件而不需重启supervisord。
3、事件管理:查看和管理事件处理程序。
4、连接服务端: supervisorctl通过与supervisord建立RPC连接来发送命令和接收响应,因此它可以从任何地方管理supervisord,只要网络可达且有适当的权限。
3、使用步骤
1、启动supervisord守护进程, 启动之后默认是后台运行, 并且监听的一个本地socket文件
2、默认在/ect/supervisord/supervisord.conf是主配置文件,我们默认在supervisord.d目录下定义我们管理进程的.ini配置文件,文件格式大致如下:
[program:mysql] # mysql, 程序名称
directory = /data/mysql/ # 程序所处工作路径
command=/data/mysql/bin/mysqld # 程序启动完整命令
autostart=true # 是否挂掉后自动拉起
autorestart=true # 是否挂掉后自动拉起
startretries=3 #重试拉起次数
startsecs=20 #多少秒后没挂,认为程序是正常运行的
redirect_stderr=true #是否重定向错误输出到标准输出
stdout_logfile=/data/mysql/supervisor-run.log #标准输出日志路径
3、supervisorctl reread #重新读取到新的配置信息
4、supervisor update mysql #启动托管的mysql任务
5、supervisor status #查看任务运行情况
6、此时如果进程意外退出,例如可以自己测试,手动kill -9 $pid, 等会我们会发现,这个进程还是会被supervisor拉起来,保证进程的正常运行。
四、supervisorctl常见子命令详解
1、start/stop/restart/status
见名知意, start启动任务、stop停止任务、restart重启任务、status查看任务运行状态列表
#针对单个任务而言
supervisorctl start mysql
supervisorctl stop mysql
supervisorctl restart mysql
#针对所有任务
supervisorctl stop all
#status,查看托管的程序运行状态列表
supervisorctl status
2、update
更新 Supervisor 的配置,并重启所有需要重启的进程。通常在更改配置文件后使用
supervisorctl update mysql
3、reread
重新读取配置文件,但不会重启任何进程。通常用于检查配置文件的更改是否有效。
建议:
这个很有用,有时候,我们修改了配置文件内容,但是没有reread重读配置,新的配置内容不会生效,这个要注意!!!!
supervisorctl reread
4、reload
结合了 reread
和 update
的功能,重新读取配置文件并更新进程。
这个小心使用哦,因为有些时候,你只是稍微改了一下ini配置信息[无关紧要的注释或者某些参数],但是此时你又不想重启原来正在跑的进程。 或者有时候是,别人修改了,别人不想重启,但是你上来就reload, 有可能造成事故!!!
建议:
可以先通过reread来看看,哪些配置文件改了,再决定是否要更新update吧. 除非你很明确知道需要直接执行reload操作
supervisorctl reload
5、remove
移除一个或多个进程的监控。 例如某个任务,不想进行supervisor托管了,需要先stop,再remove。
supervisorctl remove mysql
6、tail
显示进程的最近日志输出。
supervisorctl tail -f myapp #其中 -f 表示跟随日志的实时输出。