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

26368 次点击
所在节点    分享创造
190 条回复
hgg12580
2022-09-18 17:33:51 +08:00
什么原理? 302 转发吗?
star7th
2022-09-19 00:50:40 +08:00
@NUT nodejs ,对密集 io (网络 io 和文件 io )比较友好。
star7th
2022-09-19 00:51:04 +08:00
@hgg12580 是的,302 转发到可用节点。
i4oolish
2022-09-19 15:17:17 +08:00
收藏一下,以后研究研究
myqoo
2022-09-21 14:28:48 +08:00
Web 场合调度用 302 有些费劲,每个资源白白增加一次请求延迟,而且还依赖调度服务器的稳定性。

直接让浏览器自己调度就可以,前端用 Service Worker 拦截请求然后负载均衡,参考 https://github.com/etherDream/freecdn
star7th
2022-09-21 15:29:17 +08:00
@myqoo

你这个项目思路挺好,我也蛮欣赏。但你的项目跟我现在这个项目是不同的东西。

我需要在服务端层面控制很多东西,比如节点的 url ,节点的权重,用户的 ip 属地调度等等,纯前端无法满足需求

我可以无侵入客户的网站产品。用你的 freecdn 则必须引入 js 脚本,这个侵入性太强了,不宜用来做面向客户的产品。

我的 cdn 可以用于 app 的图片和视频(实质上这部分是客户主要的流量),而你的不能。你的只能跑在支持 js 的浏览器上。单单这一点我就必须放弃 freecdn 。

你的 freecdn 会导致初次刷新,影响用户体验。

要更新节点 url ,加速文件等,要提前用命令行操作生成。这导致使用范围大大受限制。我开放 cdn 服务出去,我的客户要加速什么文件,我怎么能知道呢。

总之我就是觉得 freecdn 是一个使用范围比较窄的项目,在某些场景下才能发挥作用,不适合用作 dfyun 的调度方案。
jason56
2022-10-08 10:43:37 +08:00
后续会支持 websocket 吗
star7th
2022-10-09 18:49:39 +08:00
@jason56 没有足够的需求,就先不开发了。有足够的用户需求再看看。
star7th
2022-12-01 13:37:07 +08:00
更新:现在 dfyun 已经支持绑定自定义域名。同时管理后台支持刷新节点缓存文件。
burninggit
2022-12-01 14:07:28 +08:00
有试用额度吗? 比如每个月免费 10 个 G 或者 其他的
star7th
2022-12-01 14:10:22 +08:00
@burninggit

当月内免费试用!例如你 12 月份接入大风云,则 12 月份整个月是免费期。这个优惠力度非常大了。至于说每个月免费 10G ,则没有必要。当前价格已经跌倒冰点,10G 也就是五毛钱。没必要省。
as9567585
2022-12-08 15:04:06 +08:00
什么量级才能接入能,建议直接在网站上明盘~
star7th
2022-12-08 15:26:31 +08:00
@as9567585
一般日流量最起码要 1G 吧。
如果网站日流量 1G 都不到,那一个月消费就不到 1 块钱。这种真的没必要接入任何 cdn ,直接服务器跑起就行。大流量才越需要 cdn 。
as9567585
2022-12-08 15:57:41 +08:00
@star7th ok 明白
wbzd
2022-12-16 11:55:55 +08:00
重大 bug:注册时,邮箱 @前面的部分不能有小数点。如: da.feng@examole.com ,提示格式错误。
wbzd
2022-12-16 11:57:20 +08:00
@wbzd 啊,对不起,没有问题的,是之前输错了,然后正常输的时候提示没有跳掉。
Lilalaaa
326 天前
123 网盘的直链都已经做到你这个价格了,并且人家节点质量比你好,存储成本低( 19 元/T/年)
https://20692631.s21i.faiusr.com/2/ABUIABACGAAgvarnpgYoxNCS8gcwmwk40wQ.jpg
star7th
325 天前
@Lilalaaa

跟网盘不是一个类型的东西。不可比较。
我面向的是网站主,这些客户往往已经把图片上传到云储存的了,这时候用 cnd 合适。而不是把文件都全部上传一遍到网盘。
Lilalaaa
322 天前
@star7th 我知道,我查了下他家母公司叫明赋云,CDN 对散客价格已经做到 0.035/GB
Lilalaaa
322 天前
我意思是网盘作为一个面向 C 端消费者的产品,人家把价格都已经压缩到每 G 五分了,还有的赚
@star7th

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

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

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

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

© 2021 V2EX