惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
腾讯CDC
S
SegmentFault 最新的问题
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Hacker News
The Hacker News
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
B
Blog
IT之家
IT之家
Spread Privacy
Spread Privacy
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cisco Blogs
Recent Announcements
Recent Announcements
H
Hacker News: Front Page
AI
AI
I
InfoQ
H
Heimdal Security Blog
T
Threatpost
Cisco Talos Blog
Cisco Talos Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
W
WeLiveSecurity
SecWiki News
SecWiki News
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
O
OpenAI News
阮一峰的网络日志
阮一峰的网络日志
T
Troy Hunt's Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
雷峰网
雷峰网
T
Tor Project blog
有赞技术团队
有赞技术团队
Schneier on Security
Schneier on Security
Last Week in AI
Last Week in AI

郭泽宇的博客 (@ZE3kr)

Hertz 租车被讨债总结,我起诉讨债公司的经历 | ZE3kr 在 iPad 上运行 macOS? (with Jump Desktop) Vision Pro 首发体验 | ZE3kr 低价冷数据存储方案 - Lightsail + S3 + Nextcloud 实现 $1/TB/月 谈一谈阿里云香港的宕机 | ZE3kr 云服务推荐及选择指南 | ZE3kr 从零开始建立自己的域名和企业邮箱 | ZE3kr 本站改版后的架构与优化——Hexo,分区解析,CDN,图像压缩等 | ZE3kr 毫米波 5G 有多快? 2000Mbps! 快来看看你的 iPhone 是否支持毫米波 Mac mini 有什么用?组建家庭服务器! | ZE3kr Magic Keyboard (妙控键盘) for iPad Pro 使用体验 自建 PowerDNS 进阶:分区解析,dnsdist,Lua 记录 | ZE3kr SSD U盘、Windows To Go 与 Mac WordPress 5.0 更新现已发布,全新编辑器,全新主题 | ZE3kr Azure DNS、NS1、Constellix,三家海外 GeoDNS 服务商对比 | ZE3kr Mac 上一些精致实用的软件推荐 | ZE3kr 谈谈数据备份 | ZE3kr DNSSEC 简介,签名的工作原理 | ZE3kr Cloudflare Argo 与 Railgun 对比测试,CDN 加速的黑科技 几个免费的服务器监控服务推荐 | ZE3kr 国内外几家全站 CDN 对比 | ZE3kr 2017 年,再看 SSL 和 HTTPS 关于建站和服务选购的一些建议 | ZE3kr DNS 域名解析系统详解——基础篇 | ZE3kr 修复 WordPress 2017 主题中奇怪字形的 Bug 使用 AMP 构建超快的移动页面 | ZE3kr Cloudflare 的全新功能体验——Load Balancing、Rate Limiting | ZE3kr Google Compute Engine 新手教程及使用体验 | ZE3kr 用回 WordPress 自带评论系统 | ZE3kr 使用免费 Let's Encrypt 实现 ECDSA/RSA 双证书 如何配置以实现纯 IPv6-Only 网络访问 | ZE3kr 自建 PowerDNS 智能解析服务器 | ZE3kr 在自己服务器上安装 GitLab,代替 GitHub! | ZE3kr 几个 WordPress 的加速建议 | ZE3kr CloudXNS、Route 53、阿里云解析等 DNS 服务的全面对比 | ZE3kr 从沙州中学到家 | ZE3kr 从家到沙州中学 | ZE3kr 谈谈视频在互联网上的流播 | ZE3kr 佳能发布新 APS-C 机型 EOS 80D,强悍视频录制、全新的对焦系统和 CMOS WordPress 上的几个推荐安装的插件 | ZE3kr Matomo 与 WordPress 配合使用,建立强大统计系统 | ZE3kr TL-PA500 电力猫,部署无线局域网集群 | ZE3kr 为何要使用一个 CDN 服务? | ZE3kr 静态网页的优与劣 | ZE3kr 全面 HTTPS 时代即将到来 | ZE3kr Withings Activité Pop 智能手表推荐,睡眠跟踪、运动记录、智能闹钟 | ZE3kr DELL P2415Q 4K 显示器推荐 | ZE3kr 好搜所做的恶心事 | ZE3kr 使用 srcset + sizes 属性与 w 标识符解决一切响应式图片问题 Eyefi Mobi 立刻让你的相机支持 Wi-Fi | ZE3kr 移动优先 – 速度 | ZE3kr MacID 让 iPhone 指纹解锁苹果电脑 | ZE3kr ProCamera – iPhone 照相软件推荐 | ZE3kr 移动优先 – 起源 | ZE3kr
利用 GCE 建立一个 Anycast 网络,超快的香港节点,Google Cloud CDN
2016-10-04 · via 郭泽宇的博客 (@ZE3kr)

