golang 热升级
需求场景
干净利落地升级正在运行的agent程序。适用于Devops团队。
目标:
不关闭现有连接:例如我们不希望关掉已部署的运行中的程序。但又想不受限制地随时升级服务。
新的进程要能够启动并替换掉旧的。
原理:
在基于Unix的操作系统中,signal(信号)是与长时间运行的进程交互的常用方法.
SIGTERM: 优雅地停止进程
SIGHUP: 重启/重新加载进程 (例如: nginx, sshd, apache)
如果收到SIGHUP信号,优雅地重启进程需要以下几个步骤:
服务器要拒绝新的连接请求,但要保持已有的连接。
启用新版本的进程
将socket“交给”新进程,新进程开始接受新连接请求
旧进程处理完毕后立即停止。
实现参考:
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
注意
1、实现后的agent程序,一般都是注册在systemd中(centos 7),我们准备的xxx.service文件需要指明PIDFile,这样在进行kill -HUP <server pid>时不会导致因systemd探测产生进程启动失败。

2、程序自支持kill -HUP,可以在代码中实现,通过这个方式这样可以通过控制台端随意的升级哪台agent。

升级步骤:
- 调用agent端接口,发送升级指令
- agent版本下载
- agent备份、替换程序包
- 执行kill -HUP
- 完成自升级
golang 热升级的更多相关文章
- .NET插件技术-应用程序热升级
今天说一说.NET 中的插件技术,即 应用程序热升级.在很多情况下.我们希望用户对应用程序的升级是无感知的,并且尽可能不打断用户操作的. 虽然在Web 或者 WebAPI上,由于多点的存在可以逐个停用 ...
- rpm包安装的nginx热升级
文章目录一.本地环境基本介绍二.yum升级命令说明三.升级好nginx后如何不中断业务切换3.1.nginx相关的信号说明3.2.在线热升级nginx可执行文件程序一.本地环境基本介绍本次测试环境,是 ...
- golang apns升级到http2
记录一下golang中升级apns,使用http2替换http1.1的详细过程. apns使用http2的好处就不用再说了,网上一搜一堆信息.苹果的apns推送在2015年8月就支持了http2协议, ...
- golang 热更新技巧 负载均衡才是正道啊
golang plugin热更新尝试 - 呵大官人的鱼塘 - 开源中国 https://my.oschina.net/scgywx/blog/1796358 golang plugin热更新尝试 发布 ...
- Nginx热升级流程,看这篇就够了
在之前做过 Nginx 热升级的演示,他能保证nginx在不停止服务的情况下更换他的 binary 文件,这个功能非常有用,但我们在执行 Nginx 的 binary 文件升级过程中,还是会遇到很多问 ...
- 老版本nginx存在安全漏洞,不停服务热升级
1.场景描述 安全部通知:nginx存在"整数溢出漏洞",经测试2017年4月21日之后的版本无问题,将openresty升级到最新版本,Nginx升级到1.13.2之后的版本. ...
- nginx 安装第三方模块(lua)并热升级
需求: nginx上将特定请求拒绝,并返回特定值. 解决办法: 使用lua脚本,实现效果. 操作步骤: 安装Luajit环境 重新编译nginx(目标机器上nginx -V 配置一致,并新增两个模块n ...
- Beego开启热升级
1.打开配置 beego.BConfig.Listen.Graceful = true 2.写入pid 程序入口main()函数里写入pid func writePid() { fileName := ...
- Golang服务器热重启、热升级、热更新(safe and graceful hot-restart/reload http server)详解
服务端代码经常需要升级,对于线上系统的升级常用的做法是,通过前端的负载均衡(如nginx)来保证升级时至少有一个服务可用,依次(灰度)升级. 而另一种更方便的方法是在应用上做热重启,直接更新源码.配置 ...
随机推荐
- java基础之Number
1.Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper ...
- 解决Docker容器中不能用vim编辑文件
更新来源: apt-get update 安装vim apt-get install -y vim 参考链接:https://blog.csdn.net/wangxinxinsj/article/de ...
- Vmware 给虚拟机传脚本并执行
#_*_ coding:utf8 _*_ from pysphere import VIServer import ssl import re import sys import os import ...
- BZOJ4205卡牌配对——最大流+建图优化
题目描述 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不 ...
- BZOJ4519[Cqoi2016]不同的最小割——最小割树+map
题目描述 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割.对于带权图来说,将 所有顶点处在 ...
- thymeleaf中js跳转到另外一个页面
<script type="text/javascript"> setTimeout("location.href='index'", 3000); ...
- SVG图片如何调整大小和颜色
设计妹子给了SVG图片,在开发的时候尺寸不对,颜色也要修改,应当如何解决? 1.修改大小:在<svg> 标签中修改width.height 属性(默认单位是px)2.修改颜色:在<p ...
- MT【189】二次条件配方
“当一幢建筑物完成时,应该把脚手架拆除干净.”——高斯 (2017北大特优)若对任意使得关于 \(x\) 的方程 \(ax^2+bx+c=0\)(\(ac\ne 0\))有实数解的 \(a,b,c\) ...
- socket 10060错误解决方案
错误提示: socket 10060 无法加载或初始化请求的服务提供程序 解决方案: 打开cmd命令行工具,运行 netsh winsock reset
- Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)
题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...