使用Supervisor來守護我們服務

一、Supervisor簡介

Supervisor是什麼?Supervisor官網(http://supervisord.org/)上是這樣描述的:Supervisor是一個進程控制系統,可以用來監視並控制類 UNIX 系統上服務的進程。

Supervisor能做什麼?當服務進程意外停止時,能讓服務自動完成重啓,確保服務一直處於運行狀態。

Supervisor能解決什麼問題?可以將生產中需要長期運行且運行模式是非守護進程(daemonize)的服務託管在Supervisor上,如自研發的C、java、python等服務進程以及用於監控收集數據的服務進程都可以交由Supervisor來管理。

二、安裝並啓動Supervisor

1、Supervisor的rpm包位於epel源中,所以安supervisor前需要先安裝epel-release

# yum -y install epel-release

# yum -y install supervisor

2、啓動supervisor,並設置開機自啓。

# systemctl restart supervisord  #該命令用於重啓supervisor以及由supervisor管理的所有服務進程。

# systemctl enable supervisord

3、Supervisor的使用,supervisor僅提供了2個命令。

第一個:/usr/bin/supervisord,用於啓動 Supervisor 服務。

# supervisord -c /etc/supervisor/supervisord.conf  

使用rpm包安裝Supervisor可以被系統守護進程(Systemd)來管理,隨系統啓動而啓動。

第二個:supervisorctl,用於啓動Supervisor的命令行會話窗口(類似shell),來管理服務進程。


三、配置文件/etc/supervisord.conf 介紹

supervisord.conf使用了Windows INI風格,每段以[xx]開頭,段內配置均爲鍵/值對。

[unix_http_server]

file=/var/run/supervisor/supervisor.sock   ;socket 路徑

chmod=0700                 ; supervisor.sock 文件權限,默認爲0700

;chown=nobody:nogroup   ; supervisor.sock文件屬主和屬組,默認由root:root

username=admin    ;使用supervisorctl登錄到supervisord cmd會話窗口的用戶,默認不需要用戶名

password=1235    ; 使用supervisorctl登錄到supervisord cmd窗口的密碼(支持明文和SHA),supervisorctl -uadmin -p1235

[inet_http_server]         ; 該段配置用於提供一個HTTP的WEB控制檯,用於WEB界面管理服務進程,默認不開啓

port=0.0.0.0:9001        ; 監控的IP:端口,使用*:9001表示監聽所有接口上的9001端口

username=admin        ;用於登錄到WEB控制檯的用戶名,默認沒有設置用戶名

password=1234           ; 用於登錄到WEB控制檯的密碼,默認沒有設置密碼


[supervisord]

logfile=/var/log/supervisor/supervisord.log  ; 日誌存放路徑

logfile_maxbytes=50MB       ;日誌達50MB後滾動,默認值50MB

logfile_backups=10          ;保留10個supervisord.log日誌,默認值10

loglevel=info               ;日誌級別,默認配置爲info; 可配置爲debug、warn、trace

pidfile=/var/run/supervisord.pid ; 進程文件路徑

nodaemon=false              ; supervisord進程是否在前臺啓動;默認爲false,表示後臺啓動

minfds=1024                 ; 啓動supervisord前可用的最小文件描述符數爲1024,即/etc/security/limits.conf中nofile設置要大於1024,否則用普通用戶將無法啓動supervisord

minprocs=200                ; 啓動supervisord前,最小可用procs不能小於200,即/etc/security/limits.conf中nproc設置要大於200,否則用普通用戶將無法啓動supervisord

umask=022                  ;supervisord進程文件的umask,默認爲022

;user=chrism                 ; supervisord進程用戶,默認爲root

;identifier=supervisor       ;管理器進程的標識符,給RPC接口使用,默認爲supervisor

;directory=/tmp              ; 啓動時不用cd到當前目錄

;nocleanup=true              ; 阻止supervisord在啓動時清除任何現有的日誌文件,默認爲false

;childlogdir=/tmp            ; 用於自動子日誌文件的目錄,默認值取的是python的tempfile.get_tempdir()方法

;environment=KEY=value       ; 用於定義環境變量,以鍵值對的方式

;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)


[supervisorctl]

serverurl=unix:///var/run/supervisor/supervisor.sock ; 使用unix套接字方式

;username=admin     ; 如果設置,需和http_username一樣,但實際測試驗證設與不設置均不影響supervisorctl

;password=1234       ; 如果設置,需和http_password一樣,但實際測試驗證設與不設置均不影響supervisorctl

prompt=mysupervisor      ;進入supervisord會話窗口後的命令提示符

history_file=~/.sc_history  ; 使用supervisorctl進入supervisord會話窗口後,操作命令均保存在該文件內


;[program:cat]             ;冒號後的cat爲服務名稱,也可以是prometheus、node_exporter等

;command=/bin/cat   ;服務啓動的命令

;process_name=%(program_name)s  ;一個使用Python字符串的表達式,用來描述進程名稱(字符串),默認設置