在上一篇文章中,我简单的介绍了 Google Compute Engine(简称 GCE)的基础使用。这篇文章我将介绍如何利用 GCE 建立一个 Anycast 网络,并测试了其速度。 想要实现这个功能,就需要使用 Cross-Region Load Balancing(跨地区的负载均衡),此功能就相当于一个 HTTP(S) 的反向代理,所以只能针对 HTTP/HTTPS 请求进行负载均衡。

简要概述

GCE 上所实现的这个功能是基于第七层的网络代理,所以其拓扑图是这样的: 用户 —> 边缘服务器 —> 实例

  • 用户到边缘服务器之间的连接:使用 HTTP 或 HTTPS;如果是 HTTPS 连接,那么 TLS 加密过程是在边缘服务器上实现。
  • 边缘服务器到实例的连接:使用 HTTP 或 HTTPS 连接,之前的网络是走的 Google 的专线。

不论配置了几个位置的实例,边缘服务器都是使用 Google 全部的边缘服务器。 启用这个功能后,就会得到另一个 Anycast 的 IP 地址,这是个独享的 IP 地址。

什么是 Anycast?Anycast 能够让多个主机使用一个 IP 地址,当用户连接这个 IP 地址的时候,连接到的只是这多个主机中的其中之一,通常会选择最快的线路,能有效的降低延迟,所以很多 DNS/CDN 提供商都使用了 Anycast。

此外,目前使用负载均衡是唯一能让其原生支持 IPv6 的方法。具体可以参见其文档:IPv6 Termination for HTTP(S), SSL Proxy, and TCP Proxy Load Balancing

预留 IPv6 地址的截图
预留 IPv6 地址的截图

配置方法

建立实例

首先,需要前往到 GCE 后台,建立至少两个不同地区的实例,我专门为测试 Anycast 功能建立了两个新的实例:

为 Anycast 建立的两个实例
为 Anycast 建立的两个实例

每个地区也可以建立多个实例以提高可用性,而我只给每个地区建立了一个实例,这两个实例分别叫 anycast-asia 和 anycast-us。

建立实例组

然后,需要给每个地区的实例建立一个实例组

实例组配置页面
实例组配置页面

需要注意的是,实例组配置页面中位置里的 “多地区(Multi-zone)” 是指同一个地区(Region)的不同可用区域(Zone),而不是多个不同的地区,所以这实际上是翻译的错误,应该叫做 “多可用区域” 才对。


刚接触云服务的人可能不理解可用区域的概念,可以参考 AWS 的这篇文章来理解。简单点说,地区这个概念就是指离得很远的地区(比如城市之间,如北京和上海),所有在北京的服务器都算北京地区,所有在上海的服务器都算上海地区。但是为了能达到更高的可用性,通常还会在同一个地区设立多个数据中心,也就是可用区域。这些可用区域虽在一个地区中,其之间的距离可能相隔几十甚至几百公里,但这些可用区域之间的距离和不同地区之间的距离相比起来要小得多,所以这些可用区域之间的网络延迟也很低。

