还有第二篇,内容不仅如此 OωO
前言
自2014年开始写博客以来,我都尽力保证用户能以较快的速度加载这个博客的每一个页面。CDN在这其中起了很大的作用,它能明显降低源站服务器的带宽压力。最早的时候,因为我的域名备案在腾讯云,所以使用的是腾讯云的CDN的免费额度。随后又使用了一小段时间七牛,但当时七牛和腾讯云还没有图片处理功能,所以我很快换到了专注于CDN服务的又拍云。又拍云通过其联盟为开发者提供了一定量的免费储存空间和CDN流量,并且该项福利一直持续至今。
时光荏苒,我的博客也从当年的日均 0 IP变成了现在每月数千的用户,算不上多大的成功但也是一番不错的结果。用户数量的增加使得CDN的流量不断增长,从去年开始又拍云联盟赠送的代金券就不够我使用的了。我尝试购买资源包来覆盖超出额度的流量计费,但我的站点流量也没有多到足以在资源包有效期内充分利用其价值,所以不得不少量地往帐号中充值。既然CDN功能开始成为一个需要付费的项目,我自然需要更加认真地对待其计费内容,故在前两个月开始分析起了CDN的数据,并做了一番调整。时至今日,算是卓有成效,所以写此文记录分享一下经历。
站点结构
在最早开始使用 Typecho 时我便没有使用其自带的附件管理系统来用于放置图片,而是额外创建了blogpic.irain.in
图床站点。在又拍云控制面板中,我也是分别为blog.irain.in
和 blogpic.irain.in
分别创建了CDN资源。博客主站的CDN目的主要是动态加速,以及css
, js
等少量静态资源的加速;而图床站则因为主要传递图片这样的较大的资源,会有更加明显的流量。
CDN 价格表
本文的内容将涉及到下面几个CDN服务商,下面这个表格和备注是我个人总结制作的,仅供数据参考
又拍云 | 腾讯云 | 华为云 | G-Core Labs | |
---|---|---|---|---|
中国大陆流量 | 0.29/GB | 0.21/GB | 0.2/GB | 无节点(接入台湾/香港/韩国/日本节点) |
中国大陆动态请求 | 0.02/千次 | 0 | 0 | 无节点 |
中国大陆 HTTPS | 0.05/万次 | 0 | 0 | 无节点 |
亚太流量 | 0.89/GB | 0.55/GB | 0.67/GB | €0.03/GB |
亚太动态请求 | 0.06/千次 | 0 | 0 | €0.0075/万次 |
亚太 HTTPS | 0.15/万次 | 0 | 0 | 0 |
欧美流量 | 0.39/GB | 0.31/GB | 0.5/GB | €0.03/GB |
欧美流量请求 | 0.03/千次 | 0 | 0 | €0.0075/万次 |
欧美 HTTPS | 0.07/万次 | 0 | 0 | 0 |
图片处理 | 免费 | 数据万象(付费) | 无 | 1万次免费处理,€1/万次 |
中国大陆 100GB 流量套餐 | 20/3个月 | 19元/12个月 | 无 | |
中国大陆 500GB 流量套餐 | 100/3个月 | 94元/12个月 | 88元/6个月 | |
免费额度 | 全年67元代金券 | 每月10GB (仅限老用户) | 无 | 每月 1TB + 100万次请求 |
- 华为云海外CDN若需要分区域计费,需要开工单,否则按0.79/GB计费所有海外区域流量
- 华为云若启用全站加速,会产生动态请求和静态请求计费
- 腾讯云数据万象很贵的,你不会想买的
- 腾讯云老用户若有每月10GB流量,则计费必须为按日结算,不可调整
优化1:减少海外流量的花费
打开又拍云的费用中心,进入账单管理,在这里我们可以按月或按日来查看所有的账单
账单分析
我首先选定了2022-05-01 - 2022-05-31
这一月的时间,查看日账单,平均每日账单金额为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日完成,我们现在查看该日期前后的又拍云账单,可以看到明显的账单金额下降。
以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 地址
写一个自动化程序在每日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带入其它项目。
转载请标注来源