请问你们是如何实现服务不中断的代码发布更新的
source link: https://www.v2ex.com/t/922911
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
大家实际生产中,应该不是每个人都有使用 k8s 吧?
像你们 java 、go 这些语言,发布新版本的时候,如果不用 k8s ,你们是怎么实现平滑更新过度的,还是直接暴力重启?
lincanbin 11 小时 7 分钟前 从名字服务里摘掉发布节点,然后等一会儿这个节点就没流量了,就可以发布了。
|
seers 11 小时 3 分钟前 via Android 方法多了去了,Nginx 调整下集群权重
|
LeeReamond 11 小时 3 分钟前 @lincanbin 名字服务,nameserver ?现代汉语属实是让人摸不到头脑了
|
moshiyeap100 11 小时 3 分钟前 比如一个服务有 3 个实例。
step1: 从注册中心下线 A ,A 没流量了开始更新 A 更新后,观察 A 是否正常。 如果正常继续更新下一个服务,不正常就下线回滚。 我们就是这么原始。 |
ZSeptember 11 小时 1 分钟前 首先看你有几个实例,至少两个实例才能做到
|
lincanbin 10 小时 59 分钟前 @LeeReamond 也可以叫注册中心吧,反正叫法挺多的,就是维护一个服务的实例列表的一个服务
|
tmtstudio 10 小时 57 分钟前 5 php 无所畏惧🤗
|
SanYuan 10 小时 57 分钟前 多套环境,A\B 互为蓝绿环境,用户全拉到 A 然后发布 B 完事用户切到 B
|
LeegoYih 10 小时 56 分钟前 新实例启动完成后,Nginx 配置改为新实例的地址 reload 配置,然后销毁旧实例
|
lincanbin 10 小时 55 分钟前 除了名字服务里来剔除发布节点流量的方法外,reuseport 也是一个很常见的方式。
|
libook 10 小时 55 分钟前 一般正式环境业务不会但节点跑的,多节点就需要负载均衡,那么只需要手动调整负载均衡权重,让一台机器没有入站流量了,再将这台停机升级,恢复流量再处理下一台。
可以用脚本或程序自动化,持续部署方案比 k8s 出来早很多年就很成熟了。 |
daoyu 10 小时 54 分钟前 蓝绿部署、金丝雀部署
|
brader 10 小时 43 分钟前 @moshiyeap100 你们有弄了注册中心,还是蛮复杂的,然后你说的过程,你们是实现了自动化构建发布过程,还是手动更新啊
|
brader 10 小时 42 分钟前 @ZSeptember 多个实例可以很容易实现自动化更新吗?
|
brader 10 小时 32 分钟前 @LeegoYih Jenkins 我用过,但是它的流水线部署本质上,和你写 shell 或者代码,没有很大区别吧,只是它结合了比较多的插件和功能。 还是要自己实现自动化不中断的流程啊
|
sujin190 10 小时 26 分钟前 之前我们的做法是自己再外面套了层守护进程,有守护进程来打开端口,然后创建子进程继承过去,然后重启的时候守护进程先创建新的进程,然后给旧的进程发送停止信号,旧进程会先关闭监听端口,然后等待所有请求处理完后慢慢退出,这样就可以实现完全平滑无异常重启更新了,这个好处是和 nginx 负责均衡啥的都不相干,应用自己就能完成,相对简单
不过很可惜像 supervisor 啥都不支持这个功能,其实 supervisor 完全可以打开端口后放在固定 fd 上,比如 3 ,或者可以通过参数传递 fd 的值,然后启动子进程后,子进程直接通过 fd 创建 socket 就好了 |
Alliot 10 小时 17 分钟前 Nginx upstream + healthcheck
假设 有 a b 2 个节点,发布时先将 A 置为 unhealth 状态,流量全部调度到 b 发布完成后置为 health ,同理发布 b 即可。 |
getoffworkontime 10 小时 11 分钟前 摘除旧服务的时候, 怎么保证旧服务中的任务已经执行完?
|
vincent7245 10 小时 4 分钟前 服务器是分布式的,滚动升级
|
anonymous2351d00 9 小时 46 分钟前 做一个 流量转发的中间层 成为 A ,你的服务 v1 版本称为 B1
假如 A -> B1 现在要发 B2 版本 保证 A -> B1 的流量控制 部署 B2 ,流量情况 nil -> B2 部署 B2 以非常非常快速的手速,光一样的敲动命令来 调整流量转发层 A -> B2 此时 nil -> B1 这个版本就好了 |
awanganddong 9 小时 15 分钟前 这个问题我昨天还在思考。
比如我们公司用的腾讯云的 lbs 首先第一步发送 curl ,将 clb 中配置的后端服务的权重置为 0 ,这时候不存在新增请求,只存在存量请求。这个过程中服务器 clb 还可以转发响应。 接下来就开始关闭 go 进程,这时候 go 代码可以配置优雅退出。等原来 go 进程退出后,就开始启用新的 go 进程。 |
cyningxu 9 小时 3 分钟前 多实例+注册中心?
|
ccagml 7 小时 41 分钟前 via Android 好奇,如果是类似数据库表结构变了,可以这样滚动更新吗
|
pengtdyd 7 小时 21 分钟前 半夜 3 点钟,断线 30 分钟没什么大不了,影响不了啥业务,不要把公司的业务想的那么重要,就像你穿了一件新衣服走在大街上,你以为别人都是注视你,其实别人压根不关心你穿的啥,别把自己想的太重要。
|
brader 5 小时 54 分钟前 via Android 1 @ccagml 你说的这个问题,和实现平滑更新没很大关系。你这个问题,更多的应该在代码层面实现,做一下版本控制,我这几年一直是这么干的,没遇到啥问题
|
whileFalse 5 小时 26 分钟前 via iPhone 你有负载均衡器吧!
|
Ericcccccccc 3 小时 52 分钟前 我估计你想找的是 服务发现, 搞明白了这个以及相关问题滚动发布就差不多解决了.
|
cdlnls 3 小时 44 分钟前 用 docker swarm / service ,比 k8s 简单,方便管理多个节点。发布也是滚动更新。
|
daysv 40 分钟前 问题在于你们运行 DDL DML 怎么实现两个服务无缝切换的? 是搞了两套库吗?
|
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK