我是如何把网站图片 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 流量成本最低之一了。

26321 次点击
所在节点    分享创造
190 条回复
h280254082
2022-09-05 20:19:40 +08:00
@star7th 所以我的重点在于你的价格太贵了。。。你对于商业 CDN 的价格完全不了解 12M/s 是按照你说的当前一天 1000G 流量算出来的 商业 CDN 的价格都是按照 xxx 元 G/s 一个月来算的 你的价格比商业 CDN 贵很多 而不是说你的规模很小 我是说你在规模这么小的情况下价格还远高于商业 CDN 这生意不好做的
star7th
2022-09-05 20:24:12 +08:00
@wdhwg001 不公开
wdhwg001
2022-09-05 20:27:22 +08:00
@star7th 那其实就相当于你卖了一个黑盒子呀。

这个盒子再便宜,商业用户也不会考虑的,因为你没有说明用户花了钱可以买到什么样的服务。
star7th
2022-09-05 20:28:50 +08:00
@h280254082 我了解过商业方案,结论是我这个依然有市场。你看一下本贴的讨论以及收藏数就行了,真的毫无价值是不会被人看到的。目前商业方案都是设置各种各样的门槛才能优惠的,比如最低消费,比如流量限制等等。你如果真的坚持认为百度云加速性价比最高,你可以基于它包装一层拿出来卖吧。另外就是我也没打算跟他们直接正面竞争,我就找个细分市场,小赚一笔。真的大到需要跟他们正面竞争的时候,我已经有足够的实力去规模化降低成本了,到时候自有办法。
sgissb1
2022-09-05 20:30:30 +08:00
看了一会才反应过来,原来是通过调度手段来降低成本,这是一个好方法。

不过事实上,现在减少图片场景下,cdn 流量的做法,逐渐的有两种在渐渐行程。
第一种就是用 heif 或者更高压缩比的压缩标准来替代,图片不同于视频,没有对解压缩过程中有太强的实时性要求,只需要浏览器或者客户端支持就行。

另一种就是渐渐的开始调用 webrtc 的 p2p channel 来降低服务器流量。这个我看到有几家厂家在做,其实最典型的还是我们知道的某下载器厂商,他们做视频 web p2p 方案的多。图片的话也不会太难。

接下来 p2p 网络协议还会继续火起来一段时间。
star7th
2022-09-05 20:32:00 +08:00
@wdhwg001 说实话,我即使告诉你了,你也不会考虑成为我的客户的。目前我都是租各个机房的,基本上啥地区都有。只是说我出于成本考虑,不会一下子上那么多节点。
star7th
2022-09-05 20:33:31 +08:00
@xx3122 像你这种情况,应该就是要做一个可视化界面,让用户输入信息。然后自己写程序生成 nginx 配置。然后 reload nginx
star7th
2022-09-05 20:34:43 +08:00
@sgissb1 你说的是另一块东西,跟我做的服务不冲突。那种比较适合多人同时在线的实时音视频 p2p
h280254082
2022-09-05 20:51:03 +08:00
@star7th 百度云那个和 CDN 价格当然是不一样的,商业 CDN 的价格是比你低出一个数量级的,更不要提 PCDN 了,我只是想告诉你你可能收到的"廉价"资源没有那么廉价,比如你可以参考快手的 CDN 支出,财报里面有公布的。当然你坚持也没事 我就出于善意的说一说 如果能节约你时间精力和经济投入那自然很好 如果你有你的想法 那也很好
star7th
2022-09-05 21:06:21 +08:00
@h280254082 没事的啦。我只是在细分领域赚点小钱,不至于跟巨头正面竞争。我还是有我的定位的,跟巨头错开一些就好
xx3122
2022-09-05 21:32:04 +08:00
@star7th 你能弄不?之所以不直接把配置直接给用户,目的就是用作商业,这样用户自己完成,像你这个 cdn 一样,你做的话大概什么价格谢谢
israinbow
2022-09-05 21:52:00 +08:00
OP 这个做得好啊, 让我想到了谷歌购买大量城市中预铺设冗余的网线, 作为 YouTube 的内容分发线路, 从而用极低的成本维护了这个体量最大的视频网站. 祝愿能好好运营下去, 给中小型用户更多的选择👍
star7th
2022-09-05 22:26:44 +08:00
@xx3122 我一般不帮人做产品,我只做我自己的产品。好处是我的产品可以规模化,持续存在。而帮别人做东西只是一次性的钱。真的要我做的话我会收费蛮高,比如收费三万,因为我要额外花时间去了解你原有的项目,去跟你原有的项目集成。我倒比较建议你找专门接外包的,可能价格低一些。如果真的要联系我,打开这个网站点击右上角就可以看到邮件联系方式 https://www.dfyun.com.cn
star7th
2022-09-05 22:27:31 +08:00
@israinbow 嘿嘿,我努力。
o00o
2022-09-05 23:21:31 +08:00
之前用微博图床的时候考虑到以后可能存在的图床失效的问题 做过一个类似的,默认走微博图床,图床加载失败自动加载自有服务器图片
star7th
2022-09-05 23:47:53 +08:00
@o00o 其实微博图床主要是增加了一个 refer 限制,现在应该还是可用吧。我几年前也用微博图片。现在很久没用过了。
Aloento
2022-09-06 05:47:13 +08:00
支持一下,以后有机会上个车
o00o
2022-09-06 08:41:08 +08:00
@star7th 对应该还可以用,但是为了保险起见 img 标签地址用的类似你这种跳转的方式
o00o
2022-09-06 08:42:19 +08:00
@star7th 图片加载失败有相应 js 事件,可以二次补救一下
xx3122
2022-09-06 08:49:59 +08:00
@star7th 好的谢谢

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

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

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

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

© 2021 V2EX