WordPress是一种非常流行的博客网站平台,也可以当作一个内容管理系统(CMS)来使用, 是世界上使用最广泛的博客系统之一。WordPress有非常多优秀的插件,使得这个开源产品变得非常容易扩展,满足不同的需求。
我准备利用一个系列的文章,来展示如果利用阿里云的各种产品(弹性计算,数据库,安全等等),搭建一个完整的WordPress网站。内容包括:
- 一、 搭建基础网站应用
- 二、 域名,短信和邮箱
- 三、 动静分离和CDN加速
- 四、 数据库缓存和管理
- 五、 服务器横向扩展
- 六、 网站安全
五、服务器横向扩展
针对数据库增加了缓存和只读实例这些配套组件之后,在很长一段时间之内,网站都不再会因为数据库性能出现问题(毕竟网站读多写少,业务场景比较单一),随着业务持续增加压力会出现在应用服务器上。应用服务器的扩展可以是纵向的(升级规格),也可以是横向的(增加服务器进行并行处理),在这篇文章中,我们会演示如何利用镜像进行ECS的横向扩展。为了进行横向扩展,首先需要复制ECS镜像(这当然要求应用是无状态的),并在前端增加SLB负载均衡。除此之外,当ECS数量逐渐增加之后,为了运维方便,往往可以增加一个NAT网关来作为统一的公网运维出入口,如果对安全性特别高的情况,甚至需要通过增加VPN+堡垒机的方式来进行包含鉴权和审计的运维活动。
这个部分的架构图如下,基于上一个版本增加了:
- SLB负载均衡:对多台ECS进行流量分发,从而扩展应用系统对外的服务能力,避免单点故障
- NAT网关:在 VPC 环境下构建一个公网流量的出入口,为多ECS提供访问公网的出口(SNAT)或统一运维入口(DNAT)
利用镜像新建一台ECS
横向扩展的前提是无状态应用,文件和数据库都应该独立出来存放。前面配置的NAS和MySQL都是独立的,已经具备横向扩展的条件。横向扩展的方式是复制多个无状态的ECS实例。做法是首先打个ECS快照(https://help.aliyun.com/document_detail/25455.html)。说到ECS快照,为了保证业务数据安全,一般的系统应该进行每日快照并最少保存过去7天的快照数据。“快照不规范,亲人两行泪!”
快照创建好了之后,再利用这个快照创建一个自定义镜像(https://help.aliyun.com/document_detail/25460.html)。注意快照和镜像的区别,快照主要是用于数据备份,只能恢复到当前ECS实例,不可跨地域使用;镜像主要是用于数据迁移,可以更换系统盘或创建新的ECS实例,可以跨地域使用。
有了镜像,就可以再复制出一个新的ECS来。创建ECS的时候要注意VPC应该和老ECS的VPC一致,才能保证内网互通。另外考虑到高可用,可以把新ECS放在另外一个可用区中,即使有其中一个区的ECS宕机,还有另一个区的ECS可以用。另外,跨可用区高可用的部署要注意“雪崩效应”,即两台ECS的负载都大于50%的情况下,当一台因故宕机后,另一台也会由于过载的原因而宕机,导致高可用失效。因此,两台ECS高可用,平均负载不应超过50%;三台ECS高可用,平均负载不应超过66%;四台ECS高可用,平均负载不应超过75%;以及类推。
为了让新的ECS可以访问RDS和Redis,需要将其内网IP加入到RDS和Redis的白名单中,这个操作可以参考前两篇(“搭建基础网站应用”和“数据库缓存和管理”)中的设置方法,而NAS和OSS则没有这个安全要求。所有的对应的连接配置也都已经被打包进了镜像当中,一般来说无需再进行配置。
然后我们把之前绑在旧ECS上的EIP解绑,然后绑到新ECS上面试试看。由于是通过镜像复制出来的新ECS,连接的数据库是原有的,所以理论上应该和访问旧ECS应该没有什么区别。
绑定好之后,访问网页试试,正常应该可以成功。如果发现又到了WordPress的配置页,这表示之前配置文件没有正确加载。这个问题很可能是因为NAS加载因为某种问题失败了,可以重启一次新ECS再试试。
用SLB做负载均衡
有了多台ECS,为了保证流量均衡分配到多台ECS上,需要在ECS集群前面增加SLB负载均衡(https://www.aliyun.com/product/slb),这和自己用Nginx搭负载均衡类似,而优势在于能够快速搭建起一主一备的高可用架构,并且运维起来也更方便些。创建SLB的时候要注意使用私网类型,这样才能继续绑定使用之前的EIP,使得对外IP保持不变。另外还要注意使用之前创建的VPC,保证其与后端ECS的内网连通。
创建成功之后,开始配置后端服务器,将前面的新旧两台ECS接入。
前端继续监听HTTP协议,并且仍旧继续使用80端口,使得在横向扩展过程中,不影响业务的对外展现。SLB的调度算法有三种:轮询、加权轮询(WRR)、加权最小连接数(WLC),在后端服务器的处理能力不同的情况下,一般采用加权算法。在此例中,两台后端ECS设置了相同的权重,效果和轮询一样。另外WordPress需要打开保持会话功能,负载均衡监听会把来自同一客户端的访问请求分发到同一台后端ECS上。
设置完成之后,把绑在新ECS上的EIP解绑,然后绑到SLB上面来。
最后从前端页面试试,访问正常。在SLB的控制台上也应该可以看到相应的流量,妥!
NAT网关做维护口
SLB+EIP作为用户出入的“正门”没有问题,但是无法供运维人员使用来对ECS进行运维,包括SSH(或者RDP)和外网下载等。为了对ECS集群进行运维,要么给每个ECS都绑一个EIP,要么利用NAT网关(https://www.aliyun.com/product/nat)作为运维的出入口。第一种方法安全性较低,也不太容易管理,所以一般都会采用NAT网关的方案,利用DNAT提供SSH(或者RDP)端口映射供运维人员远程控制,利用SNAT提供外网下载的能力。另外,由于NAT网关没有鉴权能力,如果需要更安全的运维方式,还应该利用堡垒机(https://www.aliyun.com/product/bastionhost)来代替NAT网关的DNAT功能。
首先需要购买一个NAT网关和两个EIP(一个供DNAT使用,一个供SNAT使用),然后把EIP绑定到NAT上。
然后配置DNAT,将后端ECS的22端口(SSH)映射到外网来(本例用了10221和10222端口来分别对应旧新两台ECS的22端口)。
从外网试试利用映射端口10221来控制旧ECS,没问题。
再来配置SNAT,这个很简单,只需要绑定到相应的交换机上就好了。
利用刚刚的SSH试试从ECS进行下载,毫无压力。