• 请不要在回答技术问题时复制粘贴 AI 生成的内容
x97bgt
V2EX  ›  程序员

线上服务要咋切换版本才不会影响用户?

  •  
  •   x97bgt · Jul 31, 2020 · 9131 views
    This topic created in 2289 days ago, the information mentioned may be changed or developed.

    有若服务,每个服务都有集群,直接相互配合才能提供对外服务。假设若干服务要一起升级新版本,要咋起部署才能平滑升级,不影响线上?

    面试时遇到的问题,没答出来。。。

    52 replies  •  2020-08-01 20:31:19 +08:00
    zhangdashuan
    zhangdashuan
    Jul 31, 2020
    1
    蹲一个正确答案,我感觉是使用版本号,升级新版本保留老版本.
    Rekkles
    Rekkles
    Jul 31, 2020
    2
    停机升级。
    Ariver
    Ariver
    Jul 31, 2020
    3
    比如有 a->b->c 这样的依赖关系,每个服务四个实例。
    先 new c 2 个,然后 new b 两个,然后 new a 两个。然后把流量切到新的这边一部分。
    没问题全切。然后干掉老的。
    IMCA1024
    IMCA1024
    Jul 31, 2020
    4
    只要手速够快 切换得够快
    Tokiomi
    Tokiomi
    Jul 31, 2020
    5
    半夜人少的时候发布,被依赖的先发,接口向前兼容,灰度发布,最好还有 AB 环境
    wangxiaoaer
    wangxiaoaer
    Jul 31, 2020❤️21
    6
    listenerri
    listenerri
    Jul 31, 2020
    7
    部署策略对比:蓝绿部署、金丝雀发布及其他
    https://www.infoq.cn/article/LEI4vSFPiw5A6eN-ASo4
    WaldenHorizon
    WaldenHorizon
    Jul 31, 2020
    8
    灰度发布,上新服务时保留老服务,并且设置一个特殊标记决定流量往哪走,比如 http header,要求测试用客户端带上标记,同时服务内互相调用时传递,所以这个客户端走的都是新版本服务,而线上版本仍然是老服务
    sunziren
    sunziren
    Jul 31, 2020
    9
    @wangxiaoaer hahahahaha
    x97bgt
    x97bgt
    OP
    Jul 31, 2020
    10
    @Ariver @wangritian 控制流量往哪个机器上走,这个功能是负载均衡组件提供的么?
    594duck
    594duck
    Jul 31, 2020
    11
    @x97bgt 负载均衡只提供非常粗的,要上 API GW 或者 ESB 才行。非常复杂 。

    另外前端都好说,只要动数据库,那就搞了。

    比如 100 万行的表,你加个字段试试。哈哈哈哈哈哈,特别酸爽。

    我听人家说过 1 亿行的数据库,每周加字段改字段告诉我没事,都这么玩。秒级修改的。

    你信么,我是不信的。
    iluhcm
    iluhcm
    Jul 31, 2020
    13
    @594duck #11 100 万行的表效率还好吧,并不一定会锁全表。
    594duck
    594duck
    Jul 31, 2020
    14
    @iluhcm 并不一定这问题就来了。万一锁了呢,这库正好又是高负载库,那酸爽,那雪崩,那崩溃。所有经验都是被扣 KPI 得出来的教训。
    Umenezumi
    Umenezumi
    Jul 31, 2020
    15
    @594duck 高频读的库可以靠 rename 来切,,高频写就没办法了
    sadfQED2
    sadfQED2
    Jul 31, 2020 via Android
    16
    @594duck 根据修改表语录生成临时表,然后对老表,新表做双写,同时起一个脚本同步老表数据到新表,老表数据同步完成以后 rename 新表,删除老表

    对业务代码来说确实是秒级修改
    loophole12
    loophole12
    Jul 31, 2020 via Android
    17
    每个服务划分 set,分 set 逐步发布
    ChanKc
    ChanKc
    Jul 31, 2020 via Android
    18
    等用户都睡觉了起来搞
    natsji
    natsji
    Jul 31, 2020 via Android
    19
    发红包就行了
    Dabaicong
    Dabaicong
    Jul 31, 2020
    20
    mysql 5.6 以后就支持 online ddl 了。我们正式线上,单表将近 1 亿数据,正常加字段。
    luckyrayyy
    luckyrayyy
    Jul 31, 2020
    21
    先把新服务的整个链条依次起来,然一点一点的切流量过去。
    lavvrence
    lavvrence
    Jul 31, 2020
    22
    K8s 滚动升级。
    594duck
    594duck
    Jul 31, 2020
    23
    @sadfQED2 你这叫滚动升级,前期准备表稍大一点就是按天算了。特色 facebook 曾经 不是按月算了么。总工时都不省,另外要考虑的问题会更多。
    594duck
    594duck
    Jul 31, 2020
    24
    @jaylee4869 K8s 能够滚数据库么
    594duck
    594duck
    Jul 31, 2020
    25
    @Dabaicong 单表 1 亿,原生 online ddl 加字段,还秒加,从库还不卡。求大神介绍经验,我们虚心听讲。
    594duck
    594duck
    Jul 31, 2020
    26
    @Umenezumi #20 楼有亿级库秒加字段,我正在学习我们一起听听。
    WaldenHorizon
    WaldenHorizon
    Jul 31, 2020
    27
    @x97bgt 大概算是更复杂的负载均衡吧,istio 的虚拟服务可以控制流量
    privil
    privil
    Jul 31, 2020
    28
    @Dabaicong #20 您家的 mysql 太厉害了……
    @594duck #25 反正 mysql 肯定不行 TiDB 貌似可以
    Garland
    Garland
    Jul 31, 2020
    29
    拓扑排序
    winglight2016
    winglight2016
    Jul 31, 2020❤️4
    30
    面试不仅仅是回答问题还要精通问问题:
    1.要问,是否可以增加服务器 /容器数量?可以的话,那就简单了,当作重新部署,完事儿了,nginx 切过去
    2.要问,是否需要同时支持旧版本?
    3.要问,什么叫平滑,什么叫不影响线上?是说,无人值守,一键切换,还是说,如果有 bug,自动回滚?不影响是说,半夜无访问量时可以停机一小时,还是年故障时间不超过一小时?
    4.服务依赖关系是否手动管理?还是自动拉起部署?

    恰当的问题,有时候会直接带出答案。答不出来的时候反问回去,问到他觉得你其实啥都不懂,或者你找到答案。
    bonfy
    bonfy
    Jul 31, 2020
    31
    估计是想说 灰度发布 先切百分之几 然后慢慢切

    但是 实际操作么,估计还是半夜一把梭
    594duck
    594duck
    Jul 31, 2020 via iPhone
    32
    @privil TIDB 这东西,我是抱着怀疑态度的。

    我见过可以的有 oracle,microsoft sqlserver 。
    bagheer
    bagheer
    Jul 31, 2020
    33
    MySQL 的话,版本 8,新增了一个 instant add column
    nwsmhz
    nwsmhz
    Jul 31, 2020
    34
    otakustay
    otakustay
    Jul 31, 2020
    35
    线下先布一整套完整的,然后入口切?
    opengps
    opengps
    Jul 31, 2020
    36
    如果是云服务器集群,那么步骤是:
    从伸缩组(集群)移除一部分机器,
    升级这部分机器,
    然后移回这部分机器,
    然后移除其他机器
    然后移回这些机器
    (建议进行多轮,而不是举例中的 2 轮)
    opengps
    opengps
    Jul 31, 2020
    37
    如果是不兼容升级,则不得不停机了,一半会都要求兼容开发新接口,保留老接口可用,毕竟 app 之类的不想浏览器那么好控制(开闭原则)
    opengps
    opengps
    Jul 31, 2020
    38
    一套大型系统,需要考虑的问题很多,本帖下的所有回复仅仅是参考,切勿硬套
    windsound
    windsound
    Jul 31, 2020
    39
    @wangxiaoaer 掘金牛逼
    Actrace
    Actrace
    Jul 31, 2020
    40
    需要平滑过渡的,一般都做增量更新。
    比如 /api/v1/ /v2 这样更新,也不是所有接口都需要更新。
    windsound
    windsound
    Jul 31, 2020
    41
    @594duck 百万加字段还 ok 吧,没啥事儿。
    securityCoding
    securityCoding
    Jul 31, 2020
    42
    网关带+版本号灰度

    nginx 也能做只是不能自动化
    wangyzj
    wangyzj
    Jul 31, 2020
    43
    k8s 或者蓝绿
    TtTtTtT
    TtTtTtT
    Jul 31, 2020
    44
    理论上,蓝绿发布就可以了。
    实际上,保持代码向下兼容,然后加配置或者控制前端页面放量。
    核心上,只要保证最外层的业务在最后开启就可以了。
    slyang5
    slyang5
    Jul 31, 2020
    45
    @wangxiaoaer 掘金的更新是我 见过最粗暴的, 好几次都停服
    yangbonis
    yangbonis
    Jul 31, 2020 via iPhone
    46
    有向无环图,copy 入度大于 1 的节点转化成树,再从叶子到根分批次 1-n,先开第 n 批。通常反向代理等服务在第 1 批,数据库服务在第 n 批。我不太懂数据库,是用一些 sql 语句来升级的吗?性能问题只有并行和硬件两种方法,并行就是把锁的粒度变小。实际上把本来无关的代码强行安排次序也是锁。
    zjie
    zjie
    Jul 31, 2020
    47
    ,把所有需要升级的服务器都部署到单独的灰度组,然后根据用户的 id 之类的灰度,比如最开始是 1%,把这些流量打到新的灰度集群,其他就走原来的。
    灰度没有问题,就扩容,扩大灰度范围。
    最后没有问题,灰度全量,

    一段时间后没有问题,老的机器下线回收。
    cominghome
    cominghome
    Jul 31, 2020
    48
    最有性价比的办法:找个人少的时间,直接滚动发布(能问这个问题我感觉你们系统应该不支持类似灰度路由这样的操作)
    leeg810312
    leeg810312
    Jul 31, 2020 via Android
    49
    有没有大佬简要说一下案例流程啊,学习一下
    chenxytw
    chenxytw
    Aug 1, 2020
    51
    @594duck 空手套方案玩得溜啊
    594duck
    594duck
    Aug 1, 2020 via iPhone
    52
    @chenxytw 要怎么样,支付宝拿来开个价 亿级 mysql 秒加字段。这么厉害,我这种老运维真不会,学习下好不被淘汰
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   922 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 22:34 · PVG 06:34 · LAX 14:34 · JFK 17:34
    ♥ Do have faith in what you're doing.