我是如何把网站图片 cdn 流量成本压到全网最低(之一)的

2022-09-05 09:32:44 +08:00
 star7th

缘起

我经营的一些网站和产品的访问量越来越高,付出的 cdn 流量成本(主要是图片资源)也越来越大。抱着节省成本的想法,我尝试在网络上找下有没有便宜的 cdn 商家。 像阿里云、腾讯云、七牛云,这些公有云 cdn 的价格都大同小异,我感觉即使从这一家换到另一家,也节省不了多少成本,同时还增加了迁移的麻烦。因此我把目光投向传统机房,预感可能越接近机器底层,能优化的空间越大。

经过几天的考察,发现很多非热门地区的机房都或多或少都有一些闲置的优惠产品,甚至其中也不乏优质带宽机器。特别是三四线机房,线路测试其实还不错。很明显这些闲置资源没有得到充分利用。一个点子在我脑海中酝酿了。

使用开源 or 自己原创?

假如我把各地的闲置机器组织起来,把它们当成一个个节点,组建起一个分布式网络,自动容灾切换,岂不就是一个廉价的自建 cdn 方案了? 顺着这个思路,我去找一下开源的 cdn 软件 ,看看有没有现成的解决方案。

然而事情没有我想的那么简单。开源 cdn 并没有很好的容灾切换机制,无法实时避障。 它核心原理里,用域名 cname 的方式指向某个节点 ip ,当节点挂了的时候,由于域名 cname 解析变更有 10 分钟以上的缓存,所以必定会导致用户有一段时间的访问故障。 我现在探索的是把各地机房集成到一起,其中机器节点的可靠性是参差不齐的。如果想做成一套 cdn ,那么就必须要假设节点是不可靠的,随时可能故障的,然后为此设计一套完善的容灾解决方案。

既然找不到现成的开源解决方案,那就自己动手写代码实现吧。

基本逻辑

我边啃着玉米,边用笔在纸上画着逻辑交互图。 经过一阵子的反复斟酌,基本逻辑已经成型。

1 ,这套程序主要有两个角色,调度服务器和节点服务器。调度服务器架设在阿里云 k8s 上,保障高可用。而节点服务器则是分布在各地机房,做好可能会故障、随时容灾切换的准备。

2 ,调度服务器的作用是导流和容灾,将用户流量以重定向的方式导向可用的节点,同时避开故障节点,做到实时无缝切换。

3 ,节点服务器的主要作用是拉取源文件到本地缓存,从而被用户访问。

4 ,节点服务器跟调度服务器之间要用某 tcp 协议实时连接监控,监控粒度细分到每个文件,方便调度服务器实时避开故障节点,这样才能保证故障时候,用户访问的每个链接都可以正常切换访问。这里实时性是非常重要的,也是容灾方案的核心。

小试牛刀

于是我花了一个多月的时间去写代码来实现这个逻辑。核心代码其实写得很快,但是为了保障稳定性,增加了非常多的异常容灾措施,要花时间不断测试不断重写。 初期只放三个异地机房节点,把流量切进来看看。 为了保险起见,先从小的做起。我一开始切日均 10G 流量过去,让它跑几天。 几天后,没问题。 试试日均 50G 流量? 50G 跑了几天,ok 。日均 300G ? 依然正常运行 。

开放商用

现在,已经完美运行了一个月,每天承受超过 1000G 流量,暂时没发现有故障现象。我以及一些朋友的很多产品都在用。我刻意关掉其中一个节点,调度服务器马上切流量到其他节点。我刻意关闭全部节点,流量也马上转到源站。整个过程中,只要调度服务器正常运作,那么,无论节点故障与否,用户都将继续无感知地正常访问图片。 而调度服务器直接运行在阿里云 k8s 上,可靠性是非常高的。因此整套架构的可靠性很高。

有了这个架构,如果需要承受更大流量,我只需要增加节点数即可。而全国范围内的机房机器多的是 ,我可以随时租机器来新增节点。当我意识到有规模化运作大流量的可能性后, 我决定把 cdn 能力包装出去 ,商业化运作。于是注册并备案了大风云网, 访问地址是 www.dfyun.com.cn

结语

大风云 www.dfyun.com.cn 严格来讲不是传统 cdn ,它是另一种内容分发机制,基于传统 cdn 以及传统机房机器, 用软件技术实现资源整合,是应用层面的一种微创新,在图片访问,文件下载等这些场景下可以成倍地降低流量成本 ,成本低于 0.05G/元 , 降低到公有云 cdn 价格的四分之一以下(只对比平时价格,不考虑搞活动的临时特价),几乎是全网 cdn 流量成本最低之一了。

