golang版supervisor 已經線上上使用

ajian發表於2018-03-25

背景

gosuv是基於github.com/codeskyblue/gosuv 做了一些修改,修復了一些致命的問題,增加了一些功能,現在已經線上上執行一段時間。歡迎大家使用。 https://github.com/ohlinux/gosuv

相對python版的 部署更是方便。不受多套python環境的影響。 而且根據實際的操作,加入些新的小功能。

gosuv

gosuv是golang版的supervisor的程式管理程式,類似python版的superviosr. gosuv有安裝部署簡單,使用便利等優點.

wiki地址:

當前版本

gosuv version 201712041615

功能列表

  • [x] 命令列
    • [x] server控制
      • [x] 啟動 start-server
      • [x] 關閉 shutdown
      • [x] 檢視狀態 status-server
      • [x] 重啟 restart-server
      • [x] 殺程式 kill
      • [x] 過載 reload
      • [x] 配置檢查 conftest
    • [x] programs控制
      • [x] 啟動 start
      • [x] 停止 stop
      • [x] 編輯 edit
      • [x] 狀態 status
  • [x] web頁面控制
    • [x] Start, Stop, Tail, Reload
    • [x] Realtime log
    • [x] Add program support
    • [x] Edit support
    • [x] Delete support
    • [x] Memory and CPU monitor
  • [x] 日誌管理
    • [x] gosuv server日誌
    • [x] programs標準/錯誤輸出日誌
    • [x] gosuv server日誌切割
    • [ ] programs 日誌切割
  • [x] HTTP Server
  • [x] Unix Sock Server
  • [x] 基本的使用者密碼驗證
  • [x] 靜態檔案編譯入bin
  • [ ] 授權ip列表
  • [ ] shell介面
  • [x] 平滑關閉
  • [ ] 首次啟動失敗,邊界處理

總體介紹

gosuv是一個集server和client一體的命令列. server又分為HTTP和Unix兩種分別對應web和sock管理兩種方式. 並且提供了web操作介面.

主要的功能是為管理程式提供守護服務,當被管理的服務異常退出的時候再嘗試拉起.

Quick start

編譯安裝

cd ${git dir}

bash hack/build.sh

編譯成功將gosuv檔案放置到bin目錄下

預設啟動服務

$./gosuv start-server
server started, listening  .gosuv.sock.

在當前沒有config的情況下會產生預設的config.yml在當前目錄.預設使用sock的管理方式.

檢視server狀態

$./gosuv status-server
server is running

表示服務提供正常

新增Programs

預設沒有programs的配置檔案.

建立programs.yml到當前目錄.

- name: redis-test # programs的名字唯一
  command: redis-server --port 6679
  environ: []
  directory: /tmp
  start_auto: true     #代表gosuv啟動的時候預設啟動該程式
  start_retries: 3  # 1分鐘內的重啟次數, 1分鐘內重啟成功,會重新計數. 所以不建議設定太大 如果太大容易造成永遠retry. 還有優化的空間.
  user: work  #指定使用者啟動, 但是非root不用指定使用者
  redirect_stderr: true  # 把 stderr 重定向到 stdout,預設 false
  log_disable: false # 是否禁用螢幕輸出 預設為false ,如果標準輸出和錯誤輸出太多可以關閉.

PS: programs的日誌沒有切割功能,所以如果標準輸出內容太多,可以使用log_disable : true 關閉

啟動program

重新載入配置

$ ./gosuv reload
load config success

檢視狀態

$ ./gosuv status
PROGRAM NAME            STATUS
redis-test              running

關閉program

$ ./gosuv stop redis-test

高階用法

開發使用場景

  • 開發使用場景,可以開啟HTTP WEB的方式.

  • 可以在web上面新增programs

  • 每個gosuv可以管理多個程式.

線上服務場景

  • 建議使用unix server的方式.(減少埠占用)

  • 1個gosuv管理一個程式服務.

  • 可以新增授權等操作.

配置檔案說明