设立多个可用区域的意义是:可以能加更高的可用性(主要是为了避免外界因素:比如说火灾等),虽然是异地分布,但是可用区域之间的距离并不远,所以网络延迟可以忽略。

我只给每个地区建立了一个实例,所以我只需要选择 “单地区(Single-zone)”。每个地区都需要建立一个实例组,所以一共需要建立两个(或更多的)实例组。我配置了两个实例组,分别叫 asia-group 和 us-group。

建立负载均衡

完成前两步之后,就需要建立负载均衡的规则了,需要选择 “HTTP(S) 负载平衡” 来实现 Anycast 的功能。

三种负载均衡模式
三种负载均衡模式

在负载均衡的配置界面,把这两个实例组都添加到 “后端” 中。 该功能还需要创建一个运行状态检查(相当于监控功能),当主机宕机后能实现切换。

暂时先不开启 CDN 功能
暂时先不开启 CDN 功能
保留默认的 “主机路径和规则”
保留默认的 “主机路径和规则”
目前是需要 HTTP 的例子,如果需要 HTTPS,还需要指定一个证书。
目前是需要 HTTP 的例子,如果需要 HTTPS,还需要指定一个证书。

创建成功后,可以看到如下界面,其中的 IP 地址就是 Anycast IP 了。

成功创建了一个 Anycast IP
成功创建了一个 Anycast IP

Nginx 的配置

这里的配置只是为了方便调试,实际使用不用额外修改 Nginx 的配置。 在这两个主机上都安装 Nginx,然后稍微改动默认的配置文件:增加两个 Header,然后 Reload。

1
2
add_header X-Tlo-Hostname $hostname always;
add_header Cache-Control "max-age=36000, public";

检测是否可用

在测试 Anycast 之前,先测试这两个主机是否存在问题。为了方便阅读,我将 curl 的 IP 地址换为主机名,并省略两个主机都相同的 Header 字段

1
2
3
4
5
6
7
8
9
10
$ curl anycast-us -I
HTTP/1.1 200 OK

ETag: "57ef2cb9-264"
X-Tlo-Hostname: **anycast-us**
$ curl anycast-asia -I
HTTP/1.1 200 OK

ETag: "57ef2b3b-264"
X-Tlo-Hostname: anycast-asia

可以看到这两个主机都没有什么问题。然后,我用我的电脑去测试那个 Anycast IP:

1
2
3
4
5
6
7
$ curl anycast-ip -I
HTTP/1.1 200 OK

ETag: "57ef2b3b-264"
X-Tlo-Hostname: anycast-asia
Accept-Ranges: bytes
Via: 1.1 google

可以看到,这是 anycast-asia 主机响应的。现在我使用另一个在美国的主机继续测试这个 Anycast IP:

1
2
3
4
5
6
7
$ curl anycast-ip -I
HTTP/1.1 200 OK

ETag: "57ef2cb9-264"
X-Tlo-Hostname: anycast-us
Accept-Ranges: bytes
Via: 1.1 google

此时就是 anycast-us 主机响应的,是因为客户端离这个服务器更近。 当通过 Anycast IP 访问时,就可以看到 HTTP Header 中的 Via: 1.1 google 字段。

速度测试

Ping 测试

Ping 测试发现速度很快,看来反代的操作是放在 Google 的边缘服务器上了。速度堪比 Google 啊!

对 Anycast IP 的国外速度测试
对 Anycast IP 的国外速度测试

中国的速度那更是一流的快,Google 有香港的边缘节点,所以基本上是直接走的香港节点,比原本的连接台湾可用区快不少。(只有部分 IP 段是完全直连的)

对 Anycast IP 的国内速度测试
对 Anycast IP 的国内速度测试

HTTP GET 测试

在开启 CDN 功能之前,负载均衡器是不会对任何内容缓存的,所以会发现 Connect 的速度很快,但是 TTFB 延迟还是有不少。

