点击关注我的Telegram群组和微信公众号

MENU

CDN优化:如何通过引入多个CDN服务商以降低40%的流量费用

2022 年 08 月 01 日 • 阅读: 2901 • 网络,分析,云服务,教程

还有第二篇,内容不仅如此 OωO

前言

自2014年开始写博客以来,我都尽力保证用户能以较快的速度加载这个博客的每一个页面。CDN在这其中起了很大的作用,它能明显降低源站服务器的带宽压力。最早的时候,因为我的域名备案在腾讯云,所以使用的是腾讯云的CDN的免费额度。随后又使用了一小段时间七牛,但当时七牛和腾讯云还没有图片处理功能,所以我很快换到了专注于CDN服务的又拍云。又拍云通过其联盟为开发者提供了一定量的免费储存空间和CDN流量,并且该项福利一直持续至今。
又拍云联盟代金券

时光荏苒,我的博客也从当年的日均 0 IP变成了现在每月数千的用户,算不上多大的成功但也是一番不错的结果。用户数量的增加使得CDN的流量不断增长,从去年开始又拍云联盟赠送的代金券就不够我使用的了。我尝试购买资源包来覆盖超出额度的流量计费,但我的站点流量也没有多到足以在资源包有效期内充分利用其价值,所以不得不少量地往帐号中充值。既然CDN功能开始成为一个需要付费的项目,我自然需要更加认真地对待其计费内容,故在前两个月开始分析起了CDN的数据,并做了一番调整。时至今日,算是卓有成效,所以写此文记录分享一下经历。

站点结构

在最早开始使用 Typecho 时我便没有使用其自带的附件管理系统来用于放置图片,而是额外创建了blogpic.irain.in 图床站点。在又拍云控制面板中,我也是分别为blog.irain.inblogpic.irain.in 分别创建了CDN资源。博客主站的CDN目的主要是动态加速,以及css, js等少量静态资源的加速;而图床站则因为主要传递图片这样的较大的资源,会有更加明显的流量。

CDN 价格表

本文的内容将涉及到下面几个CDN服务商,下面这个表格和备注是我个人总结制作的,仅供数据参考

又拍云腾讯云华为云G-Core Labs
中国大陆流量0.29/GB0.21/GB0.2/GB无节点(接入台湾/香港/韩国/日本节点)
中国大陆动态请求0.02/千次00无节点
中国大陆 HTTPS0.05/万次00无节点
亚太流量0.89/GB0.55/GB0.67/GB€0.03/GB
亚太动态请求0.06/千次00€0.0075/万次
亚太 HTTPS0.15/万次000
欧美流量0.39/GB0.31/GB0.5/GB€0.03/GB
欧美流量请求0.03/千次00€0.0075/万次
欧美 HTTPS0.07/万次000
图片处理免费数据万象(付费)1万次免费处理,€1/万次
中国大陆 100GB 流量套餐20/3个月19元/12个月
中国大陆 500GB 流量套餐100/3个月94元/12个月88元/6个月
免费额度全年67元代金券每月10GB (仅限老用户)每月 1TB + 100万次请求
  1. 华为云海外CDN若需要分区域计费,需要开工单,否则按0.79/GB计费所有海外区域流量
  2. 华为云若启用全站加速,会产生动态请求和静态请求计费
  3. 腾讯云数据万象很贵的,你不会想买的
  4. 腾讯云老用户若有每月10GB流量,则计费必须为按日结算,不可调整

优化1:减少海外流量的花费

打开又拍云的费用中心,进入账单管理,在这里我们可以按月或按日来查看所有的账单

账单分析

我首先选定了2022-05-01 - 2022-05-31 这一月的时间,查看日账单,平均每日账单金额为0.5元。
每日账单大约是0.5元

其中2022年5月3日这天为该月账单金额最高的一天,为0.7元。打开该账单的计费项清单,可以看到海外地区的CDN服务所产生的费用占了很大的比例。
海外流量费用占了很大比例

