一切的始发点

偶然在群里和一位大佬在闲聊,聊到了他自己业务的源站结构,并表示这种高性能集群不会死在 CDN 前面。

一个跑数据库,一个跑web,不就好了嘛
什么点子王
或者,2h的waf,4h的web,2h的mysql
去年初,我整的8机集群:2台2h的waf,2台4h的web;1台4h主mysql,1台2h从mysql;1台2h文件节点,1台2h综合节点
我是把php和nginx放在web服务器;mysql单独服务器;Redis放在综合节点
拆到最后,就不折腾集群了[表情]
因为业务凉凉了
当时被打崩的情况,只有前面的cdn,源站集群啥事没有

具体实现

大纲

大致的访问流程如下:

(Mermaid 单项流程示意图,仅供参考)

赛博抓药

服务器全部从雨云采购。作为高级代理六五折提货。

雨云-新一代云服务提供商

先讲成本。这里没有大佬那样夸张。(雨云美国二区)

类型配置用途成本
aaWAF Node4H4G 80M↑100M↓过滤部分 Web 攻击327.6¥/年
Nginx+PHP Node8H16G 150M↑150M↓放置 WP 文件并进行 PHP 运算,用于 Web1075.2¥/年
Mysql+Redis Node4H8G 100M↑100M↓放置 Mysql 与 Redis,用于数据库615.6¥/年
总计2018.4¥/年

数据、网络互通性

雨云的云服务器支持同可用区内网互通,理论内网带宽最大 500M(为了防止内网攻击)

这里就使用内网低延迟高速互通来实现了。

数据库开放 Mysql 与 Redis 端口给 Web 节点使用,Web节点使用内网连接数据库节点。

关于 Mysql,直接复制一个与 root 账户权限相同的账户,允许所有主机,用于后续跨实例连接。

对于 Redis,直接加上 passwd,然后改 bind ip 参数为需要的值(例如0.0.0.0)

直接开放数据库端口或修改 Redis bind IP 可能会导致站点被入侵并导致严重后果!您可以使用防火墙控制访问 IP。

对于 Web 文件节点同步,目前的设想所有 Web 节点是挂载同一台文件节点的。但由于技术限制,没有纳入本次集群折腾。

性能测试

此处使用 WordPress 进行测试。

以下为各机器环境。

  • Debian 12
  • Nginx 1.26
  • PHP 7.4
  • Mysql 8.0

源站使用 litespeed cache 插件(基本预设+启用 Redis 对象缓存),同时使用宝塔的那个鸡肋网站缓存插件(命中率≥95%)

上述配置进行的性能测试负载结果如下:

根据漏桶效应,Web 服务器负载最大,应当是性能瓶颈。而带宽远没有满载,所以以 CPU 负载为准。(此结果不准确,保守估计)

负载(CPU)QPS
30%≈170
100%(推算)≈550(推算)

可能的拓展

这里使用的结构只是单线流程,并没有做到故障转移,所以只是高性能,而不是高可用。同时集群只有一份。理论上来讲,您复制一份集群并让其参与负载均衡,您源站并发能力会高一倍。

如果您需要实现故障转移,可以考虑多点负载均衡或是备用点的方案:对于 Web 数据的同步,可以使用 Rsync 等增量同步工具;对于数据库的同步,可以考虑主从/主主的结构。

总结

这套方案适合对于源站并发能力有需求,且钱包单薄的人群。

完全可以自己加上故障转移或是负载均衡,做到更高的可用性与性能。

版权申明