Supervisor是多程序管理工具,在Docker中相關聯的程序能夠通過supervisor來管理。微服務項目開發階段,可用于微服務子項目的啟動管理。支援web可視化管理,能夠極大方面開發者對項目狀态的監控和重新開機管理。
一、序言
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、啟動參數
通常情況下參數都是添加在配置檔案中,有些場景下,修改配置檔案比較繁瑣(比如已經生成的鏡像),這時在指令行中添加運作時參數就比較友善。
參數 | 用途 | 預設值 |
---|---|---|
| 指定配置檔案路徑 | |
| supervisord伺服器監聽的URL | |
| 用于與伺服器進行身份驗證的使用者名 | |
| 用于與伺服器進行身份驗證的密碼 | |
三、服務管理
服務管理包含對主服務進行管理和對子服務進行管理;子服務分為單個管理和批量(分組)管理。
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站。