而在2022年5月28日这一天,即使中国大陆CDN服务为主要的账单计费来源,但我们仍然可以看出来海外地区CDN服务更高的单价会产生不少的费用。
海外流量费用单价高是问题的关键

解决方案

根据经验和一些行业报告,海外(尤其是欧美地区)的流量费用是很低的。如果不使用 AWS/Azure那样的一线大厂CDN,海外CDN成本应该是远远低于中国大陆地区的。所以我们解决方案应该是直接拒绝又拍云这样的国内CDN服务商接管海外的CDN服务,让海外的服务商来解决海外地区的加速问题。

我的站点使用的是 G-Core Labs 的CDN,其免费方案包含了全球(不含中国大陆)超过140个节点的累计1TB流量,这对于我的博客而言是绰绰有余了。以图床站点为例,在G-Core Labs的后台中,我们为图床站创建一个CDN资源,源站IP设置为一个又拍云的节点IP,并设置回源Host为blog.irain.in。这样 G-Core CDN就会将又拍云节点作为源站,缓存已经经过又拍云处理过的图片资源。

随后,我们在域名解析服务中,将原有的全网默认至又拍云的 cname 解析删除;将中国大陆地区的解析设置为又拍云的 cname 地址;将海外地区解析地址设置为G-Core Labs CDN的 cname 地址。该项设置于2022年6月12日完成,我们现在查看该日期前后的又拍云账单,可以看到明显的账单金额下降。
6月12日后日账单金额明显下降

以2022年6月15日的账单为例,海外地区的流量、HTTPS加速和动态资源加速都降低到了一个非常低的数量,远远低于之前的数据。剩余的这些数据是由G-Core Labs CDN请求所产生的,虽然不能完全排除海外用户因DNS服务器错误地被分配到又拍云节点或刻意连接又拍云节点的情况,但宏观上我的操作是达到了预期的效果。
成功解决问题

成果

海外地区的加速不再由又拍云负责,每日的账单金额从大约0.5元降至0.1元。

虽然G-Core Labs CDN 没有免费的图片处理服务,但由于源站是又拍云节点,海外用户能获取到和国内用户一样的经过优化处理的图片。

优化2:中国大陆地区的成本

在解决了高额的海外CDN费用问题后,我们接下来可以再将注意力集中在中国大陆地区的CDN流量消耗上了。根据我在本文上方总结的CDN费率表格中,我们可以发现又拍云虽然有免费不限量的图片处理功能,但是其流量费用相比其它CDN服务商是更高的,并且对HTTPS请求有额外的计费。

分析

在浏览华为云CDN产品页面时,发现其提供了一种闲时流量包的产品,该产品将北京时间0点至18点的流量归为闲时流量。其价格为1TB 76.5元,有效期半年。而在其活动页面,华为云提供了普通CDN流量包和闲时流量包混合的组合包,比如6:4的500G流量包中含有300G的闲时流量和200G的普通流量,价格48.3元。这个价格和流量额度对于小站点还是很友好的。那么,接下来就需要判断,当前的站点需要怎样比例的组合包。
华为云的闲时流量组合包拥有很高的性价比

打开Jupyter Notebook,我们来分析一下数据。

# 加载博客主站和图床站的数据
df_blog = pd.read_excel("UPYUN-masterain-blog.xlsx",sheet_name="FlowStatistic")
df_pic = pd.read_excel("UPYUN-masterain-blog-pic.xlsx",sheet_name="FlowStatistic")

# 数据清洗
df_blog = df_blog.rename(columns={"日期":"time", "流量(bytes)":"flux-bytes",
                   "带宽(bit/second)": "bandwidth-bitPerSecond",
                   "峰值带宽时间":"max-bandwidth-time"})
df_pic = df_pic.rename(columns={"日期":"time", "流量(bytes)":"flux-bytes",
                        "带宽(bit/second)": "bandwidth-bitPerSecond",
                        "峰值带宽时间":"max-bandwidth-time"})

