公司服务器上有个官网,一个软件的后台服务,数据库都在这一台服务器上。
有什么好的方式去解决更新 api 的时候不会中断呢服务呢。
![]() | 1 akira 2023-07-14 11:00:33 +08:00 更新时间在 1 分钟之内,直接重启就是了。 大不了半夜重启咯。 |
![]() | 2 BeforeTooLate 2023-07-14 11:04:09 +08:00 单机不重要的都是选个没人的时间段更新一下 |
3 vacuitym 2023-07-14 11:06:12 +08:00 用部署两个实例,平时开一个,更新的时候 ng 打到更新好的端口,然后把旧的停掉 |
![]() | 4 mineralsalt 2023-07-14 11:08:50 +08:00 运行两个实例不同端口, nginx 负载均衡, 随便停一个都不影响 api 请求, 轮流更新即可, 我就是这么做的 |
5 zzzzzzZ 2023-07-14 11:10:26 +08:00 你期望的无感平滑更新 小公司「滚动发布」是最常见的,或者「灰度发布」 |
![]() | 6 LeegoYih 2023-07-14 11:13:07 +08:00 1.假设已有实例 A:8080 正在运行 2.运行实例 B:8081 3.Nginx 改配置端口 8080->8081 ,nginx -s reload 4.销毁实例 A:8080 |
![]() | 7 0x663 2023-07-14 11:13:54 +08:00 灰度发布 |
8 buffzty 2023-07-14 11:14:46 +08:00 docker-compose 最优解 |
![]() | 9 everyx 2023-07-14 11:39:06 +08:00 我们用的 docker swarm 简单、轻量 |
10 brader 2023-07-14 11:46:55 +08:00 不好意思,我们 PHP 没有这个烦恼,都是直接 git pull ,嘿嘿 |
![]() | 11 zx900930 2023-07-14 13:20:39 +08:00 双实例,负载均衡,可以用 nginx 或者 traefik ,haproxy 之类。 更新的时候 rolling update 就可以了,数据库也可以做成主从复制类型的,这样数据库 migration 的时候也不会中断服务。 |
![]() | 12 tool2d 2023-07-14 13:28:52 +08:00 一般都是热更新,但你也说了,“很小的公司”,说明访问量很低,那服务重启一分钟,也完全没问题的。 我个人觉得 API 在初期变动很大的情况下,没必要追求热更新的无缝切换。 |
13 qinconquer OP @tool2d 明白了 感谢 |
14 qinconquer OP @everyx 貌似这个也要最少两台服务器 |
![]() | 15 SethShi 2023-07-14 14:23:35 +08:00 说一下你的系统架构, 像 PHP 这种不会存在更新中断, 想 Go 这种有直接在代码中判断信号来升级的. 实现不想在代码下手的就用楼下说的 Nginx 两个端口号轮流用更新 |
16 Vraw5 2023-07-14 15:55:49 +08:00 old 用端口 8888 起服务,new 用 9999 起服务,改 nginx ,reload 一下改过去就是了 |
17 hytex 2023-07-14 15:55:56 +08:00 关键字 nginx 、upstream 、backup ,完美实现你说的这种发布。只需要启动到一个端口,然后 kill 掉另一个端口的进程就好了 |
19 Erroad 2023-07-14 16:00:37 +08:00 找段没流量的时间直接重启 |
![]() | 20 rbe 2023-07-14 16:32:58 +08:00 负载均衡有流量控制的作用,参考 6 楼说的,部署完新服务做完健康检查后,用 nginx 切一下流量就行。 这里提供更多一点参考: 可以用 confd 来做自动切换 nginx 配置重启,把 nginx 的配置做成模板让 confd 管理,将新、旧容器的端口记在 etcd 或者简单点记在文件里。 用脚本在发布服务后更新 etcd 的 key => 触发 confd 更新 nginx 模板并自动执行 nginx -t / nginx -s reload |
![]() | 21 displayabc 2023-07-14 18:31:05 +08:00 docker swarm 只需要一台机器就可以 |
![]() | 22 everyx 2023-07-15 09:22:32 +08:00 @qinconquer #14 单机也可以的,还方便以后扩展到多台服务器,比 K8S 适合小企业,K8S 需要的资源又高、概念又多又复杂 |
23 qinconquer OP @everyx 有这方面的资料吗,我想学习下你说的单机模式去跑这个 |
![]() | 24 everyx 2023-07-17 19:27:37 +08:00 @qinconquer #23 很简单,直接 docker swarm init 就行了,可以直接看官方文档 https://docs.docker.com/engine/swarm/swarm-tutorial/ |
![]() | 25 zu1y 2023-07-23 01:30:31 +08:00 感觉上面说的都过于麻烦了。直接在一台服务器上部两个实例,然后 Nginx 上通过 nginx_upstream_check_module 模块配一个主动的健康检测就好了,后端使用滚动发布,发布过程中 Nginx 会通过心跳检测自动把不可用的那个实例摘除掉的 |