golang 熱升級

需求場景

乾淨利落地升級正在運行的agent程序。適用於Devops團隊。html

目標:nginx

  • 不關閉現有鏈接:例如咱們不但願關掉已部署的運行中的程序。但又想不受限制地隨時升級服務。git

  • 新的進程要可以啓動並替換掉舊的。github

原理:golang

在基於Unix的操做系統中,signal(信號)是與長時間運行的進程交互的經常使用方法.web

  • SIGTERM: 優雅地中止進程apache

  • SIGHUP: 重啓/從新加載進程 (例如: nginx, sshd, apache)centos

若是收到SIGHUP信號,優雅地重啓進程須要如下幾個步驟:服務器

  1. 服務器要拒絕新的鏈接請求,但要保持已有的鏈接。ssh

  2. 啓用新版本的進程

  3. 將socket「交給」新進程,新進程開始接受新鏈接請求

  4. 舊進程處理完畢後當即中止。

 

實現參考:

https://grisha.org/blog/2014/06/03/graceful-restart-in-golang/  beego的grace模塊主要的思路來源也是參考這篇文章

https://www.oschina.net/translate/graceful-server-restart-with-go

https://scalingo.com/articles/2014/12/19/graceful-server-restart-with-go.html

https://github.com/tim1020/godaemon

https://tomaz.lovrec.eu/posts/graceful-server-restart/  優雅的從新啓動Golang web 服務

https://zhuanlan.zhihu.com/p/59196185

注意

一、實現後的agent程序,通常都是註冊在systemd中(centos 7),咱們準備的xxx.service文件須要指明PIDFile,這樣在進行kill -HUP <server pid>時不會致使因systemd探測產生進程啓動失敗。

二、程序自支持kill -HUP,能夠在代碼中實現,經過這個方式這樣能夠經過控制檯端隨意的升級哪臺agent。

升級步驟:

  1. 調用agent端接口,發送升級指令
  2. agent版本下載
  3. agent備份、替換程序包
  4. 執行kill -HUP
  5. 完成自升級
相關文章
相關標籤/搜索