接下来,我们写两个方法,来将每小时的流量进行合并

# 判断是否为闲时
def isHappyHour(datetimeObj):
    if datetimeObj.hour >= 0 and datetimeObj.hour < 18:
        return True
    else:
        return False
    
# 统计数据的方法
def getIdleDataSum(df):
    new_df = df.copy()
    new_df.time = new_df.time.apply(lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
    new_df["type"] = np.nan
    new_df["type"] = new_df.time.apply(lambda x: "idle" if isHappyHour(x) else "busy")
    new_df = new_df.groupby("type").agg({"flux-bytes":"sum", "bandwidth-bitPerSecond":"max"}).rename(columns={"flux-bytes":"flux-bytes-sum",                                                          "bandwidth-bitPerSecond":"bandwidth-bitPerSecond-Max"}).reset_index()
    new_df["flux-MB"] = new_df["flux-bytes-sum"] / 1024 / 1024
    total_flux = new_df["flux-bytes-sum"].sum()
    new_df["percentage"] = new_df["flux-bytes-sum"].apply(lambda x: x*100/total_flux)
    return new_df

对博客主站数据和图床站数据使用 getIdleDataSum 方法

getIdleDataSum(df_blog)
"""
    type    flux-bytes-sum    bandwidth-bitPerSecond-Max    flux-MB        percentage
0    busy    1463708407        143683                        1395.901114    32.691739
1    idle    3013595198        134938                        2873.988340    67.308261
"""

getIdleDataSum(df_pic)
"""
    type    flux-bytes-sum    bandwidth-bitPerSecond-Max     flux-MB        percentage
0    busy    1818381068        409968                         1734.143322    33.453746
1    idle    3617126957        510284                         3449.561078    66.546254
"""

可以看到站点的普通时段流量和闲时时段流量比例大约为3:7

解决方案

在华为云官网上购买一个500G 6个月 6:4比例的组合包(因为另一个流量消耗巨大的站点比例接近于6:4

在华为云CDN控制台中创建CDN资源。在添加域名的时候,我们将源站类型选择为源站IP,其中填入又拍云的节点IP。如果此时华为云提示你需要验证该IP的所有权,直接开工单说清楚问题,让客服将你的域名拉入白名单即可绕过验证

配置好CDN资源;将中国大陆地区的域名解析修改为华为云CDN提供的 cname 地址
配置好华为云CDN

写一个自动化程序在每日0点将域名解析切换到华为云CDN,18点将域名解析切换到又拍云(见下一篇文章)

成果

在海外地区的加速不再由又拍云负责的前提下,华为云和又拍云根据时间段分别承担中国大陆地区的CDN服务,又拍云每日的账单金额从大约0.1元降至0.03元。
又拍云的日账单金额进一步下降

虽然华为云CDN没有图片处理服务,但由于源站是又拍云节点,华为云向用户传递的数据也已经是经过又拍云处理过的图片数据了。

在又拍云的费用中心的日账单中,我们可以发现中国大陆的请求数量和流量都大幅下降了。
国内流量也大幅下降了

总结:省了多少钱

在进行调整前

在又拍云,我们每天大约有0.5元的日账单,180天则为90元,365天为182.5元

在调整后

在又拍云,我们每天大约有0.03元的日账单,180天则为5.4元,365天为10.95元

在华为云,我们需要在一年内购买两次组合包,价格总计为96.6元

总计价格为 96.6 + 10.95 = 107.55元,相比原始价格,成本下降了 41.06%

但这并不是全部,在我们最初有0.5元的日均账单的时候,我们的流量合计大约只有0.3G,以这一数据推测半年的流量也仅 54G。而在方案调整后,我不再是后付费,而是变成了先付费购买了一个总计500G的流量包,这使得我在未来一段时间可以“零成本”地将CDN带入其它项目。

最后编辑于: 2022 年 09 月 10 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码