
今天看到群里的大佬给了一个问题,你有一个数据中心,数据中心里有一百万台机器(物理机或虚拟机),这一百万台机器都安装了一些组件,例如安装了 ffmpeg 4.5,现在你的任务是将它们的这个组件全部升级到 ffmpeg 4.6 。
看起来不难,你很快就搞定了一个 4.6 的安装包,然后你发现你需要把这个安装包发给一百万台机,显然不行。装完可能大半年过去了。
注意:不能使用 P2P
1 PrinceofInj 2021-06-16 20:26:28 +08:00 via Android 先问一下这一百万台是怎么装出来的。啥?一台台装出来的?那我一台台去更新有啥问题么? |
2 opengps 2021-06-16 20:29:09 +08:00 这个规模,打包系统镜像,基于弹性伸缩逐步切换吧 |
3 kaikai5601 2021-06-16 20:30:27 +08:00 via iPhone 不用 p2p,那就内网传输,并发啊,怎么可能要大半年 |
4 FutureApple OP @kaikai5601 #3 那并发的那一台服务器因为负载过高死掉了呢? |
5 aureole999 2021-06-16 20:32:35 +08:00 这是不是就是类似 Ansible 之类干的事情? |
6 3dwelcome 2021-06-16 2:33:06 +08:00 如果你有一百万个用户,如何让用户软件都升级到最新版本? 显然一个个让客户下载最新客户端安装,是不可能的,大半年过去了。 |
7 FutureApple OP |
8 abersheeran 2021-06-16 20:45:36 +08:00 内网,假设一万台机子下载需要十秒。一百万台也就一千秒,这个时间你们应该完全能接受。 Nginx 提供静态文件,内网一万并发,很轻松。实际上应该更高一些。所以你大概几百秒就可以完成下载任务。 |
9 Rheinmetal 2021-06-16 20:56:28 +08:00 没有配好基础设施的情况下 约等于开发病毒 |
10 eason1874 2021-06-16 21:08:18 +08:00 单机性能大概算一下并发数,然后按 1>100>10000>1000000 这样滚动发布,先拿到文件的也加入发布序列给后面的传输文件。就算没有内网也用不了多久啊。 多机软件升级的要点不在于文件传输吧,传输很快的,难点在升级期间不影响服务。 |
11 huangzxx 2021-06-16 21:11:33 +08:00 打好一个包,ansible 跑一遍 apt install ? |
12 dushixiang 2021-06-16 21:21:23 +08:00 via iPhone 这算是什么大佬… |
13 learningman 2021-06-16 21:27:22 +08:00 via Android 广播? |
14 learningman 2021-06-16 21:28:04 +08:00 via Android 你在一个内网,里不管用不用 p2p 交换数据都受限于交换机啊。 |
15 FutureApple OP @eason1874 #10 如果其中一台服务器炸了他下面会广播的机器也会炸啊 |
16 FutureApple OP @learningman #14 不是数据受限的问题,如果广播的服务器炸了其他的服务器也都甭想升级了,要求的是一个哪怕单机炸了也不会影响到其他任意机器的架构 @eason1874 #10 @abersheeran #8 |
17 FutureApple OP @huangzxx #11 问题是这个包怎么传给那 999999 台其他的服务器 |
18 momocraft 2021-06-16 21:40:00 +08:00 感觉你被大佬钓鱼了 |
19 akira 2021-06-16 21:40:18 +08:00 要么推 要么拉 |
20 FutureApple OP |
21 Reficul 2021-06-16 21:48:35 +08:00 为什么不能 P2P,我们现在就是这么做的,总规模不比 100w 小。 |
22 Reficul 2021-06-16 21:53:53 +08:00 |
23 FutureApple OP @Reficul #21 题目要求不使用 P2P,当然要用当然可以用,主要是感觉在。。。重复写迅雷?而且自己写 bug 还一堆。。。 |
24 Reficul 2021-06-16 21:58:32 +08:00 @FutureApple 不太一样,迅雷这种 P2P 协议不是为数据中心优化的。 有些功能是用不到的,比如数据中心发布节点是可信的,网络情况也比公网要好很多。 有些功能则是没有的,比如按照机房机架或者 VPC 优化流量,按照发布的特点复用以往数据等等。 |
25 Jirajine 2021-06-16 22:05:03 +08:00 via Android p2p 是很合适的,就算没有,多级缓存慢慢更也不是太大问题。 p2p 也不用自己实现,像这种用 ipfs 搭建 pacman 镜像源 https://github.com/victorb/arch-mirror 或者直接用 libp2p 再往前很多游戏客户端都用魔改的 bt 协议。 |
26 billlee 2021-06-16 22:46:35 +08:00 算并发数什么的人根本没审题,ffmpeg 的大小有上百 MB,瓶颈在于带宽 |
27 0ZXYDDu796nVCFxq 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 |
28 0ZXYDDu796nVCFxq 2021-06-16 23:09:30 +08:00 另外一些计算结果: 假如使用一种合适的算法,使得 100 万台服务器的更新时间在 1 小时里趋于均匀分布 则两台服务器每台的 connection per second 为 100*10000 / 3600 / 2 = 139 每台服务器每秒能传输的安装包数量为 60*1000**3 / 8/ 39577132 = 190 这种性能需求,随便近几年的至强都行了,只要优化下网卡队列和系统内核参数 |
29 binux 2021-06-16 23:31:16 +08:00 via Android @FutureApple 广播的服务器炸了,你不会等一等再重试吗? |
30 iseki 2021-06-16 23:32:02 +08:00 自己调度一下,非要同时传输那就上 UDP 广播组播,然后自己解决流控和丢包问题 <- 感觉这是伪需求 |
31 3dwelcome 2021-06-16 23:32:30 +08:00 @FutureApple "这是个微软的大佬再群里发的问题,他说 windows 更新其实是基于 p2p 的" 国内 99%互联网用户没有公网 IP,根本没办法相互直连,哪有什么 P2P,是你想太多了。 |
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 |
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 怎么干的? |
34 hronro 2021-06-17 00:50:05 +08:00 via iPhone 真的有大佬会在 QQ 群里问问题吗? |
35 kaikai5601 2021-06-17 01:00:28 +08:00 via iPhone @FutureApple 多搞几台思并发啊,而且只 scp 怎么会死掉 |
36 felixcode 2021-06-17 02:44:57 +08:00 via Android 写个脚本让软件自行扩散,类似病毒 |
37 learningman 2021-06-17 09:23:30 +08:00 via Android @3dwelcome 有的,你打开 win10,更新底下是不是有个传输优化,那个就是 p2p 。 有没有是一回事,能不能用是一回事 |
38 James369 2021-06-17 10:50:15 +08:00 初始设想,应该采用网络镜像技术 |
39 FS1P7dJz 2021-06-17 11:01:47 +08:00 是哪个 SJB 会让 100W 设备同时升级? 讨论这种毫无意义的问题很闲时不时 而且这种发散问题,每个方向不同的人,讨论的方向都不同 看起来你们这个群想讨论的只是网络并发 100W 个连接请求这种问题 而不是真正的"100W 台设备如何升级"这个问题 |
40 onionlc 2021-06-17 11:09:03 +08:00 内网建个 nginx,包放上去,ansible 批量执行去 nginx 拉包更新升级; 基础设施没做好的话,也得耗费点时间; |
41 sleepm 2021-06-17 11:23:54 +08:00 |
42 mikeven 2021-06-17 14:24:21 +08:00 现在苹果 10 亿台设备系统的 OTA 都能实现,这很难吗 |
43 SlipStupig 2021-06-17 14:42:38 +08:00 Linux 不是有软件源嘛.....直接更软件更新源就好了啊.......这个问题有什么讨论的意义呢 |
44 FutureApple OP |
45 Kinnice 2021-06-18 07:36:17 +08:00 via Android @FutureApple 你小瞧了 cdn 的调度,一个 cdn 的节点负载上升,会调度到其他节点,并不会你同个机房的都去访问那一个节点。CDN 做的比较好的单节点 100G 吃得下。 |