对 Anycast IP 进行 HTTP GET 测试
对 Anycast IP 进行 HTTP GET 测试

可以预测,如果启用了 HTTPS 功能,其 TLS 所需要的等待时间也会很短,TTFB 时间不变,总时长不会延长太多。

开启 CDN 后进行 HTTP GET 测试

当将 CDN 开启后,负载均衡器就会自动地对静态资源做缓存了,当缓存命中后会显示 Age 字段,这个字段是表示自缓存命中了,后面的数字代表这是多少秒之前缓存的内容。

curl anycast-ip -I
HTTP/1.1 200 OK

Via: 1.1 google
Age: 10

经过多次执行这个指令,会发现有一定几率 Age 字段消失,这可能是流量指到了同一个地区的不同可用区上。但总之,是缓存命中率不高,即使之前曾访问过了。

开启 CDN 后进行 HTTP GET 测试
开启 CDN 后进行 HTTP GET 测试

多次运行测试确保有缓存之后,发现速度似乎并没有太多明显的提升。能够明显的看出改善的是:巴黎和阿姆斯特丹的 TTFB 延迟从 200ms 减少到了 100ms,然而还是不尽人意。可能的原因是:Google 并没有将内容缓存到离访客最近的边缘节点上,而是别的节点上。 CDN 缓存服务器的位置列表

缓存服务器的位置
缓存服务器的位置

统计与日志

开启了 Load Balancing 后,就会自动在 Google Cloud Platform 下记录一些信息了。

实时流量查看

在网页后台的 Network,Load balancing,advanced menu 的 Backend service 下,可以查看实时的流量情况:

图形还是很漂亮的
图形还是很漂亮的

延迟日志

在网页后台的 Stackdriver,Trace 下,可以看到延迟日志:

延迟日志截图 1
延迟日志截图 1
延迟日志截图 2
延迟日志截图 2

这里的延迟包含了网络延迟和服务器响应延迟

总结

GCE 所能实现的 Anycast 功能,只能通过 HTTP 代理(第七层)的方式实现,所以只能代理 HTTP 请求,其他功能(如 DNS)无法实现。所以很多功能受限于负载均衡器的功能(比如证书和 HTTP2 都需要在负载均衡器上配置),然而由于 TLS 加解密过程是在边缘服务器上实现,而且其本身也带有 CDN 功能,所以会比单纯的 Anycast(比如基于 IP 层,或是 TCP/UDP 层)的更快一些。

价格

前五个 Rules $18/月,流量费用相比 GCE 不变,已经被缓存的内容的流量有一点优惠。

对比

Cloudflare

通过使用 Cloudflare 所提供的服务也能实现 Anycast,也是基于第七层的,即将也能实现 Cross-Region Load Balancing 的功能。虽然它还不能根据主机的 CPU 占用率去调整权重(毕竟它拿不到这些数据),却有强大的 Page Rules 功能以及 WAF 功能。 CloudFlare 并不提供独立 IP 地址,不过这不是什么大问题。 由于它属于第三方服务,不受服务提供商的限制,于是就可以给多种不同的服务提供商去做 Anycast 功能;而且无论服务商是否支持,都能够使用。 连接速度上,GCE 的在中国连接速度有明显的优势。

BuyVM

BuyVM 是一家 VPS 提供商,却提供免费的 Anycast 功能,其 Anycast 功能是直接基于 IP 层的 Anycast,所以可以配置 HTTP 之外的各种服务。BuyVM 没有所谓的边缘服务器一说,只能有三个节点,Ping 的结果不像前两家那么快,而且 TLS 过程也是在原本的主机(这三个主机中里用户最近的一个)上进行,也会有一定延迟。 BuyVM 并不提供任何亚洲的主机,所以中国的连接速度也没有比 Cloudflare 快多少,整个亚洲的速度也不是很快。