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

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

  •  
  •   qinconquer · 288 天前 · 3260 次点击
    这是一个创建于 288 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

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

    问题

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

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

    我个人觉得 API 在初期变动很大的情况下,没必要追求热更新的无缝切换。
    qinconquer
        13
    qinconquer  
    OP
       288 天前
    @tool2d 明白了 感谢
    qinconquer
        14
    qinconquer  
    OP
       288 天前
    @everyx 貌似这个也要最少两台服务器
    seth19960929
        15
    seth19960929  
       288 天前
    说一下你的系统架构, 像 PHP 这种不会存在更新中断, 想 Go 这种有直接在代码中判断信号来升级的.
    实现不想在代码下手的就用楼下说的 Nginx 两个端口号轮流用更新
    Vraw5
        16
    Vraw5  
       288 天前
    old 用端口 8888 起服务,new 用 9999 起服务,改 nginx ,reload 一下改过去就是了
    hytex
        17
    hytex  
       288 天前
    关键字 nginx 、upstream 、backup ,完美实现你说的这种发布。只需要启动到一个端口,然后 kill 掉另一个端口的进程就好了
    hytex
        18
    hytex  
       288 天前
    @hytex 和 6l 差不多的想法,但不需要 reload
    Erroad
        19
    Erroad  
       288 天前
    找段没流量的时间直接重启
    rbe
        20
    rbe  
       288 天前
    负载均衡有流量控制的作用,参考 6 楼说的,部署完新服务做完健康检查后,用 nginx 切一下流量就行。

    这里提供更多一点参考:
    可以用 confd 来做自动切换 nginx 配置重启,把 nginx 的配置做成模板让 confd 管理,将新、旧容器的端口记在 etcd 或者简单点记在文件里。
    用脚本在发布服务后更新 etcd 的 key => 触发 confd 更新 nginx 模板并自动执行 nginx -t / nginx -s reload
    haython
        21
    haython  
       288 天前
    docker swarm 只需要一台机器就可以
    everyx
        22
    everyx  
       287 天前
    @qinconquer #14 单机也可以的,还方便以后扩展到多台服务器,比 K8S 适合小企业,K8S 需要的资源又高、概念又多又复杂 😂
    qinconquer
        23
    qinconquer  
    OP
       286 天前
    @everyx 有这方面的资料吗,我想学习下你说的单机模式去跑这个
    everyx
        24
    everyx  
       285 天前
    @qinconquer #23 很简单,直接 docker swarm init 就行了,可以直接看官方文档 https://docs.docker.com/engine/swarm/swarm-tutorial/
    zu1y
        25
    zu1y  
       279 天前
    感觉上面说的都过于麻烦了。直接在一台服务器上部两个实例,然后 Nginx 上通过 nginx_upstream_check_module 模块配一个主动的健康检测就好了,后端使用滚动发布,发布过程中 Nginx 会通过心跳检测自动把不可用的那个实例摘除掉的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2900 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 734ms · UTC 14:44 · PVG 22:44 · LAX 07:44 · JFK 10:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.