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

2021-06-16 20:11:54 +08:00
 FutureApple

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

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

注意:不能使用 P2P

3331 次点击
所在节点    问与答
45 条回复
Reficul
2021-06-16 21:48:35 +08:00
为什么不能 P2P,我们现在就是这么做的,总规模不比 100w 小。
Reficul
2021-06-16 21:53:53 +08:00
下载参考 Uber 或者蜻蜓,这个问题的主要难点不在分发上,在更新不影响业务上。

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

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

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

再往前很多游戏客户端都用魔改的 bt 协议。
billlee
2021-06-16 22:46:35 +08:00
算并发数什么的人根本没审题,ffmpeg 的大小有上百 MB,瓶颈在于带宽
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
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

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

国内 99%互联网用户没有公网 IP,根本没办法相互直连,哪有什么 P2P,是你想太多了。
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
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
2021-06-17 00:50:05 +08:00
真的有大佬会在 QQ 群里问问题吗?
kaikai5601
2021-06-17 01:00:28 +08:00
@FutureApple 多搞几台思并发啊,而且只 scp 怎么会死掉
felixcode
2021-06-17 02:44:57 +08:00
写个脚本让软件自行扩散,类似病毒
learningman
2021-06-17 09:23:30 +08:00
@3dwelcome 有的,你打开 win10,更新底下是不是有个传输优化,那个就是 p2p 。
有没有是一回事,能不能用是一回事
James369
2021-06-17 10:50:15 +08:00
初始设想,应该采用网络镜像技术
FS1P7dJz
2021-06-17 11:01:47 +08:00
是哪个 SJB 会让 100W 设备同时升级?

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

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

看起来你们这个群想讨论的只是网络并发 100W 个连接请求这种问题
而不是真正的"100W 台设备如何升级"这个问题
onionlc
2021-06-17 11:09:03 +08:00
内网建个 nginx,包放上去,ansible 批量执行去 nginx 拉包更新升级;
基础设施没做好的话,也得耗费点时间;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783807

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX