今天看到群里的大佬给了一个问题,你有一个数据中心,数据中心里有一百万台机器(物理机或虚拟机),这一百万台机器都安装了一些组件,例如安装了 ffmpeg 4.5,现在你的任务是将它们的这个组件全部升级到 ffmpeg 4.6 。
看起来不难,你很快就搞定了一个 4.6 的安装包,然后你发现你需要把这个安装包发给一百万台机,显然不行。装完可能大半年过去了。
注意:不能使用 P2P
1
PrinceofInj 2021-06-16 20:26:28 +08:00 via Android 5
先问一下这一百万台是怎么装出来的。啥?一台台装出来的?那我一台台去更新有啥问题么?
|
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 1
这是不是就是类似 Ansible 之类干的事情?
|
6
3dwelcome 2021-06-16 20: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 2
单机性能大概算一下并发数,然后按 1>100>10000>1000000 这样滚动发布,先拿到文件的也加入发布序列给后面的传输文件。就算没有内网也用不了多久啊。
多机软件升级的要点不在于文件传输吧,传输很快的,难点在升级期间不影响服务。 |
11
huangzxx 2021-06-16 21:11:33 +08:00
打好一个包,ansible 跑一遍 apt install ?
|
12
FreeEx 2021-06-16 21:21:23 +08:00 via iPhone 2
这算是什么大佬…
|
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 1
@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 吃得下。
|