V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
FutureApple
V2EX  ›  问与答

如果你有一个数据中心,你如何同时将里面的服务器的软件做一个升级呢?

  •  1
     
  •   FutureApple · 2021-06-16 20:11:54 +08:00 · 3298 次点击
    这是一个创建于 1016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天看到群里的大佬给了一个问题,你有一个数据中心,数据中心里有一百万台机器(物理机或虚拟机),这一百万台机器都安装了一些组件,例如安装了 ffmpeg 4.5,现在你的任务是将它们的这个组件全部升级到 ffmpeg 4.6 。

    看起来不难,你很快就搞定了一个 4.6 的安装包,然后你发现你需要把这个安装包发给一百万台机,显然不行。装完可能大半年过去了。

    注意:不能使用 P2P

    第 1 条附言  ·  2021-06-17 21:39:50 +08:00
    这里说一下 如果使用 CDN 节点的话同时 100W 的请求你觉得就单个机房能请求到的节点数康的住?

    这里要求的是单台服务器出现故障不影响其他的机器,因此不可能 1 》 2 》 4 》 8 这样传
    45 条回复    2021-06-18 07:36:17 +08:00
    PrinceofInj
        1
    PrinceofInj  
       2021-06-16 20:26:28 +08:00 via Android   ❤️ 5
    先问一下这一百万台是怎么装出来的。啥?一台台装出来的?那我一台台去更新有啥问题么?
    opengps
        2
    opengps  
       2021-06-16 20:29:09 +08:00
    这个规模,打包系统镜像,基于弹性伸缩逐步切换吧
    kaikai5601
        3
    kaikai5601  
       2021-06-16 20:30:27 +08:00 via iPhone
    不用 p2p,那就内网传输,并发啊,怎么可能要大半年
    FutureApple
        4
    FutureApple  
    OP
       2021-06-16 20:32:29 +08:00
    @kaikai5601 #3 那并发的那一台服务器因为负载过高死掉了呢?
    aureole999
        5
    aureole999  
       2021-06-16 20:32:35 +08:00   ❤️ 1
    这是不是就是类似 Ansible 之类干的事情?
    3dwelcome
        6
    3dwelcome  
       2021-06-16 20:33:06 +08:00
    如果你有一百万个用户,如何让用户软件都升级到最新版本?

    显然一个个让客户下载最新客户端安装,是不可能的,大半年过去了。
    FutureApple
        7
    FutureApple  
    OP
       2021-06-16 20:34:47 +08:00
    @aureole999 #5
    @3dwelcome #6 不是命令的发起,而是如何将这 100 万台服务器中都下载到这个更新包
    abersheeran
        8
    abersheeran  
       2021-06-16 20:45:36 +08:00
    内网,假设一万台机子下载需要十秒。一百万台也就一千秒,这个时间你们应该完全能接受。

    Nginx 提供静态文件,内网一万并发,很轻松。实际上应该更高一些。所以你大概几百秒就可以完成下载任务。
    Rheinmetal
        9
    Rheinmetal  
       2021-06-16 20:56:28 +08:00
    没有配好基础设施的情况下 约等于开发病毒
    eason1874
        10
    eason1874  
       2021-06-16 21:08:18 +08:00   ❤️ 2
    单机性能大概算一下并发数,然后按 1>100>10000>1000000 这样滚动发布,先拿到文件的也加入发布序列给后面的传输文件。就算没有内网也用不了多久啊。

    多机软件升级的要点不在于文件传输吧,传输很快的,难点在升级期间不影响服务。
    huangzxx
        11
    huangzxx  
       2021-06-16 21:11:33 +08:00
    打好一个包,ansible 跑一遍 apt install ?
    FreeEx
        12
    FreeEx  
       2021-06-16 21:21:23 +08:00 via iPhone   ❤️ 2
    这算是什么大佬…
    learningman
        13
    learningman  
       2021-06-16 21:27:22 +08:00 via Android
    广播?
    learningman
        14
    learningman  
       2021-06-16 21:28:04 +08:00 via Android
    你在一个内网,里不管用不用 p2p 交换数据都受限于交换机啊。
    FutureApple
        15
    FutureApple  
    OP
       2021-06-16 21:30:47 +08:00
    @eason1874 #10 如果其中一台服务器炸了他下面会广播的机器也会炸啊
    FutureApple
        16
    FutureApple  
    OP
       2021-06-16 21:33:41 +08:00
    @learningman #14 不是数据受限的问题,如果广播的服务器炸了其他的服务器也都甭想升级了,要求的是一个哪怕单机炸了也不会影响到其他任意机器的架构
    @eason1874 #10
    @abersheeran #8
    FutureApple
        17
    FutureApple  
    OP
       2021-06-16 21:36:24 +08:00
    @huangzxx #11 问题是这个包怎么传给那 999999 台其他的服务器
    momocraft
        18
    momocraft  
       2021-06-16 21:40:00 +08:00
    感觉你被大佬钓鱼了
    akira
        19
    akira  
       2021-06-16 21:40:18 +08:00
    要么推 要么拉
    FutureApple
        20
    FutureApple  
    OP
       2021-06-16 21:44:55 +08:00
    @momocraft #18
    @FreeEx #12 这是个微软的大佬再群里发的问题,他说 windows 更新其实是基于 p2p 的
    Reficul
        21
    Reficul  
       2021-06-16 21:48:35 +08:00
    为什么不能 P2P,我们现在就是这么做的,总规模不比 100w 小。
    Reficul
        22
    Reficul  
       2021-06-16 21:53:53 +08:00
    下载参考 Uber 或者蜻蜓,这个问题的主要难点不在分发上,在更新不影响业务上。

    https://github.com/uber/kraken
    FutureApple
        23
    FutureApple  
    OP
       2021-06-16 21:54:06 +08:00
    @Reficul #21 题目要求不使用 P2P,当然要用当然可以用,主要是感觉在。。。重复写迅雷?而且自己写 bug 还一堆。。。
    Reficul
        24
    Reficul  
       2021-06-16 21:58:32 +08:00
    @FutureApple 不太一样,迅雷这种 P2P 协议不是为数据中心优化的。

    有些功能是用不到的,比如数据中心发布节点是可信的,网络情况也比公网要好很多。
    有些功能则是没有的,比如按照机房机架或者 VPC 优化流量,按照发布的特点复用以往数据等等。
    Jirajine
        25
    Jirajine  
       2021-06-16 22:05:03 +08:00 via Android
    p2p 是很合适的,就算没有,多级缓存慢慢更也不是太大问题。

    p2p 也不用自己实现,像这种用 ipfs 搭建 pacman 镜像源 https://github.com/victorb/arch-mirror
    或者直接用 libp2p

    再往前很多游戏客户端都用魔改的 bt 协议。
    billlee
        26
    billlee  
       2021-06-16 22:46:35 +08:00
    算并发数什么的人根本没审题,ffmpeg 的大小有上百 MB,瓶颈在于带宽
    gstqc
        27
    gstqc  
       2021-06-16 22:57:33 +08:00
    就算是纯静态编译
    https://johnvansickle.com/ffmpeg/ 的安装包算,ffmpeg-release-amd64-static.tar.xz 的大小是 39577132 Bytes

    39577132 * 100 * 10000 / 1024**4 = 36 TB

    随便找两台服务器,每台服务器装 60G 网卡,加起来 120G,一个小时搞定
    39577132 * 100 * 10000 / (120 * 1000**3 / 8) = 2638s
    gstqc
        28
    gstqc  
       2021-06-16 23:09:30 +08:00
    另外一些计算结果:
    假如使用一种合适的算法,使得 100 万台服务器的更新时间在 1 小时里趋于均匀分布
    则两台服务器每台的 connection per second 为
    100*10000 / 3600 / 2 = 139
    每台服务器每秒能传输的安装包数量为
    60*1000**3 / 8/ 39577132 = 190

    这种性能需求,随便近几年的至强都行了,只要优化下网卡队列和系统内核参数
    binux
        29
    binux  
       2021-06-16 23:31:16 +08:00 via Android
    @FutureApple 广播的服务器炸了,你不会等一等再重试吗?
    iseki
        30
    iseki  
       2021-06-16 23:32:02 +08:00
    自己调度一下,非要同时传输那就上 UDP 广播组播,然后自己解决流控和丢包问题 <- 感觉这是伪需求
    3dwelcome
        31
    3dwelcome  
       2021-06-16 23:32:30 +08:00   ❤️ 1
    @FutureApple "这是个微软的大佬再群里发的问题,他说 windows 更新其实是基于 p2p 的"

    国内 99%互联网用户没有公网 IP,根本没办法相互直连,哪有什么 P2P,是你想太多了。
    Greatshu
        32
    Greatshu  
       2021-06-16 23:37:35 +08:00
    这个不就是各大云厂商内网镜像源吗,上 CDN 就完事了,比如阿里云的内网镜像源

    dig mirrors.aliyuncs.com

    ;; ANSWER SECTION:
    mirrors.aliyuncs.com. 178 IN CNAME mirrors.aliyuncs.com.gds.alibabadns.com.
    mirrors.aliyuncs.com.gds.alibabadns.com. 15 IN A 10.157.200.6
    ryd994
        33
    ryd994  
       2021-06-17 00:27:41 +08:00
    P2P 是有一部分:Delivery Optimization 。但是这要用户同意。
    其次是基于 BITS 的服务器分发: https://docs.microsoft.com/en-us/windows-server/administration/windows-server-update-services/deploy/2-configure-wsus#211-connection-from-the-wsus-server-to-the-internet

    这有何难? AWS S3 做得,Azure Blob Storage 做得,Windows Update 做不得?
    分批次推送就好了啊。不是所有 Windows 机器都同时收到更新的。前后差好几天呢。

    企业内部可以通过 WSUS 和组策略等进一步控制。比如企业想暂停更新之类的。

    别说这是微软的人,我丢不起这人。“如果你有一个数据中心” Azure 这不叫数据中心? Fabric rollout 怎么干的?
    hronro
        34
    hronro  
       2021-06-17 00:50:05 +08:00 via iPhone
    真的有大佬会在 QQ 群里问问题吗?
    kaikai5601
        35
    kaikai5601  
       2021-06-17 01:00:28 +08:00 via iPhone
    @FutureApple 多搞几台思并发啊,而且只 scp 怎么会死掉
    felixcode
        36
    felixcode  
       2021-06-17 02:44:57 +08:00 via Android
    写个脚本让软件自行扩散,类似病毒
    learningman
        37
    learningman  
       2021-06-17 09:23:30 +08:00 via Android
    @3dwelcome 有的,你打开 win10,更新底下是不是有个传输优化,那个就是 p2p 。
    有没有是一回事,能不能用是一回事
    James369
        38
    James369  
       2021-06-17 10:50:15 +08:00
    初始设想,应该采用网络镜像技术
    FS1P7dJz
        39
    FS1P7dJz  
       2021-06-17 11:01:47 +08:00
    是哪个 SJB 会让 100W 设备同时升级?

    讨论这种毫无意义的问题很闲时不时

    而且这种发散问题,每个方向不同的人,讨论的方向都不同

    看起来你们这个群想讨论的只是网络并发 100W 个连接请求这种问题
    而不是真正的"100W 台设备如何升级"这个问题
    onionlc
        40
    onionlc  
       2021-06-17 11:09:03 +08:00
    内网建个 nginx,包放上去,ansible 批量执行去 nginx 拉包更新升级;
    基础设施没做好的话,也得耗费点时间;
    sleepm
        41
    sleepm  
       2021-06-17 11:23:54 +08:00
    https://docs.microsoft.com/zh-cn/windows/msix/desktop/managing-your-msix-deployment-retail
    使用应用商店,哈哈
    同意九楼的,这属于基础设施
    mikeven
        42
    mikeven  
       2021-06-17 14:24:21 +08:00
    现在苹果 10 亿台设备系统的 OTA 都能实现,这很难吗
    SlipStupig
        43
    SlipStupig  
       2021-06-17 14:42:38 +08:00
    Linux 不是有软件源嘛.....直接更软件更新源就好了啊.......这个问题有什么讨论的意义呢
    FutureApple
        44
    FutureApple  
    OP
       2021-06-17 21:35:21 +08:00
    @mikeven #42 那是位置不在一个点啊,同时请求一个 CDN 活着几个 CDN 节点你觉得你的 CDN 节点扛得住?
    @SlipStupig #43
    @onionlc #40
    Kinnice
        45
    Kinnice  
       2021-06-18 07:36:17 +08:00 via Android
    @FutureApple 你小瞧了 cdn 的调度,一个 cdn 的节点负载上升,会调度到其他节点,并不会你同个机房的都去访问那一个节点。CDN 做的比较好的单节点 100G 吃得下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4509 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 05:34 · PVG 13:34 · LAX 22:34 · JFK 01:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.