之前用户少都是公司内部人使用,随便新增一个什么功能,直接就是拉一下代码,重启 web 服务也没问题。最近公司使用的人多了以后,发现这种方式不太适用啦。
我就想有用什么方式改造一下能够实现热更新或者是发版不停服,让用户无感知发版。难道是启动两套服务,做个负载,一个一个的重启?没这样搞过,不知道这种模式会不会有什么坑之类的,或者有什么更好的实现方法没有。
各位大佬给个建议!```
1
chogath 2021-07-06 18:57:15 +08:00
服务器部署可以用 pm2,集群可以靠谱部署 k8s 做滚动更新或者其他策略
|
2
no1xsyzy 2021-07-06 18:57:16 +08:00
我这边有一个就是直接起两个服务做负载均衡分别重启。
当然也有只需要起一个服务并且在重启过程中阻塞保持现有链接的。 gunicorn 的自动重载应当是支持这样操作的,但它可以作为攻击面,小心使用。 更好当然是 k8s 及其轻量替代品,但就是轻量替代品可能都嫌重。 |
3
arischow 2021-07-06 19:16:33 +08:00 via iPhone
负载均衡,检查服务健康,注册 /反注册服务,可以用 Ansible 类似的工具做。
我用 Kubernetes |
4
mkdir 2021-07-06 19:34:12 +08:00
来了来了,K8S 替代品 docker swarm,滚动发布,操作简单
|
5
DeWjjj 2021-07-06 19:43:38 +08:00
启用两套服务,然后主从数据库做交接。
|
6
securityCoding 2021-07-06 19:45:11 +08:00
k8s 正解,现在都是云服务器直接用云服务商的集群就好
|
7
netwjx 2021-07-06 21:45:10 +08:00
前置 nginx, 后面放个集群, 至少 2 台
手动切集群 |
8
luoqeng 2021-07-06 22:03:50 +08:00
web 都是无状态服务,没啥可热更新的
|
9
akira 2021-07-06 22:47:40 +08:00
理论上只需要 3 步 :dodge
1. 启动新服务 2. 新流量切换到新服务 3. 关闭旧服务 |
10
myd 2021-07-06 22:55:24 +08:00
数据库的更新呢
|
11
kingfalse 2021-07-07 08:03:18 +08:00 via Android
rancher 一把梭子 over
|
12
finian 2021-07-07 08:58:37 +08:00 1
搜 graceful shutdown
|
13
vueli 2021-07-07 09:12:00 +08:00
web 项目? 是前后端分离的还是怎么样的.
|
14
longmeier90 OP @vueli 嗯,前后端分离的项目
|
15
lele88lala 2021-07-07 10:32:56 +08:00
不好意思打扰了,你们都是怎么发帖子的,为什么我发不了呢?
|
16
ClericPy 2021-07-07 10:37:55 +08:00
以前 Gunicorn 用的 HUP 信号, 这算热更新么
Reload the configuration The HUP signal can be used to reload the Gunicorn configuration on the fly. Sending a HUP signal will reload the configuration, start the new worker processes with a new configuration and gracefully shutdown older workers. 现在一直 uvicorn 没找到类似的, 估计也要依赖 Gunicorn worker 来整 |
17
hb751968840 2021-07-07 10:43:26 +08:00
要有集群
|
18
jorneyr 2021-07-07 11:02:02 +08:00
轮流升级也有坑: 例如计算数值的 Api:
旧版: 1+1 返回 3 新版: 1+1 返回 2 使用负载的时候,新旧版同时存在,同一个接口调用因为负载返回 2 个不同结果。 |
19
binbin0915 2021-07-07 11:19:54 +08:00
php 吧 随便替换...
|
20
abersheeran 2021-07-07 13:45:41 +08:00
@ClericPy uvicorn 没考虑过做这个功能,gunicorn+uvicorn worker 搭配就行了。
|
21
ClericPy 2021-07-07 14:17:01 +08:00
@abersheeran 是, 不过我很多时候懒得装 gunicorn, 所以自己 handle signal 然后外面用 systemd 守护, 或者直接用 uvicorn 自带的 reload. 就赌不会那么导致重启一刹那正好有个请求没接到...
gunicorn 的 HUP 信号算热重启么, 会有几率丢请求么. 非后端不确定有没有什么靠谱点的办法, 一开始以为 nginx 会在程序重启的时候帮我 hold 住结果直接给人返回了 502... 前东家除了 HUP 信号, 还有几个操作就是靠的 nginx upstream 的负载均衡, 每次重启服务一台一台重启让坏节点自动被另一个节点接管 |
22
abersheeran 2021-07-07 14:44:42 +08:00 1
@ClericPy https://github.com/index-py/index.py/blob/master/indexpy/cli.py#L206 我也比较懒,直接封装了 gunicorn 和 uvicorn 的操作,对外暴露的使用方式一致。我每次用的时候只要改 index-cli [uvicorn|gunicorn] ....... 中间的部分就可以无缝切换了。
|
24
YangWaleed 2021-07-07 19:51:18 +08:00
换 erlang 吧( doge
|