V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qinconquer
V2EX  ›  服务器

很小的公司一般采用什么样的服务器架构呢?

  •  
  •   qinconquer · 2023-07-14 10:58:44 +08:00 · 3561 次点击
    这是一个创建于 503 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    公司服务器上有个官网,一个软件的后台服务,数据库都在这一台服务器上。

    问题

    有什么好的方式去解决更新 api 的时候不会中断呢服务呢。

    25 条回复    2023-07-23 01:30:31 +08:00
    akira
        1
    akira  
       2023-07-14 11:00:33 +08:00
    更新时间在 1 分钟之内,直接重启就是了。 大不了半夜重启咯。
    BeforeTooLate
        2
    BeforeTooLate  
       2023-07-14 11:04:09 +08:00
    单机不重要的都是选个没人的时间段更新一下
    vacuitym
        3
    vacuitym  
       2023-07-14 11:06:12 +08:00
    用部署两个实例,平时开一个,更新的时候 ng 打到更新好的端口,然后把旧的停掉
    mineralsalt
        4
    mineralsalt  
       2023-07-14 11:08:50 +08:00
    运行两个实例不同端口, nginx 负载均衡, 随便停一个都不影响 api 请求, 轮流更新即可, 我就是这么做的
    zzzzzzZ
        5
    zzzzzzZ  
       2023-07-14 11:10:26 +08:00
    你期望的无感平滑更新
    小公司「滚动发布」是最常见的,或者「灰度发布」
    LeegoYih
        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
    0x663
        7
    0x663  
       2023-07-14 11:13:54 +08:00
    灰度发布
    buffzty
        8
    buffzty  
       2023-07-14 11:14:46 +08:00
    docker-compose 最优解
    everyx
        9
    everyx  
       2023-07-14 11:39:06 +08:00
    我们用的 docker swarm 简单、轻量 😁
    brader
        10
    brader  
       2023-07-14 11:46:55 +08:00
    不好意思,我们 PHP 没有这个烦恼,都是直接 git pull ,嘿嘿
    zx900930
        11
    zx900930  
       2023-07-14 13:20:39 +08:00
    双实例,负载均衡,可以用 nginx 或者 traefik ,haproxy 之类。
    更新的时候 rolling update 就可以了,数据库也可以做成主从复制类型的,这样数据库 migration 的时候也不会中断服务。
    tool2d
        12
    tool2d  
       2023-07-14 13:28:52 +08:00
    一般都是热更新,但你也说了,“很小的公司”,说明访问量很低,那服务重启一分钟,也完全没问题的。

    我个人觉得 API 在初期变动很大的情况下,没必要追求热更新的无缝切换。
    qinconquer
        13
    qinconquer  
    OP
       2023-07-14 13:43:12 +08:00
    @tool2d 明白了 感谢
    qinconquer
        14
    qinconquer  
    OP
       2023-07-14 13:44:33 +08:00
    @everyx 貌似这个也要最少两台服务器
    seth19960929
        15
    seth19960929  
       2023-07-14 14:23:35 +08:00
    说一下你的系统架构, 像 PHP 这种不会存在更新中断, 想 Go 这种有直接在代码中判断信号来升级的.
    实现不想在代码下手的就用楼下说的 Nginx 两个端口号轮流用更新
    Vraw5
        16
    Vraw5  
       2023-07-14 15:55:49 +08:00
    old 用端口 8888 起服务,new 用 9999 起服务,改 nginx ,reload 一下改过去就是了
    hytex
        17
    hytex  
       2023-07-14 15:55:56 +08:00
    关键字 nginx 、upstream 、backup ,完美实现你说的这种发布。只需要启动到一个端口,然后 kill 掉另一个端口的进程就好了
    hytex
        18
    hytex  
       2023-07-14 15:57:12 +08:00
    @hytex 和 6l 差不多的想法,但不需要 reload
    Erroad
        19
    Erroad  
       2023-07-14 16:00:37 +08:00
    找段没流量的时间直接重启
    rbe
        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
    haython
        21
    haython  
       2023-07-14 18:31:05 +08:00
    docker swarm 只需要一台机器就可以
    everyx
        22
    everyx  
       2023-07-15 09:22:32 +08:00
    @qinconquer #14 单机也可以的,还方便以后扩展到多台服务器,比 K8S 适合小企业,K8S 需要的资源又高、概念又多又复杂 😂
    qinconquer
        23
    qinconquer  
    OP
       2023-07-16 19:38:22 +08:00
    @everyx 有这方面的资料吗,我想学习下你说的单机模式去跑这个
    everyx
        24
    everyx  
       2023-07-17 19:27:37 +08:00
    @qinconquer #23 很简单,直接 docker swarm init 就行了,可以直接看官方文档 https://docs.docker.com/engine/swarm/swarm-tutorial/
    zu1y
        25
    zu1y  
       2023-07-23 01:30:31 +08:00
    感觉上面说的都过于麻烦了。直接在一台服务器上部两个实例,然后 Nginx 上通过 nginx_upstream_check_module 模块配一个主动的健康检测就好了,后端使用滚动发布,发布过程中 Nginx 会通过心跳检测自动把不可用的那个实例摘除掉的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5830 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.