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

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

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

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

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

    注意:不能使用 P2P

    第 1 条附言  ·  46 天前
    这里说一下 如果使用 CDN 节点的话同时 100W 的请求你觉得就单个机房能请求到的节点数康的住?

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

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

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

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

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

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

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

    再往前很多游戏客户端都用魔改的 bt 协议。
    billlee
        26
    billlee   47 天前
    算并发数什么的人根本没审题,ffmpeg 的大小有上百 MB,瓶颈在于带宽
    gstqc
        27
    gstqc   47 天前
    就算是纯静态编译
    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   47 天前
    另外一些计算结果:
    假如使用一种合适的算法,使得 100 万台服务器的更新时间在 1 小时里趋于均匀分布
    则两台服务器每台的 connection per second 为
    100*10000 / 3600 / 2 = 139
    每台服务器每秒能传输的安装包数量为
    60*1000**3 / 8/ 39577132 = 190

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

    国内 99%互联网用户没有公网 IP,根本没办法相互直连,哪有什么 P2P,是你想太多了。
    Greatshu
        32
    Greatshu   47 天前
    这个不就是各大云厂商内网镜像源吗,上 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   47 天前
    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   47 天前 via iPhone
    真的有大佬会在 QQ 群里问问题吗?
    kaikai5601
        35
    kaikai5601   47 天前 via iPhone
    @FutureApple 多搞几台思并发啊,而且只 scp 怎么会死掉
    felixcode
        36
    felixcode   47 天前 via Android
    写个脚本让软件自行扩散,类似病毒
    learningman
        37
    learningman   47 天前 via Android
    @3dwelcome 有的,你打开 win10,更新底下是不是有个传输优化,那个就是 p2p 。
    有没有是一回事,能不能用是一回事
    James369
        38
    James369   47 天前
    初始设想,应该采用网络镜像技术
    FS1P7dJz
        39
    FS1P7dJz   47 天前
    是哪个 SJB 会让 100W 设备同时升级?

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

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

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