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

27656 次点击
所在节点    分享创造
191 条回复
h280254082
2022-09-05 16:22:29 +08:00
听起来核心竞争力不是说这一块的代码,而是你有能力搞到一些廉价资源。以及这个流量的计算是 1T/day 我理解其实只有 12M/s ?现在规模属于还可以忽略不计的成都?
算起来一天 50 元,一个月 1200 核算出来是 10w 每 G/s 每月 即使流量非常不均衡扩大个 10 倍 也是 1000w 元 每 T/s 每月 在比据我所知大厂的大客户价格高出不少了 在这么小规模的前提下只能做到这个价格,我理解是很难做大的
tomato1111
2022-09-05 16:35:34 +08:00
有没有传统 CDN 的访问限制功能,比如黑白名单,Referer 来源,访问频率设置,时间戳校验,地域限制,回源鉴权?
star7th
2022-09-05 16:36:16 +08:00
@h280254082 看不懂你的意思。我好像没说过流量的计算是 1T/day ,不知道你说这个是什么概念。
star7th
2022-09-05 16:37:25 +08:00
@tomato1111 没有。一切从简。功能后面看客户需求慢慢加。
star7th
2022-09-05 16:41:17 +08:00
@h280254082 我说现在承受每天 1000G ,不代表只能承受 1000G 。实际上,很多节点都是几十上百 M 带宽的,合起来的累计带宽,只要节点数够的话,分分钟超过 12M/s 的速度。所以我不太清楚你是怎么得出这个结论的。另外节点数也布置能扩大 10 倍,架构设计合理的话,再增加 100 个节点也不是不行,这是扩展 100 倍以上。
wdhwg001
2022-09-05 18:55:14 +08:00
其实这个价格是比百度云加速要贵一点点的,对方最低是 0.038 元 /G ,限 500G/天,可以追加流量包。

很好奇你这边的节点数量、质量以及功能方面会不会更好一些。
winglight2016
2022-09-05 19:10:12 +08:00
用域名 cname 的方式指向某个节点 ip ,当节点挂了的时候,由于域名 cname 解析变更有 10 分钟以上的缓存,所以必定会导致用户有一段时间的访问故障。

——lz 这个问题是不是不存在呀?一个域名可以配多个 ip ,dns 本来就可以通过轮询返回当前有效 ip 地址
star7th
2022-09-05 19:21:44 +08:00
@wdhwg001 只说平时价格,不说活动价格 /折扣价格,百度云应该没有 0.038 元 /G 吧。而且,它有流量限制,我是没有上限的。
star7th
2022-09-05 19:23:48 +08:00
@winglight2016 基于 dns 方案不可靠。“通过轮询返回当前有效 ip 地址“ ,你怎么判断有效呢。假如一个 ip ,虽然可以 ping 通,但它就是不可访问了(比如说慢,比如说软件上挂了),这个时候就不算是容灾了。
xmh51
2022-09-05 19:31:46 +08:00
@star7th 建议你审核内容,然后让其他人的备案域名在你这边用。单点风险太大了。这样死也只死一个域名。因为即使你审核了,也有意外情况,比如其他人服务器被黑了啥的。
winglight2016
2022-09-05 19:32:17 +08:00
@star7th 哦,你说的是整体方案的考量,我以为你说的是网络层的可靠性。healthy 检查属于应用层的问题了,你的 cdn 是从应用层转发请求吗?这样从中心服务器绕一圈是不是会比较慢?
star7th
2022-09-05 19:33:43 +08:00
@xmh51 后续人多了,我考虑让用户自定义域名。虽然麻烦,但出于风控,可能是要考虑了。
star7th
2022-09-05 19:35:29 +08:00
@winglight2016 是要比直连节点 ip 要慢一点点的,但其实不会差很多。我的调度中心服务器直接跑在阿里云 k8s 集群上,测试整体单链接耗时大概 50 到 100 毫秒之间。延迟个几十毫秒,还能接受啦。
wdhwg001
2022-09-05 19:36:33 +08:00
@star7th 百度云加速是 6990/年,每天 500G ,折 0.0383 元 /G ,超出这个流量之后可以以 0.18-0.11 元 /G 的价格购买流量包。

所以在对比的时候,需要知道你这边的具体优势,比如节点和带宽的省市覆盖情况,可用的节点总数等内容,以便在低价 CDN 领域和老牌的百度云加速拉开差距。
star7th
2022-09-05 19:39:43 +08:00
@wdhwg001 那这么算下来,我的优势算是不设置上限吧,无论流量多少,统一单价。而且没有最低消费。这种按量计费可能更灵活,会有人更喜欢
xmh51
2022-09-05 19:39:49 +08:00
op 主,想法不错,在中国这个特殊的市场价值很大。希望 OP 能熬过同行攻击阶段。。
winglight2016
2022-09-05 19:43:38 +08:00
@xmh51 #96 还有这种风险,万万想不到。。。的确隔行如隔山呀
star7th
2022-09-05 19:48:14 +08:00
@xmh51 你说的确实是个风险。我现在还很小规模,没有攻击价值吧。目前呢,我的节点机器带宽都挺大的,普通都有几十 M 上百 M ,同时机房本身有一定成都的防 dddos 。所以只能说硬件上暂时有点点防护能力,不至于小攻击一点就跨。但是大规模是有问题。这个等用户多了后再考虑这方面的风险。
wdhwg001
2022-09-05 19:57:09 +08:00
@star7th 所以三网、省市的节点数量和按三网、省市拆分后的可用吞吐量在当前是不披露公开的吗?
xx3122
2022-09-05 20:19:25 +08:00
@star7th 我有个需求是,我基于 nginx 弄得一个 waf ,屏蔽一些 ip 和 ua 等,通过反向代理给别人使用,但是每次新增一个就都需要人工配置一个反向代理、转发就太麻烦了,能否像你这样的 cdn 一样用户自己注册、配置 cname 之类的就行?谢谢

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

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

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

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

© 2021 V2EX