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

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

  •  
  •   x97bgt · 13 天前 · 5061 次点击

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

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

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

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

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

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

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

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

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

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

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

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

    一段时间后没有问题,老的机器下线回收。
    cominghome
        48
    cominghome   13 天前
    最有性价比的办法:找个人少的时间,直接滚动发布(能问这个问题我感觉你们系统应该不支持类似灰度路由这样的操作)
    leeg810312
        49
    leeg810312   13 天前 via Android
    有没有大佬简要说一下案例流程啊,学习一下
    chihiro2014
        50
    chihiro2014   13 天前
    chenxytw
        51
    chenxytw   12 天前
    @594duck 空手套方案玩得溜啊
    594duck
        52
    594duck   12 天前 via iPhone
    @chenxytw 要怎么样,支付宝拿来开个价 亿级 mysql 秒加字段。这么厉害,我这种老运维真不会,学习下好不被淘汰
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1062 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:31 · PVG 04:31 · LAX 13:31 · JFK 16:31
    ♥ Do have faith in what you're doing.