;numprocs=1   ;默認爲1,如果>1,則process_name表達式必須包含%(process_num)s,或包含process_num的任何其他有效Python字符串表達式

;directory=/tmp      ;應用目錄,可不設置

;umask=022            ;掩碼,按默認設置

;priority=999           ;優先級越高,表示最先關閉,最晚啓動,默認爲999

;autostart=true       ;是否自啓動

;autorestart=unexpected  ;當進程處於運行狀態時,如果該進程退出,則是否應自動重新啓動該進程。如果設置爲false,則不會自動重新啓動進程。如果設置爲unexpected,當程序退出時,退出代碼不是與此進程配置相關聯的退出代碼之一(請參閱退出代碼),則將重新啓動進程。如果設置爲true,則進程在退出時將無條件重新啓動,而不考慮其退出代碼

;startsecs=10  ;服務啓動後需要保持運行多少秒才認爲啓動成功,如10秒仍處理運行狀態則表示啓動成功。

;startretries=3   ;嘗試啓動次數

;exitcodes=0    ;退出代碼,默認爲0,該值設置會影響到autorestart

;stopsignal=TERM   ;停止信號,可以是TERM, HUP, INT, QUIT, KILL, USR1, or USR2

;stopwaitsecs=10    ;停止時等待多少秒

;stopasgroup=false                   ;向進程組發送停止信號,這止進程

;killasgroup=false                      ;向進程組發送SIGKILL終止進程

;user=chrism                              ;啓動用戶

;redirect_stderr=false                 ;標準錯誤輸出是否重定向,若設置爲true,則表示將錯誤輸出重定向到標準出日誌文件中

;stdout_logfile=/a/path              ;標準輸出日誌文件路徑

;stdout_logfile_maxbytes=1MB  ;單個日誌文件大小,超出將滾動

;stdout_logfile_backups=10       ;保留日誌個數

;stderr_logfile=/a/path              ;標準錯誤輸出日誌文件位置,redirect_stderr=false纔有效

;stderr_logfile_maxbytes=1MB  ;標準錯誤輸出單個日誌文件大小,超出將滾動,redirect_stderr=false纔有效

;stderr_logfile_backups=10       ;保留標準錯誤輸出日誌文件個數,超出刪除,edirect_stderr=false纔有效


[include]    ;將各應用配置分別存放於supervisord.d下,便於管理。

files = supervisord.d/*.ini


四、通常,各個服務配置放在supervisord.d目錄下,每個服務一個配置文件,此處以prometheus和node_exporter進程爲例,具體配置如下。

# cat /etc/supervisord.d/prometheus.ini  

[program:prometheus]    ;應用名稱爲:prometheus  

command=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus --storage.tsdb.retention=90d     ;應用啓動命令

user=root            ;以root用戶啓動

autostart=true     ;允許自啓動

autorestart=true  ;進程退出時自動重啓

startsecs = 5        ;啓動後運行5s將被認爲服務啓動成功

exitcodes=0        ;退出碼

redirect_stderr=true     ;標準錯誤輸出重定向到標準輸出

stdout_logfile=/var/log/prometheus.log   ;日誌文件路徑

stdout_logfile_backups=5                         ;日誌文件保留個數


# cat /etc/supervisord.d/node_exporter.ini  

[program:node_exporter]

directory=/usr/local/node_exporter

command=/usr/local/node_exporter/node_exporter

user=root

autostart=true

autorestart=true

startsecs = 5

redirect_stderr=true

stdout_logfile=/var/log/prometheus.log

stdout_logfile_backups=5


登錄 http://ip:9001,按[inet_http_server] 中配置,用戶名爲admin,密碼爲1234,服務運行狀態如下圖所示。

image.png

image.png


使用supervisorctl命令登錄到supervisord會話窗口來管理進程,

image.png

使用help命令查看幫助

image.png

常用的操作命令包括:status(查看狀態)、stop(stop xx 停止xx服務)、start(start xx 啓動xx服務)、reread(熱加載配置)、update 等

mysupervisor> status

node_exporter                    RUNNING   pid 5339, uptime 0:00:21

prometheus                       RUNNING   pid 5340, uptime 0:00:21

mysupervisor> stop node_exporter

node_exporter: stopped

mysupervisor> status

node_exporter                    STOPPED   May 12 10:12 PM

prometheus                       RUNNING   pid 5340, uptime 0:00:31

mysupervisor> start node_exporter

node_exporter: started

mysupervisor> status

node_exporter                    RUNNING   pid 5362, uptime 0:00:04

prometheus                       RUNNING   pid 5340, uptime 0:00:40

mysupervisor> update

mysupervisor> reread

image.png

上述操作是在supervisord會話中交互式執行,也可使用supervisorctl 命令直接對服務做停止或啓動操作


# supervisorctl -uadmin -p1235 start node_exporter

# supervisorctl -uadmin -p1235 status

# supervisorctl -uadmin -p1235 reread

image.png


總結:有了Supervisor,再也不用自己去寫守護進程腳本了,一般監控用的agent均可使用Supervisor來管理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章