This topic created in 2731 days ago, the information mentioned may be changed or developed.
“文件锁” 这个词不知道用的准不准确,我也是在别处听说的
现在有这么一个场景:
假如我用 go 写了一个 web 服务,当需要版本更新的时候需要替换当前服务器的文件,但是必须得停掉服务才能上传更新,而且 go 编译出来的文件还挺大的,上传到服务器所需时间几秒到几十秒不等
像 Python、Node.js ,它更新是直接可以上传覆盖的,需要重启服务后更新的才生效,而这个重启时间很短,1s 不到,用户那端几乎是无感知的
大佬们是如何解决的呢?
18 replies • 2018-12-19 13:17:59 +08:00
 |
|
1
0987363 Dec 19, 2018 via Android 1
上传到缓存目录,然后停止服务,然后替换,然后启动服务,用脚本一次性搞定
|
 |
|
2
ikaros Dec 19, 2018 1
你先上传到 home 下面,然后 mv 过去覆盖源程序,然后 supervisor restart 一下也就不到 1s 吧?
|
 |
|
3
Aliencn Dec 19, 2018 1
1 楼说的适用于 Windows 和 Linux 系统。 2 楼说的适用于 Linux 系统。
|
 |
|
4
misaka19000 Dec 19, 2018 2
最好的做法当然是起多个服务进程然后依次更新以此来保证服务不会中断
|
 |
|
5
mogita Dec 19, 2018 via iPhone 1
ELB。单机不可能确保没有 downtime。
|
 |
|
6
pkookp8 Dec 19, 2018 via Android 1
mv 到临时目录 kill 原进程 启动临时目录进程 cp 到原目录覆盖 kill 临时进程 启动原目录进程
linux 可以省略前三步,因为 linux 不存在运行的进程文件不能操作的问题
|
 |
|
7
yuikns Dec 19, 2018 via iPhone 1
docker 直接顶掉不就行了?
|
 |
|
8
reus Dec 19, 2018 1
上传时用另外的名字,不要直接覆盖,上传完了,再 mv
|
 |
|
9
gamexg Dec 19, 2018
linux 即使程序运行着也可以删除、改名。 windows 下即使运行着也是可以改名。
|
 |
|
10
zhengxiaowai Dec 19, 2018
一般来说有些语言支持热替换的比如 erlang,python 通过 hack 方式也能支持。
对于一般情况来说,如果你部署了多实例,用 nginx 反代的话,可以几个几个重启更新,nginx 会自己打到正常的服务下面,现在 docker 都是那么做的。如果你是单实例,那么 build 好之后,关闭当前重启新服务也是很快的
|
 |
|
11
zjsxwc Dec 19, 2018
nginx 灰度发布+1
|
 |
|
13
loveCoding Dec 19, 2018
负载均衡 + 持续集成 ,比较有代表性的就是 nginx + jenkins .完全没锁的概念
|
 |
|
14
fcten Dec 19, 2018
用软连接启动,更新服务后修改软连接的地址然后重启。
想要完全无缝的话就用 nginx 反代。
|
 |
|
15
qiyuey Dec 19, 2018 via Android
这是典型的平滑发布问题,无论替换多快总会有空洞期,热替换局限性比较大,正确做法是部署前主动进行当前机器的服务下线,部署成功后主动进行当前机器的服务上线。
|
 |
|
16
huoru Dec 19, 2018
最好的应该是: 旧的 A 程序 与 旧的 B 程序同时运行,nginx 的 upstream 改对应的后端,reload。
|
 |
|
17
AlphaTr Dec 19, 2018 via iPhone
关键词 Graceful Restart,有很多实现的
|