天天看點

Supervisor多程序管理 異常自動重新開機 可視化管理

Supervisor是多程序管理工具,在Docker中相關聯的程序能夠通過supervisor來管理。微服務項目開發階段,可用于微服務子項目的啟動管理。支援web可視化管理,能夠極大方面開發者對項目狀态的監控和重新開機管理。

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.conf

nodaemon

屬性值為

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
           

子程序配置檔案添加參數

stdout_logfile

stderr_logfile

的日志檔案會自動納入主程序日志管理,自動進行日志輪轉操作,使用者無需幹預。

當子程序未顯示的指明日志檔案路徑時,預設日志檔案存在于

/tmp

路徑下。

Supervisord 會基于

logfile_maxbytes

logfile_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
           

原文位址

喜歡本文就

【♥️推薦♥️】

一下,激勵我持續創作。這個Github同樣精彩,收到您的star我會很激動。本文歸檔在專題部落格,視訊講解在B站。