include: ./conf/programs.yml #指定programs檔案, 這個版本不支援. 當前版本還是預設和主配置檔案同一個目錄,檔名programs.yml固定 
server:
  httpserver:        ## http api 
    enabled: false   ## 是否啟用 如果httpserver啟動優先順序大於unixserver
    addr: :11333     ## ip:port, :port的意思是bind all 0.0.0.0
  unixserver:        ## unix api
    enabled: true    ## 預設啟動 
    sockfile: .gosuv.sock  ## sock file位置,預設當前目錄.gosuv.sock
  auth:              ## 許可權
    enabled: true    ## 是否啟動
    username: abc    ## 使用者名稱
    password: abc    ## 密碼
    ipfile: ""       ## ip授權列表 這版本暫時未支援
  pidfile: .gosuv.pid  ## gosuv pid檔案,預設當前目錄.gosuv.pid
  log:
    logpath: logs  ## 日誌存在目錄 會儲存gosuv.log 和各個programs(被管理程式的螢幕輸出)
    level: info      ## 日誌級別
    filemax: 10000    ## 每個日誌檔案大小
    backups: 10      ## 切割保留的日誌數量
  minfds: 1024       ## 可以開啟的檔案描述符的最小值 暫不支援
  minprocs: 1024     ## 可以開啟的程式數的最小值 暫不支援
client:              ## client配置, 可以獨立於server使用和配置. 
  server_url: unix://.gosuv.sock ## url的配置 兩種格式 unix://file.sock 和http://ip:port 例如:  unix:///tmp/gosuv.sock 或者http://127.0.0.1:8181 與server的方式相對應
  username: abc      ## server要求的使用者名稱
  password: abc      ## server要求的密碼

PS: programs的日誌沒有切割功能,這裡的日誌切割配置只管理了gosuv.log本身的日誌

命令列說明

$./gosuv -h
NAME:
   gosuv - golang supervisor

USAGE:
   gosuv [global options] command [command options] [arguments...]

VERSION:
   201711232023

AUTHOR:

COMMANDS:
     start-server       Start supervisor and run in background 啟動gosuv 並放到後臺,如果要在前臺使用,可以新增 -f 
     status, st         Show program status  檢視programs的狀態
     status-server      Show server status   檢視server的狀態
     start              Start program
     stop               Stop program
     reload             Reload config file
     shutdown           Shutdown server    優雅關閉,會先關閉programs再退出.
     kill               kill stop server by pid file.  kill程式通過pid
     restart-server     restart server    重啟server
     conftest, t        Test if config file is valid
     edit               Edit config file  
     version, v         Show version
     help, h            Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --conf value, -c value  config file (default: "config.yml")
   --help, -h              show help
   --version, -v           print the version

web介面管理

gosuv web

靜態檔案編譯

./hack/install.sh

可以將res下面的靜態檔案編譯到bin檔案中.這樣安裝部署只有一個bin檔案,不需要單獨部署靜態檔案.

注意事項

kill與kill -9

  1. kill 預設傳送的是SIGQUIT指令,可以被gosuv獲取到訊號,所以會平滑的退出所有託管的程式.
  2. kill -9 傳送的是SIGKILL指令,是不可以被gosuv獲取到資訊,所以所有託管的程式會被系統託管,gosuv本身退出. 程式服務可能還能正常提供服務.

Linux Singal http://colobu.com/2015/10/09/Linux-Signals/

配置修改時間點

  1. 如果gosuv正在提供服務,修改了其中的client的連線方式等會導致無法正常使用API或者cmd. 所以建議shutdown後再進行配置的修改再啟動生效.

重啟次數

重啟次數是在一分鐘內的次數,如果超過一分鐘,重啟次數會進行重置.所以不建議一分鐘類重啟次數過多,可能會導致無限重啟的情況,因為重啟後的每隔1分鐘就會被重置.

Design

HTTP is follow the RESTFul guide.

Get or Update program

<GET|PUT> /api/programs/:name

Add new program

POST /api/programs

Del program

DELETE /api/programs/:name

State

Only 4 states. ref

宣告

程式碼重構源於github.com/codeskyblue/gosuv 有時間提交貢獻程式碼.

相關文章