时隔半年再记录下,比较重大的更新:
0xFFFF 主站搬到 fly.io 之后,我也一直在想办法优化站点的访问速度,虽然静态文件走已备案域名的大陆 cdn,但主域名动态内容访问的延迟仍还是硬伤。之前论坛部署在 fly.io 的东京机房,大陆访问 fly.io 的 Anycast IP,路由上会走 NTT 线路和 PCCW 线路,或者从美国绕一圈再到东京,高峰期访问速度和丢包都很不理想。
这里的缓解方式也是,放一个在香港的反向代理来承接来自大陆的流量,其他流量可以直冲 fly.io,再考虑用 DNS 做按地域分流。目前看阿里云香港轻量的速度与性价比都还不错,DNSPod 的免费版也可以实现分地域解析的能力,专业版会更细致,价格还可接受(¥99/年)。
另一点速度瓶颈在于,网站依赖 Cloudflare(简称 CF)默认的 DNS 和 CDN 带来的额外延迟,CF 本身承载站点众多,存在一定的因滥用被屏蔽的风险,且在大陆访问也不算稳定。另外他们家对象存储 R2 有强依赖 CF 的基础的网络架构,因而也会受限于这里的延迟乃至不可达。
针对 CF DNS 和 CDN 的问题,这里的思路是用低成本的替代品来实现,DNS 走 DNSPod 可以满足需求,发现一个 Bunny CDN 也可以满足这方面需要,由于 R2 没法离开 CF 的 DNS,并且附件的域名是 static.0xffff.one
,CNAME 接入需要企业版本负担不起,只好另外再找对象存储服务。调研了一波发现 Backblaze B2 ,配合 Bunny CDN 还挺合适,而且价格于 0xFFFF 的小众规模而言,属于是非常便宜。
这其中未注意到的细节是,MySQL 跑在 fly 的带 volume 实例上,可能存在风险。前段时间想把 MySQL 实例从东京挪到香港,因意外操作导致 数据丢失,还好在坛友给力帮助下救了回来。意识到在 fly 的分布式边缘服务器维护有状态服务的坑还是很大,通常情况下只能靠备份和第三方服务去兜底,所以综合来看,小型的有状态服务还是用传统 vps 来承载合适一些,无状态服务适合交给 fly。
综合以上以及其他细节考虑,也得到一个新的部署方案,对应服务的选择:
- 接入层网关:阿里港区轻量 vps + fly.io,然后 DNSPod 分流
- 业务逻辑 + DB:另一台港区轻量服务器
- JS / CSS 静态文件:腾讯云 CDN + Bunny CDN
- 图片附件:Backblaze B2 + Bunny CDN
- 压图服务 img-proxy:fly.io + Bunny CDN
- 备份方案:腾讯 COS 广州、香港两地同步(定期 rclone + duplicati 备份)
以此实现剥离开对 Cloudflare 的依赖,速度已不再是瓶颈;并且业务状态都集中在一台机器,可维护性得以加强。
后续进一步的方向:
- 完全干掉 Flarum 实例对单节点状态的依赖,实现灵活水平扩展
- 数据库交给专业的 DBA 服务维护,关注低成本的托管 DB 方案,目前看 TiDB Cloud 和 PlanetScale 的免费额度能覆盖到,但可能外网访问数据库延迟会对应提高。目前看亚太地区只有新加坡和东京机房,考虑把计算实例挪到新加坡区域,目前在尝试 TiDB + 新加坡 AWS 的 LightSail 实例。