26002 次点击
所在节点    分享创造
190 条回复
star7th
2022-09-05 10:10:39 +08:00
@Xusually 正如我文中说的,我正是因为考虑到 dns 解析时间差,所以才不能用现成的开源 cdn 方案,所以才自己写代码。
star7th
2022-09-05 10:11:55 +08:00
@billzhuang 我不允许别人绑定域名,必须用我自动生成加速域名。所以不存在备案问题。至于风控方面,我对每个接入的产品全部人工审核,只接备案过的产品。
dreamramon
2022-09-05 10:12:46 +08:00
不知道 OP 是怎么来根据请求链路,保障速度的?
还是说,核心思路是,在 cdn 前面放了一个调度,通过找到比 cdn 价格还低的机器 /带宽,来省钱?
pkwenda
2022-09-05 10:14:10 +08:00
@billzhuang 他目前应该只负责 CDN ,可能审核就是简单审核下要接入 CDN 的域名是否正确备案之类的吧
star7th
2022-09-05 10:15:46 +08:00
@dreamramon 我是你说的后者方案。我牺牲了一定的速度,只是这个速度在可接受的范围内。举个例子,用公有云 cdn ,加载一张图片需要 0.1 秒。而我这个可能需要 0.2 秒 。但实际访问网站过程中,用户对 0.2 秒加载的图片是无感知的,或者说可以忽略差异的
dreamramon
2022-09-05 10:17:00 +08:00
@star7th #25 明白了,我也做了类似的东西。握爪 :)
billzhuang
2022-09-05 10:17:19 +08:00
@star7th 我感觉应该反过来,只允许别人绑定已备案域名,不提供自动生成的加速域名。

不然很快被
weiwenhao
2022-09-05 10:17:29 +08:00
从客户的角度在机房少的情况下能节省成本,但是会牺牲访问速度和质量。
如果想要节约成本的同时还想保证质量,可以选择其他公有云平台的 pcdn 服务呀,合不合法的事情他们会替你考虑的。

做商用的话,如果人力比较少那估计也是能赚一些钱的。但是肯定比那些跑 pcdn 的成本高。
dreamramon
2022-09-05 10:17:57 +08:00
但是难点是,长期来看,很难评估,这个 0.2s ,到底会是多少?是否真的无感知。
star7th
2022-09-05 10:20:07 +08:00
@billzhuang 所以人工审查非常重要,我只接受正常运营着的产品,并且我会考虑这个产品的使用群体等等。之所以不让用户绑定域名,是因为,如果要让用户绑定域名,那么就要用户提供 https 域名证书,以及其他解析等,都增加了一定维护麻烦。但是你说的风险情况是存在的,我后面看情况要不要让用户绑定自己的域名来规避我的域名风险。
jazzg62
2022-09-05 10:22:17 +08:00
%%%%
zhouyg
2022-09-05 10:23:54 +08:00
好奇"非热门地区的机房"这些是怎么联系上的?
star7th
2022-09-05 10:23:58 +08:00
@weiwenhao 总有些产品是愿意接受牺牲一定访问速度来降低成本的。特别是一些对速度要求不那么高的情况下(比如说图片做了异步懒加载等等) 。而且我这个只是慢一点点,不会影响正常使用的
inframe
2022-09-05 10:26:32 +08:00
不如申请个专利😂
shoaly
2022-09-05 10:30:16 +08:00
@zhouyg 在你 一天 50g -> 1000g 的过程中, 自然就找到了
star7th
2022-09-05 10:30:45 +08:00
@zhouyg 这个就是我的竞争力之一的,毕竟要商业化吃饭的,所以我当然不能公开了。我只能说我背后有很多渠道搞到这些机房机器。
0bing
2022-09-05 10:40:50 +08:00
沿海地区我有一些 idc 资源,楼主可以聊聊吗? UVE4NjAwODc2ODM=
lusi1990
2022-09-05 10:48:43 +08:00
思路不错
pekingzcc
2022-09-05 10:49:27 +08:00
想法非常棒,而且是真的抓住了一部分用户的痛点,加油,希望你能做成这件事
kera0a
2022-09-05 10:50:05 +08:00
内容审核有措施么?
国内这块直接不通知掐网线封域名也是有可能的

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

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

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

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

© 2021 V2EX