有关 CDN 的二三事
一、什么是 CDN?
CDN(Content Delivery Network),内容分发网络,由遍布全国(全球)各地的边缘节点服务器群组成的用于 文件分发 的分布式网络
上面一句话有几个关键词,全国(全球)、服务器群、文件分发,通过这些关键词,我们知道以下几件事情
- 地域:是至少由多个地域的数据中心所组成
- 集群:至少是由多个服务器节点组成的服务器集群
- 文件分发:服务器所提供的功能是分发文件
听起来似乎是废话,但这确实概括了 CDN 的基本特点,了解了基本特点后就能更好的理解它的原理
二、为什么要使用 CDN?
引入 CDN 在明面上似乎会增加成本,那么为什么会成为大多数互联网业务的业务标配呢?
我个人认为最主要的原因有三点
- 性能优化
- 网络安全
- 降低成本
1. 性能优化
CDN 带来的性能优化主要体验在以下两个方面
- 就近访问
- 数据缓存
- 数据压缩
1.1 就近访问
所谓就近访问,指 根据用户所在位置和运营商来分配最佳接入节点
那么谁负责让用户找到最近的接入节点呢?整个就近访问的流程和原理是怎么样的呢?
DNS 工作原理
首先,我们先了解下域名的构成,以我的域名为例:www.yo-yo.fun
,它的真正格式和含义如下
# www.yo-yo.fun.
# . 根域
# fun. 一级域名(顶级域命)
# yo-yo.fun. 二级域名
# www.yo-yo.fun. 三级域名
经验丰富资历比较高的那些技术大哥们是这么划分的,现在也有一部分是按照下面的方式划分
# www.yo-yo.fun.
# . 根域
# yo-yo.fun. 一级域名(顶级域命)
# www.yo-yo.fun. 二级域名(子域名)
两种都没什么问题,交流之前划定好语境就行
DNS 解析过程是这样的,它会分成两个阶段,大致过程如下
- 先递归:计算机会根据系统 DNS 配置向 Local DNS 的 53 端口 发起 UDP 协议的 DNS 解析请求
- 后迭代:Local DNS 服务器根据要解析的域名地址,从根域到顶级域,找到负责管理(解析)该域名的 DNS 服务器,发起子域名解析,那到最终的记录
我们可以通过 nslookup 手动体验下
$ nslookup
# 设置查询类型为 ns(nameserver)
> set type=ns
# 获取能解析 . 根域名 服务器列表
> .
Server: 100.100.2.136
Address: 100.100.2.136#53
Non-authoritative answer:
. nameserver = e.root-servers.net.
. nameserver = m.root-servers.net.
. nameserver = i.root-servers.net.
. nameserver = k.root-servers.net.
. nameserver = b.root-servers.net.
. nameserver = c.root-servers.net.
. nameserver = h.root-servers.net.
. nameserver = a.root-servers.net.
. nameserver = d.root-servers.net.
. nameserver = g.root-servers.net.
. nameserver = j.root-servers.net.
. nameserver = f.root-servers.net.
. nameserver = l.root-servers.net.
Authoritative answers can be found from:
# 获取能解析 fun. 域名 服务器列表
> fun.
Server: 100.100.2.136
Address: 100.100.2.136#53
Non-authoritative answer:
fun nameserver = a.nic.fun.
fun nameserver = b.nic.fun.
fun nameserver = g.nic.fun.
fun nameserver = f.nic.fun.
fun nameserver = e.nic.fun.
Authoritative answers can be found from:
> yo-yo.fun.
Server: 100.100.2.136
Address: 100.100.2.136#53
Non-authoritative answer:
yo-yo.fun nameserver = dns1.hichina.com.
yo-yo.fun nameserver = dns2.hichina.com.
Authoritative answers can be found from:
> www.yo-yo.fun.
Server: 100.100.2.136
Address: 100.100.2.136#53
Non-authoritative answer:
*** Can't find www.yo-yo.fun.: No answer
Authoritative answers can be found from:
yo-yo.fun
origin = dns1.hichina.com
mail addr = hostmaster.hichina.com
serial = 2022052002
refresh = 3600
retry = 1200
expire = 86400
minimum = 600
> set type=a
> www.yo-yo.fun.
Server: 100.100.2.136
Address: 100.100.2.136#53
Non-authoritative answer:
Name: www.yo-yo.fun
Address: 47.115.121.119
> yo-yo.fun.
Server: 100.100.2.136
Address: 100.100.2.136#53
Non-authoritative answer:
yo-yo.fun canonical name = yo-yo.fun.w.kunlunaq.com.
Name: yo-yo.fun.w.kunlunaq.com
Address: 125.76.247.193
# ping 命令测试解析与连通性
$ ping -c1 www.yo-yo.fun
PING www.yo-yo.fun (47.115.121.119) 56(84) bytes of data.
64 bytes from sz-aliyun-ecs-1 (47.115.121.119): icmp_seq=1 ttl=64 time=3.01 ms
上面的过程只是从流程上过了一下,并不完全代表实际环境中的工作原理,因为按照这样的流程,是存在很多性能问题的
更贴合实际的 DNS 解析流程是这样的
客户端:客户端 发起域名解析前,从系统(与浏览器)的本地缓存中检查是否存在对应域名的解析记录,如果存在,则直接返回
本地缓存中 没有发现解析记录,那么将通过 UDP 协议向系统(网卡)配置的 LocalDNS 服务器发起域名解析请求
LocalDNS:服务器检查自身是否存在解析记录缓存,如果存在,则直接返回
LocalDNS 服务器没有发现解析记录,请求
.
域对应的服务器发起解析请求,根域不会返回给它具体的解析结果,因为根域服务器在全世界只有 13 组(注意是组,一组内可能是多台服务器以集群形式提供服务),对应[a-m].root-servers.net.
如果所有工作都由他们完成,那么以全世界的网络流量,根域服务器组是很难支撑的,所以这里工作方式换成了 迭代,根域服务器不直接返回结果,而是告诉 LocalDNS,能解析
fun.
顶级域的域名服务器地址> fun. Server: 100.100.2.136 Address: 100.100.2.136#53 Non-authoritative answer: fun nameserver = a.nic.fun. fun nameserver = b.nic.fun. fun nameserver = g.nic.fun. fun nameserver = f.nic.fun. fun nameserver = e.nic.fun.
LocalDNS 请求一级域名的服务器组,一级域名服务器也不会直接告诉它解析记录,而是又给 LocalDNS 指了个路,告诉它这个一级域名真正管理者 DNS 服务器是谁
> yo-yo.fun. Server: 100.100.2.136 Address: 100.100.2.136#53 Non-authoritative answer: yo-yo.fun nameserver = dns1.hichina.com. yo-yo.fun nameserver = dns2.hichina.com.
LocalDNS 向
dns[1-2].hichina.com.
发起解析请求,这一次它找到了本主,负责管理该域名的 DNS 服务器处理这条 DNS 解析,将结果返回给 LocalDNSLocalDNS 将结果缓存在本地,并将解析记录返回给客户端
客户端 拿到具体解析记录,开始网络通信,例如:TCP 三次握手什么的
CDN 就近解析
前面我们提到过,所谓就近访问,指 根据用户所在位置和运营商来分配最佳接入节点,用最短的网络链路将内容分发给用户
前面是一次正常的 DNS 解析流程,那么使用 CDN 之后的解析过程是怎么样的呢?
这里简单画一张图
按图来看下 yo-yo.fun
是如何实现就近访问的
客户端递归解析:向
yo-yo.fun
域名下资源发起请求,依然是上面那套流程LocalDNS 迭代解析
根域
.
→ 顶级域fun.
→ 一级域yo-yo.fun.
→ 授权管理 DNS 服务器 → 解析结果由于
yo-yo.fun
配置的是 CNAME 别名解析,解析记录为CNAME 域名
,CNAME 域名作为阿里云 CDN 调度解析使用请求 CDN 的 DNS 调度系统,获取 CNAME 域名解析记录,调度系统会根据 LocalDNS 的所处地域,运营商返回一个最佳节点 IP 地址
通过 阿里云提供的拨测工具,可以获取到各地区解析结果、解析耗时
LocalDNS 保存解析结果到本地缓存,将结果返回给客户端
客户端通过该地址,从最近的位置,以最短的网络链路获取内容资源
从最初用户只能从一个地方拿资源,如果用户离服务器同城倒还好,如果是跨城、甚至是跨国,那么访问速度体验肯定不是很好,配置使用 CDN 后,用户可以从最近的数据中心(边缘节点)拿数据,这就是就近解析带来的性能提升原理
1.2 数据缓存
数据缓存的原理就更简单了,紧接着上面的第4步
- 如果,用户所请求的那个 边缘节点已缓存内容资源,那么直接返回给用户
- 如果未没有缓存对应的内容资源,那么 边缘节点 会向 源站 发起 回源请求,也就是从
www.yo-yo.fun
域名拿原始信息,拿到以后,边缘节点根据用户自定义的缓存策略,将内容资源缓存在本地 - 最后将刚刚拿到资源返回给用户
1.3 数据压缩
这部分就没必要赘述了,如果内容资源是文本、图片等资源,合理的配置压缩策略,可以很大程度上加快网络传输速度,提高用户体验
2. 网络安全
首先,使用 CDN 后带来的安全提升包含以下几个方面
- 隐藏源站,避免被外部用户直接访问
- 劫持盗链,避免内容资源被恶意劫持或使用
- 攻击防御,部分安全 CDN 支持 DDoS / CC 攻击的防御
3. 降低成本
通常来说,提高针对网络传输的纵向优化,最直观的体现就是增加公网带宽,我们分别看下 CDN、EIP、SLB 等常用公网资源的费用情况
CDN 费用
CDN 资源包费用如下
下行流量 | 加速区域 | 费用 |
---|---|---|
50GB | 中国大陆 | ¥12/年 |
100GB | 中国大陆 | ¥20/年 |
500GB | 中国大陆 | ¥95/年 |
1TB | 中国大陆 | ¥158/年 |
5TB | 中国大陆 | ¥900/年 |
EIP 费用
弹性公网 IP 费用:
弹性公网 IP | 配置费用(小时) | 公网流量费用 |
---|---|---|
按量付费 | 0.020 | ¥0.8/GB |
以一年 100 GB 计算:**(100GB * 0.8) + (0.02 * 24 * 365) = 255.2**
SLB 费用
SLB 负载均衡费用
NLB 负载均衡 | 配置费用(小时) | 容量单位(LCU) | 公网流量费用(GB) |
---|---|---|---|
按量付费 | 0.02 | ¥0.049 | ¥0.72/GB |
以一年 100 GB 计算:**(100GB * 0.72) + (0.02 * 24 * 365) + (0.049 * 24 * 365) = 676.44**
这里还只会按照最基本的一小时消耗一个单位进行计算的,一个起步,上不封顶,毕竟这东西可是按并发流量计算的
- LCU 费用 = LCU单价(元/个) * 每小时LCU个数
- 每小时 LCU 个数 =
max{
新建连接数LCU个数,并发连接数LCU个数,处理流量LCU个数,规则评估数LCU个数}
CDN + OSS 成本优化
喏,费用对比也看得出来,CDN 20 < EIP 255.2 < SLB 676.44,针对静态资源,我们完全可以只使用 20 元就能解决问题
除此外,CDN 还支持直接从 OSS 回源,那这意味着静态文件服务器的费用,我们也可以直接省下来,应用直接通过接口将静态文件上传到 OSS 中,由 CDN 对外提供资源的加速访问
- 回源流量费用: 0.25元/GB,0.25 * 100GB = ¥25
- 低频本地存储费用: 100GB/年 是 ¥64.80
也就是说只需要大概¥100 左右的 OSS 配置费用,就可以替换一台单纯的静态资源服务器,而一台最基础的 ECS 大概在 500+ 左右
这一下可就省了 80% 的费用,成本大大减少
三、上手实践 CDN
0. 准备工作
开始前,假定你已经拥有以下资源
- 一个已完成备案的域名
- 一台已安装 Nginx 服务且有公网 IP 的 ECS 服务器(绑定 EIP 也行)
1. 域名拆分
为了利用浏览器并发,通常企业会将域名按照资源类型进行拆分,这里仅拆为两个类型:图片、网页,域名分别是:
- img.yo-yo.fun:加速域名(用户访问的图片地址域名)
- yo-yo.fun:加速域名(用户访问的网页地址域名)
对应的源站域名为
- ori.img.yo-yo.fun:源站域名(CDN 回源时访问的图片地址域名)
- www.yo-yo.fun:源站域名(CDN 回源时访问的网页地址域名)
当然,CDN 还支持其他方式回源,例如 IP、OSS 域名、函数计算域名等
2. 创建域名
阿里云创建 DNS A 记录解析,源站域名 → Nginx 服务器公网地址
ori.img.yo-yo.fun
→ecs 公网IP
www.yo-yo.fun
→ecs 公网 IP
配置 CNAME 解析,CNAME 规则有一定格式规律,基本是这样的:<主机记录>.<域名>.w.kunlunaq.com.
- 图片:源站域名 img.yo-yo.fun → 加速域名 img.yo-yo.fun.w.kunlunaq.com.
- 网页:源站域名 yo-yo.fun → 加速域名 yo-yo.fun.w.kunlunaq.com.
当然,格式有可能会发生变化,例如 w.kunlunaq.com.
中的 w
可能就是别的,所以建议是在 CDN 控制台 创建 CDN 加速域名后,在进行配置
3. 创建加速域名
创建加速域名
- yo-yo.fun
- img.yo-yo.fun
选择业务类型:按照个人需求选择,我这里是静态资源,所以选择的是图片小文件
源站信息:源站域名 → 分别填入对应源站域名、确认端口号
保存提交
4. 加速域名 CNAME
这是会提示你配置 CNAME,拿着 CNAME 解析记录去 DNS 那里设置解析,如果前面设置了,那么就对比下,解析记录值是否一致
等了十分钟左右,便能看到结果
5. 配置 CDN 规则
CND 加速域名创建完毕后,通常有以下几部分需要配置
- 缓存过期时间:根据个人需要,设置缓存过期时间
- 状态码过期时间:例如:
4xx=86400
避免大量扫描器请求回源 - HTTPS 配置:如果站点配置了 HTTPS,则需要在 CDN 配置 HTTPS 证书,CDN 与 源站通信使用 HTTPS 协议,如果没配置则可能会遇到
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
错误- 这部分是要额外付费的,资源包的价格不贵,静态HTTPS请求数 1000万次/年 ¥36,资源包是可以给多个加速域名用的
- 防盗链:图片站点一般会配置
- 性能优化:配置开启 CSS、JS、压缩等
- 带宽阈值:避免被恶意用户刷 CDN 流量,搞你的小钱钱
6. 检查 CDN 托管图片
首先,先确保源站是可以访问到图片的
源站域名检查
$ curl -I https://ori.img.yo-yo.fun/typora/images/202301271220482.png
HTTP/1.1 200 OK
Server: openresty
Date: Mon, 17 Apr 2023 06:10:13 GMT
Content-Type: text/plain
Content-Length: 25365
Last-Modified: Fri, 27 Jan 2023 04:20:42 GMT
Connection: keep-alive
ETag: "63d3511a-6315"
Expires: Wed, 17 May 2023 06:10:13 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes
加速域名检查
$ curl -I https://img.yo-yo.fun/typora/images/202301271220482.png
HTTP/1.1 403 Forbidden
Server: Tengine
Date: Mon, 17 Apr 2023 06:10:36 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Strict-Transport-Security: max-age=5184000
X-Tengine-Error: denied by Referer ACL
cache_control: no-cache, no-store
Pragma: no-cache
Via: kunlun10.cn814[,403003]
Timing-Allow-Origin: *
EagleId: 2466d41e16817118368174547e
OK,看样子是防盗链限制了
CDN 配置防盗链,允许空 Refer
再次尝试
$ curl -I https://img.yo-yo.fun/typora/images/202301271220482.png
HTTP/1.1 200 OK
Server: Tengine
Content-Type: text/plain
Content-Length: 25365
Connection: keep-alive
Vary: Accept-Encoding
Strict-Transport-Security: max-age=5184000
Date: Mon, 17 Apr 2023 06:11:46 GMT
Last-Modified: Fri, 27 Jan 2023 04:20:42 GMT
ETag: "63d3511a-6315"
Expires: Wed, 17 May 2023 06:11:46 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes
Ali-Swift-Global-Savetime: 1681711906
Via: cache19.l2nu20-1[93,93,200-0,M], cache33.l2nu20-1[95,0], kunlun3.cn814[233,232,200-0,M], kunlun6.cn814[241,0]
#### 缓存未命中
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Mon, 17 Apr 2023 06:11:46 GMT
X-Swift-CacheTime: 2592000
Timing-Allow-Origin: *
EagleId: 2466d41a16817119067365906e
注意这里,X-Cache: MISS TCP_MISS dirn:-2:-2
,MISS 说明边缘节点没有,这次回了源站,我们再尝试下
$ curl -I https://img.yo-yo.fun/typora/images/202301271220482.png
HTTP/1.1 200 OK
Server: Tengine
Content-Type: text/plain
Content-Length: 25365
Connection: keep-alive
Vary: Accept-Encoding
Strict-Transport-Security: max-age=5184000
Date: Mon, 17 Apr 2023 06:11:46 GMT
Last-Modified: Fri, 27 Jan 2023 04:20:42 GMT
ETag: "63d3511a-6315"
Expires: Wed, 17 May 2023 06:11:46 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes
Ali-Swift-Global-Savetime: 1681711906
Via: cache19.l2nu20-1[93,93,200-0,M], cache33.l2nu20-1[95,0], kunlun3.cn814[0,0,200-0,H], kunlun1.cn814[2,0]
Age: 91
#### 缓存命中
X-Cache: HIT TCP_MEM_HIT dirn:11:1414638501
X-Swift-SaveTime: Mon, 17 Apr 2023 06:11:46 GMT
X-Swift-CacheTime: 2592000
Timing-Allow-Origin: *
EagleId: 2466d41516817119973572297e
OK,HIT 缓存命中,这次直接从边缘节点返回的
7. 检查 CDN 托管网页
基本类似,不再赘述
# 测试源站
$ curl -I https://www.yo-yo.fun/ai/437ed30742d3/
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 17 Apr 2023 06:15:20 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: Hexo
X-Cache-Status: MISS
# 测试缓存命中
$ curl -I https://yo-yo.fun/ai/437ed30742d3/
HTTP/1.1 200 OK
Server: Tengine
Content-Type: text/html
Content-Length: 53700
Connection: keep-alive
Vary: Accept-Encoding
Date: Sun, 16 Apr 2023 10:06:40 GMT
X-Powered-By: Hexo
X-Cache-Status: MISS
Ali-Swift-Global-Savetime: 1681639600
Via: cache42.l2nu20-1[0,0,200-0,H], cache2.l2nu20-1[1,0], kunlun2.cn814[134,134,200-0,M], kunlun1.cn814[136,0]
Age: 72530
# 第一次 MISS
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Mon, 17 Apr 2023 06:15:30 GMT
X-Swift-CacheTime: 532270
Timing-Allow-Origin: *
EagleId: 2466d41516817121308392026e
# 测试缓存命中
$ curl -I https://yo-yo.fun/ai/437ed30742d3/
HTTP/1.1 200 OK
Server: Tengine
Content-Type: text/html
Content-Length: 53700
Connection: keep-alive
Vary: Accept-Encoding
Date: Sun, 16 Apr 2023 10:06:40 GMT
X-Powered-By: Hexo
X-Cache-Status: MISS
Ali-Swift-Global-Savetime: 1681639600
Via: cache42.l2nu20-1[0,0,200-0,H], cache2.l2nu20-1[1,0], kunlun2.cn814[0,0,200-0,H], kunlun10.cn814[3,0]
Age: 72535
# 第二次 HIT
X-Cache: HIT TCP_MEM_HIT dirn:10:1521745934
X-Swift-SaveTime: Mon, 17 Apr 2023 06:15:30 GMT
X-Swift-CacheTime: 532270
Timing-Allow-Origin: *
EagleId: 2466d41e16817121353632897e
三、CDN + OSS vs 静态资源服务器
1. 费用对比
开始前,先大致算一下一台最基本的 1C1G 的 ECS 静态服务器的费用
- 配置费用:¥0.157/时
- 公网流量费用:¥0.800/GB
按量付费:**(0.157 * 24 * 365) + (0.8 * 100)** = ¥1455.32
包年包月:540.60 + (0.8 * 100) = ¥620.6
静态资源服务器所能完成的工作,CDN + OSS 也可以基本完成
2. 配置使用
创建 bucket
创建 OSS Bucket 标准存储
- bucket 名称为短横线组成的 CDN 加速域名
- 选择地域:企业经营地
- 存储类型:默认标准存储,这个比较通用
- 存储冗余:本地冗余即可,有 CDN 会在前面会缓存一部分数据,即使后端源有问题,缓存时间内也不会太影响用户
- 读写权限:公共读
上传静态文件
这里使用 ossutil 命令行工具上传静态文件到远程 OSS,工具安装配置在文章最下面
$ cd /prodata/blog/public
$ ossutil cp -r . oss://oss-yo-yo-fun/
Succeed: Total num: 272, size: 13,694,894. OK num: 272(upload 173 files, 99 directories).
average speed 139000(byte/s)
98.515464(s) elapsed
WebUI 确认
公网访问测试
浏览器访问 bucket 域名
$ curl -s oss-yo-yo-fun.oss-cn-beijing.aliyuncs.com/index.html | grep LotusChing
LotusChing
<a href="https://github.com/LotusChing" class="waves-effect waves-light btn" target="_blank">
<a href="https://github.com/LotusChing" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50">
<a href="/about" target="_blank">LotusChing</a>
<a href="https://github.com/LotusChing" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50">
虽然 curl 命令可以访问 index.html,但是浏览器访问时,会直接下载页面文件,这是因为未对文件设置 HTTP 头
这是阿里云的策略导致的,具体见此公告
所以,我们接下来要去配置 CDN
CDN 加速 OSS
前面的过程都差不多
- 创建加速域名:oss.yo-yo.fun,用户通过该域名进行访问
- 配置域名解析 CNAME
- 配置源站地址:选择 OSS域名,oss-yo-yo-fun.oss-cn-beijing.aliyuncs.com
- 生效访问测试
配置截图
接下来,按照个人需求设置下 rewrite 规则
测试访问
性能测试
并发性能
这里提供下 CDN + OSS 并发性能的小测试,仅做参考:1000 个请求 500 并发连接
CDN + OSS 第一轮测试
$ ab -n 1000 -c 500 http://oss.yo-yo.fun/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking oss.yo-yo.fun (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Tengine
Server Hostname: oss.yo-yo.fun
Server Port: 80
Document Path: /
Document Length: 69267 bytes
Concurrency Level: 500
Time taken for tests: 7.993 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 70103702 bytes
HTML transferred: 69267000 bytes
Requests per second: 125.11 [#/sec] (mean)
Time per request: 3996.597 [ms] (mean)
Time per request: 7.993 [ms] (mean, across all concurrent requests)
Transfer rate: 8564.87 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 9 20 38.2 15 679
Processing: 29 1953 1990.2 1243 7441
Waiting: 10 381 741.6 68 3557
Total: 38 1973 1990.5 1266 7459
Percentage of the requests served within a certain time (ms)
50% 1266
66% 2854
75% 3612
80% 3789
90% 4296
95% 7167
98% 7292
99% 7312
100% 7459 (longest request)
CDN + OSS 第二轮测试
$ ab -n 1000 -c 500 http://oss.yo-yo.fun/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking oss.yo-yo.fun (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Tengine
Server Hostname: oss.yo-yo.fun
Server Port: 80
Document Path: /
Document Length: 69267 bytes
Concurrency Level: 500
Time taken for tests: 7.555 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 70106624 bytes
HTML transferred: 69267000 bytes
Requests per second: 132.37 [#/sec] (mean)
Time per request: 3777.426 [ms] (mean)
Time per request: 7.555 [ms] (mean, across all concurrent requests)
Transfer rate: 9062.19 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 9 21 47.7 15 683
Processing: 29 2434 2528.9 1581 7345
Waiting: 10 134 427.9 45 6921
Total: 38 2455 2528.9 1594 7365
Percentage of the requests served within a certain time (ms)
50% 1594
66% 3468
75% 3767
80% 4081
90% 7040
95% 7119
98% 7176
99% 7222
100% 7365 (longest request)
数据汇总一下
对象 | 第一轮 | 第二轮 |
---|---|---|
CDN + OSS | 完成时间 7.993 秒 并发请求数:125.11 /秒 用户平均等待时间:3996.597 毫秒 服务器平均处理时间:7.993 毫秒 |
完成时间 7.555 秒 并发请求数:132.37 /秒 用户平均等待时间:3777.426 毫秒 服务器平均处理时间:7.555 毫秒 |
这里没做 ECS 的 ab 测试是因为公网入口只要 1Mbps 稍微一压带宽就打满了,想要测试还得挂个 EIP,暂时不打算给这个账户充钱,所以跳过…
全国访问
使用阿里云平台提供的 网络拨测工具,模拟全国访问测试,测试结果
当然,这个数据还是受了 ECS 固定带宽(1Mbps)的影响,所以比较失真,仅做 CDN + OSS 参考,后续有机会重新做一份测试
对比总结
只看静态资源场景,CDN + OSS 足以满足基本的需求,
ECS 的优点在于,它能做除了静态资源以外更多的事情,例如:部署各类服务、ICP 备案 等等
常用工具
OSSUtil
下载使用
$ wget http://download.yo-yo.fun/other/ossutil -O /usr/bin/ossutil
$ chmod +x ossutil
$ cat > $HOME/.ossutilconfig << EOF
[Credentials]
language=EN
endpoint=oss-cn-beijing.aliyuncs.com
accessKeyID=xxx
accessKeySecret=xx
EOF
# 创建 bucket,默认 标准存储
# --storage-class 参数指定类型 Standard(标准存储)、IA(低频访问存储)、Archive(归档存储)、ColdArchive(冷归档存储)
# --acl private(私有,默认)、public-read(公共读)、public-read-write(公共写)
$ ossutil mb oss://<bucket_name>
# 上传 文件 到指定 bucket
$ ossutil cp file oss://<bucket_name>
# 上传 目录(递归) 到指定 bucket
$ ossutil cp -r <dir> oss://<bucket_name>
# 上传 当前路径下所有资源 到指定 bucket
$ ossutil cp -r . oss://<bucket_name>
# 列出 指定 bucket 资源列表
$ ossutil ls oss://<bucket_name>
# 删除 文件 从指定 bucket
$ ossutil rm oss://<bucket_name>
# 删除 文件 从指定 bucket
$ ossutil rm oss://<bucket_name>
# 删除 目录(递归) 从指定 bucket
$ ossutil rm -r <dir> oss://<bucket_name>
OSSFS
https://help.aliyun.com/document_detail/32195.html
安装过程
以 CentOS 7 为例
$ wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm
$ yum -y localinstall ossfs_1.80.6_centos7.0_x86_64.rpm
配置认证文件
$ echo oss-yo-yo-fun:xxxx:xxxx > /etc/passwd-ossfs
$ chmod 640 /etc/passwd-ossfs
挂载远程 oss
$ ossfs -o url=oss-cn-beijing.aliyuncs.com yo-yo-fun /mnt/oss-yo-yo-fun
拷贝数据到远程 oss
$ cp -rf /prodata/blog/public/* /mnt/oss-yo-yo-fun/
使用 OSSUtil 查看
$ ossutil ls -s oss://yo-yo-fun/
oss://oss-yo-yo-fun/404/
oss://oss-yo-yo-fun/404/index.html
oss://oss-yo-yo-fun/about/
oss://oss-yo-yo-fun/about/index.html
oss://oss-yo-yo-fun/ai/
# ...
Object Number is: 271
0.169842(s) elapsed