Supervisor多进程管理 异常自动重启 可视化管理

人生难得几回搏,此时不搏待何时。这篇文章主要讲述Supervisor多进程管理 异常自动重启 可视化管理相关的知识,希望能为你提供帮助。
一、序言
Supervisor是多进程管理工具,在Docker中相关联的进程能够通过supervisor来管理。
微服务项目开发阶段,可用于微服务子项目的启动管理。
支持web可视化管理,能够极大方面开发者对项目状态的监控和重启管理。
二、安装与使用
(一)安装与配置 1、服务安装服务安装前,建议更新python版本,使用较新的版本有利于服务拓展,若被管理的服务依赖于较新的Python版本,需要再次重新安装服务。

yum install -y epel-release yum install -y supervisor

查看版本号
supervisord -v

2、配置文件配置文件路径为/etc/supervisord.conf,其中用英文; 表示注释。将配置文件备份,过滤注释配置后形成新的配置文件。
# 备份配置文件 mv /etc/supervisord.conf /etc/supervisord.example.conf # 保留非注释配置,初始化为新的配置文件 cat /etc/supervisord.example.conf | grep -v ^; | tr -s "\\n" > /etc/supervisord.conf

使用命令echo_supervisord_conf查看默认配置
[unix_http_server] file=/var/run/supervisor/supervisor.sock; 可视化web监控模块(不需要直接注释) [inet_http_server] port=0.0.0.0:9001 username=root password=root[supervisord] logfile=/var/log/supervisor/supervisord.log ; 最大单个日志文件大小 logfile_maxbytes=50MB ; 最大日志文件保留份数 logfile_backups=10 loglevel=info pidfile=/var/run/supervisord.pid ; 如果将设置为系统服务,需要设置为false nodaemon=false minfds=1024 minprocs=200[rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface[supervisorctl] serverurl=unix:///var/run/supervisor/supervisor.sock; 子进程配置存放目录 [include] files = supervisord.d/*.ini

通过如下命令查看版本号:
supervisord -v

(二)启动 1、后台启动将supervisord设置成开机自启,保证委托其管理的服务能够正常启动,建议使用此方式启动。
# 设置开机自启 systemctl enable supervisord# 启动主服务 systemctl start supervisord

2、前台启动在编写Docker镜像,需要在一个镜像中同时管理多个服务,需要使用前台启动。supervisord的默认启动方式是daemon,若要配置为前台启动需修改配置文件/etc/supervisord.confnodaemon属性值为true
# 使用脚本替换 sed -i s/nodaemon=false/nodaemon=true/g /etc/supervisord.conf

前台启动命令如下
supervisord -c /etc/supervisord.conf

3、启动参数通常情况下参数都是添加在配置文件中,有些场景下,修改配置文件比较繁琐(比如已经生成的镜像),这时在命令行中添加运行时参数就比较方便。
参数 用途 默认值
-c 指定配置文件路径 /etc/supervisord.conf
-s supervisord服务器监听的URL http://localhost:9001
-u 用于与服务器进行身份验证的用户名 user
-p 用于与服务器进行身份验证的密-码 123
三、服务管理
服务管理包含对主服务进行管理和对子服务进行管理;子服务分为单个管理和批量(分组)管理。
1、查看主服务状态如果不指定子服务名称,默认重新查看所有的子服务状态。指定子服务名,仅仅查看当前子服务状态。
# 查看服务状态 supervisorctl status

主进程管理
#进程管理常用命令 systemctl stop supervisord systemctl start supervisord systemctl restart supervisord

2、可视化界面管理可视化界面在软件的不同开发阶段采用不同的策略,项目开发和测试阶段,为了提高开发效率,往往开启可视化界面,当项目开发完毕进行交付时,为保证服务器的安全,通常关闭可视化界面。
开启Web可视化服务需要在配置文件中添加inet_http_server模块。
(一)单服务管理单服务管理是指针对单个子服务进行管理,所有子服务在默认分组中,但是不显示的标出。
1、刷新子服务列表当添加新加入子服务时,需要刷新列表,主服务方能纳入管理范畴。
(1)reload
如果不指定子服务名称,默认重新启动所有的子服务列表。指定子服务名,仅仅重启当前子服务,其它服务不受影响。
所有子服务是指不管配置是否发生修改,都会重启。
# 刷新服务列表 supervisorctl reload

(2)update
重启所有配置发生更改的子服务(包含新增子服务),配置未发生变化的子服务不重启。
# 刷新服务列表 supervisorctl update

2、进程管理运行此种方式管理子进程颗粒度更小。
# 启动指定服务 supervisorctl start program_name # 停止指定服务 supervisorctl stop program_name # 重启指定服务 supervisorctl restart program_name # 启动所有服务 supervisorctl start all # 停止所有服务 supervisorctl stop all

(二)分组管理当有相关联的子服务时,可采用分组管理,一旦设置分组并添加子服务,那么子服务名称就会发生变化:由原来的program_name变成group_name:program_name,比如redis:redis80
分组管理需要修改主服务配置文件。
1、查看分组子服务列表查看指定分组名称下子服务列表,
# 查看分组子服务列表 supervisorctl status group_name:

2、分组子进程管理以组为单位对子进程进行管理,包含启动服务、停止服务、重启服务。
# 启动指定组名下服务 supervisorctl start group_name: # 停止指定组名下服务 supervisorctl stop group_name: # 重启指定组名下服务 supervisorctl restart group_name:

注意组名后的冒号:
3、分组应用将进程委托给Supervisor管理,并分组对于一组关联进程来说很方便,比如Redis主从服务、ES集群、ZK集群、Kafka集群,他们是一组关联度较高的子服务集合。
四、编写子进程运行配置文件
supervisor主进程配置文件为/etc/supervisord.conf
在目录/etc/supervisord.d下新建以.ini为后缀的配置文件,每一个配置文件代表一个子进程。执行如下命令,即可添加子进程配置。
快捷脚本传送门
(一)参数解释 1、directory当子进程启动命令不能从环境变量读取到时,使用此参数切换到指定的工作目录,然后运行入口命令。
2、priority当priority参数越大时,优先级越低。
3、environment如果子应用无法获取系统环境变量,那么可显式指明特定环境的路径。
environment=java_HOME=/usr/local/java

(二)日志管理 1、查看子进程日志子进程被Supervisor管理后会产生相应的运行日志,常见的有访问日志和错误日志。
; 访问日志 stdout_logfile=/var/log/park/access.log ; 错误日志 stderr_logfile=/var/log/park/error.log

在子进程配置文件中增加日志配置,可以在不使用可视化界面的情况下查看子进程日志。可视化Web界面查看日志固然方便,缺陷是不能查看错误日志。
tail -f /var/log/park/access.log

【Supervisor多进程管理 异常自动重启 可视化管理】子进程配置文件添加参数stdout_logfilestderr_logfile的日志文件会自动纳入主进程日志管理,自动进行日志轮转操作,用户无需干预。
当子进程未显示的指明日志文件路径时,默认日志文件存在于/tmp路径下。
Supervisord 会基于 logfile_maxbyteslogfile_backups 轮转日志,前者限制单个日志文件的大小,后者限制日志备份的数量。此配置存在与主配置文件,非子进程配置文件。
(三)常见组件配置 1、nginx
cat < < EOF> /etc/supervisord.d/nginx.ini [program:nginx] directory=/usr/local/nginx/sbin command=/usr/local/nginx/sbin/nginx -g daemon off; ; 主服务启动时自动启动当前子服务 autostart=true ; 子服务异常退出自动重启 autorestart=true ; 子服务启动时间(与时间情况尽量一致) startsecs=5 startretries=3 redirect_stderr=true stdout_logfile=/usr/local/nginx/logs/access.log stderr_logfile=/usr/local/nginx/logs/error.log EOF

子进程的命令必须是以前台运行的方式执行,不能使用后台运行的方式执行。
2、Redis
cat < < EOF> /etc/supervisord.d/redis.ini [program:redis] command=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf --daemonize no autostart=true autorestart=true startsecs=5 startretries=3 redirect_stderr=true EOF

子进程的命令必须是以前台运行的方式执行,不能使用后台运行的方式执行。
3、Nacos
cat < < EOF> /etc/supervisord.d/nacos.ini [program:nacos] command=sh /usr/local/nacos/bin/startup.sh -m standalone autostart=true autorestart=true startsecs=8 startretries=3 redirect_stderr=true environment=JAVA_HOME=/usr/local/java priority=1 EOF

子进程的命令必须是以前台运行的方式执行,不能使用后台运行的方式执行。
4、ElasticSearch
cat < < EOF> /etc/supervisord.d/es.ini [program:es] command=/usr/local/elasticsearch/bin/elasticsearch -Enetwork.host=127.0.0.1 user=es password=es.123.456 umask=002 autostart=true autorestart=true startsecs=8 startretries=3 redirect_stderr=true priority=100 EOF

5、ZooKeeper
cat < < EOF> /etc/supervisord.d/zk.ini [program:zk] command=/usr/local/zookeeper/bin/zkServer.sh start-foreground autostart=true autorestart=true startsecs=5 startretries=3 redirect_stderr=true priority=100 EOF

6、Jenkins
cat < < EOF> /etc/supervisord.d/jenkins.ini [program:jenkins] command=/usr/local/jenkins/bin/catalina.sh run autostart=true autorestart=true startsecs=8 startretries=3 redirect_stderr=true priority=100 EOF

7、Kafka
cat < < EOF> /etc/supervisord.d/kafka.ini [program:kafka] command=/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties autostart=true autorestart=true startsecs=8 startretries=3 redirect_stderr=true priority=100 EOF

8、Kibaba
cat < < EOF> /etc/supervisord.d/kibana.ini [program:kibana] command=/usr/local/kibana/bin/kibana -H 0.0.0.0 autostart=true autorestart=true startsecs=8 startretries=3 redirect_stderr=true EOF

9、MongoDb
cat < < EOF> /etc/supervisord.d/mongo.ini [program:mongo] command=/usr/local/mongo/bin/mongod --config=/usr/local/mongo/conf/config.yml autostart=true autorestart=true startsecs=8 startretries=3 redirect_stderr=true priority=100 EOF

原文地址

    推荐阅读