V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wuzhizuiguo
V2EX  ›  程序员

请教下大佬, 小公司怎么不停机更新服务,更舒服地部署(不用熬夜)

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

    我们现在用的还是 在阿里云, 复制粘贴 tomcat ( war 包),nohup 启动 jar,用的是 spring cloud,多台服务器起多个同服务。 用户每天活跃也有一定量了。 遇到更新时,我们只能粗暴的选择人少的时候更新。一般是夜间。。很累。

    论坛里也看了些帖子,https://www.v2ex.com/t/705776 像某宝、狗东这样的网站怎么发布(更新)项目的; https://www.v2ex.com/t/694561 线上服务要咋切换版本才不会影响用户?

    (没有用过,感觉很高端..我们很多东西都没有) 想请教下大佬,我们这种 /类似的 该怎么做

    52 条回复    2021-03-19 16:09:23 +08:00
    realpg
        1
    realpg   268 天前   ❤️ 1
    架构好就可以。
    比如:
    前面负载分配器,后面新旧服务都起来,直接修改规则到新的,然后逐渐停机旧的
    realpg
        2
    realpg   268 天前
    PS 不是让你们这么做,随便想想就有很多方法
    chendy
        3
    chendy   268 天前   ❤️ 1
    本质上应该都是用负载均衡切流量,具体有很多做法
    最简单粗暴的可能是脚本切换 nginx 配置切流量
    eason1874
        4
    eason1874   268 天前   ❤️ 1
    做好版本兼容,就可以滚动部署,逐台下线,部署,再上线。

    版本不兼容的,用 tcpcopy 之类的工具复制流量测试新版本,然后下线一台,部署完成上线的同时下线其他所有机器,然后逐台部署上线恢复
    pathbox
        5
    pathbox   268 天前 via iPhone   ❤️ 2
    k8s
    zpfhbyx
        6
    zpfhbyx   268 天前   ❤️ 1
    用阿里云的负载均衡,切流量 , 滚动更新
    zhuweiyou
        7
    zhuweiyou   268 天前   ❤️ 1
    简单点, 就 nginx upstream 切流量
    keepeye
        8
    keepeye   268 天前   ❤️ 1
    蓝绿发布,前面挂一个负载均衡器就行了,可以用 nginx,也可以直接购买阿里云的 LBS
    no1xsyzy
        9
    no1xsyzy   268 天前   ❤️ 1
    我之前还没想到单机复制两个 tomcat 然后用 nginx 作负载均衡意义是啥,甚至吐槽 “单机负载均衡?!”
    之后才意识到负载均衡可以拿来作不停机更新。
    wzb0909
        10
    wzb0909   268 天前   ❤️ 1
    你没有不停机更新的需求呀,那就写个脚本,定时在夜里跑不就好了。。。

    应用软件,哪儿有什么高端的东西,都是商业词忽悠人的~
    xmumiffy
        11
    xmumiffy   268 天前 via Android   ❤️ 2
    上 docker stack 就自带不停机更新了 配上 CI 可以自动部署
    walker2laok
        12
    walker2laok   268 天前   ❤️ 1
    简单:阿里云的负载均衡用起来,然后一台一台的更新
    wakzz
        13
    wakzz   268 天前   ❤️ 1
    主流方案就是先切流量再部署的滚动部署方案,常见的就是 nginx 的 upstream 修改,以及 k8s 的 dns 服务发现。
    DoctorCat
        14
    DoctorCat   268 天前   ❤️ 1
    infra 和整体架构的问题,不是单纯的运维问题。做好高可用后对集群划分,设计自动化灰度等系统
    mensa23
        15
    mensa23   268 天前   ❤️ 1
    蓝绿发布。
    xarthur
        16
    xarthur   268 天前 via iPhone   ❤️ 1
    我觉得你们需要招一些合格的运维了(
    clf
        17
    clf   268 天前   ❤️ 1
    用的 k8s,CI/CD 自动化部署,代码合并后自动打包成镜像上传到阿里云的镜像库,然后告知生产环境拉取镜像,切换版本。
    litel
        18
    litel   268 天前
    部署一套成熟的 DevOps,甚至能学到更多东西
    lyric31
        19
    lyric31   268 天前
    @xarthur +1024 专门人做专门的事
    DollarKiller
        20
    DollarKiller   268 天前
    rancher 金丝雀发布
    519718366
        21
    519718366   268 天前 via iPhone   ❤️ 1
    阿里云 有个 云效,里面有个流水线可以帮你解决人肉发布…

    前面挂个阿里云的 负载均衡服务,经典型就行。

    感觉应该够你用了,不需要对你应用进行容器化。
    coderxy
        22
    coderxy   268 天前
    k8s
    chenqh
        23
    chenqh   268 天前
    @zhuweiyou 不修改 nginx upstream,直接重启服务会有什么坏的结果?
    zhuweiyou
        24
    zhuweiyou   268 天前
    @chenqh 你的服务启动不要时间的吗, 如果这个时候有用户来, 你怎么处理
    jxlwqq
        25
    jxlwqq   268 天前
    k8s
    redtea
        26
    redtea   268 天前
    有些时候停机发布更好,比如上次中币交易所热部署出事了,客户都以为他们跑路了,过了好多天才恢复,数据都回滚了,损失惨重。
    chenqh
        27
    chenqh   268 天前
    @zhuweiyou 明白了,难怪我总感觉没用,因为我写的是小程序,一个进程启动不需要 1S 中,难怪总感觉不需要移除那个进程
    chenqh
        28
    chenqh   268 天前
    @wakzz nginx upstream 修改,ansible 有什么脚本没有?
    Lemeng
        29
    Lemeng   268 天前
    小公司控制成本嘛!运维需求
    chairuosen
        30
    chairuosen   268 天前
    上面所有方案的前提是新旧版本可以兼容,瞬间切。如果要改数据库字段,还是停机靠谱
    ward56
        31
    ward56   268 天前   ❤️ 1
    用的什么系统?我一般用 linux 操作系统
    最基础的就是 pssh+superviserd+shell=你的需求轻松实现

    方案一、
    采用发版方法是: shell 脚本+expect 交互式+superviserd 实现。
    具体:shell 脚本+expect 批量上传同步
    superviserd 控制 jar 或者 tomcat 后台管理程序

    方案二、可以在上述基础上改进 saltstack 或者采用 jenkins 发版。

    方案三、再高级一点就是 k8s + jenkins
    dailiha01sy
        32
    dailiha01sy   268 天前
    @chairuosen 数据库字段可以随便改? 一般搞了就不改的吧
    shanghai1998
        33
    shanghai1998   268 天前   ❤️ 1
    我们有套小系统,对接了阿里云负载均衡 api,设置虚拟组;自动切换,点一点就行很是方便
    简单点先虚拟组 A 对外(老版本),更新虚拟 B (新版本),虚拟 B 测试确定;虚拟 B 对外,更新 A,测试确定
    balckjoker
        34
    balckjoker   268 天前   ❤️ 1
    简单点弄个负载均衡,应该别搞太复杂,太复杂了维护也烦
    gitlab runner 也很方便。
    SjwNo1
        35
    SjwNo1   268 天前
    hook build 替换 k8s 镜像源
    chenqh
        36
    chenqh   267 天前
    @ward56 不用 ansible+supervisord ?
    chenqh
        37
    chenqh   267 天前
    @dailiha01sy 加了需求总要加字段的吧
    kaokao123
        38
    kaokao123   267 天前
    开始用 serverless 吧,只要代码提交到 github,云会自动帮你部署。部署完成后会自动切换到新代码。
    young1lin
        39
    young1lin   267 天前   ❤️ 1
    《 Kubernetes 微服务实战》- 吉吉·赛凡,我简单看了下目录(确实没用到这些),感觉挺适合你这种情况的。
    灰度发布,金丝雀发布什么的,都有说。
    sampeng
        40
    sampeng   267 天前 via iPhone   ❤️ 1
    对小规模公司推 k8s ?我缓缓打出个…?
    lz 看样子需求很小。业务规模不大,非常简单。阿里云负载均衡按道理肯定用了。本质上不停机都是围绕这个来的。要复杂可以复杂。要简单可以简单。

    不是负载均衡本身能这样。要做一些工作的。我的 v0.1 版自动部署就非常简单。我的例子适用 lz 。我到这家公司的时候启动模式也是 nohup 。更新模式跟你一摸一样。
    我做的第一件事是不要手动去 nohup 启动。先不考虑滚动更新。这是一件很简单的事,1-2 个工作日就改造玩完了。jenkins 一个 job 的事。
    第二件事,开始考虑挂了拉起来。既然这样。我换个思路,系统启动要做到自动拉当前的 jar 包。启动。这也很简单,程序启动本来就有逻辑了。只要解决在系统启动得时候如何拉包的问题就解决了。
    第三件事,滚动更新。我是 aws,研究一下负载均衡和弹性伸缩。
    首先负载均衡会自动检查节点是否健康,如果不健康,摘除并且关闭节点,其次,弹性伸缩会保护一定要到一个数额。那这个问题就简单了。因为第一件和第二件事我已经做了,只要配置好了弹性伸缩和负载均衡。效果就出来了。那如何滚动更新讷?一台一台关掉就是了,关一台检查是否启动成功,再关下一台。其他都不用考虑。到此,负载均衡和弹性伸缩就都 work 了…接下来就是要解决日志的问题…

    顺便说一下…我们有 80+微服务。这套逻辑跑了小半年,最后当然我可以踏踏实实的切刀 k8s 里。废话…200 多实例多浪费钱啊…
    xuanbg
        41
    xuanbg   267 天前   ❤️ 1
    jenkins 一个 job 里面,先 build 好镜像推送到仓库,然后挨个通过 ssh 执行 docker run 。控制好时间间隔,保证在前一个服务可用后再去更新下一个就行了。还 k8s 、负载均衡,搞辣么复杂做咩?
    rootmaster
        42
    rootmaster   267 天前
    Jenkins 自由风格啊
    calmzhu
        43
    calmzhu   267 天前   ❤️ 1
    蓝绿部署或者滚动发布。

    但是重点不在部署。部署完成后配套的可靠的自动化测试以及有效的心跳检测才是上面方案有效的关键。
    bfme
        44
    bfme   267 天前
    问一下楼上说用阿里云负载均衡,不停机,滚动部署的,怎么做版本测试?会不会影响正常用户的使用?
    baoshuai33
        45
    baoshuai33   267 天前 via iPhone
    @xarthur 运维也问怎么做,运维默认会这个吗
    notejava
        46
    notejava   267 天前
    nginx 切流量
    wakzz
        47
    wakzz   267 天前
    @chenqh 我们公司的 ansible 脚本是自己写的,没有开源
    chenqh
        48
    chenqh   267 天前
    @wakzz 不开心
    wakzz
        49
    wakzz   267 天前
    我以前还调研了另一种适合小公司的部署方案,如下图所示
    wakzz
        50
    wakzz   267 天前   ❤️ 1
    我以前还调研了另一种适合小公司的部署方案,如下图所示

    https://img.wakzz.cn/202102/pQ8yeTK2if.png

    用开源框架 Kong 网关替代 Nginx(Kong 就是对 Nginx 做了一层封装),然后自行代码开发实现一个节点监听服务,通过对接注册中心的 API 来实时监听各个服务节点的状态。当某服务节点上下线后,注册中心将节点上下线事件推送给监听服务,然后监听服务通过 Kong 的开放 API 修改 Kong 中的 upstream 。

    通过上述方案从而实现一个注册中心同时管理微服务之间的服务发现和网关到服务的服务发现。此时应用发布流程例如对某服务的 a 、b 两节点发版时具体逻辑如下:
    1. 请求注册中心下线该服务的 a 节点
    2. 监听服务监听到 a 节点下线后自动将 Kong 中的 a 节点下线
    3. 等待 a 节点无流量请求后发布重启 a 节点的新版本,等待策略简单方案就是等待 1 分钟,复杂点就是监控带宽
    4. a 节点启动成功后自动将自己重新注册到注册中心
    5. 监听服务监听到 a 节点上线后自动将 Kong 中的 a 节点上线
    6. 接着同样的逻辑操作 b 节点
    ward56
        51
    ward56   265 天前
    @chenqh 各人习惯,我不太精通 ansible,所以未写。
    tq0fqeu
        52
    tq0fqeu   254 天前   ❤️ 1
    阿里云云效有个主机分批发布的功能可能对你有帮助 https://thoughts.aliyun.com/sharespace/5e86a419546fd9001aee81f2/docs/5e86a416546fd9001aee81b8#5e847eca0aba01ecdbc57cd2

    不过摘流量的逻辑肯定要在你应用启动脚本里定制的,除非你用 k8..
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2376 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:46 · PVG 22:46 · LAX 06:46 · JFK 09:46
    ♥ Do have faith in what you're doing.