所在位置 > 新闻中心 > 新闻详情

WordPress:如何应用Kubernetes和Portworx实现高可用和可扩展性

2017-9-21

文章-1

背景:据统计,全球28%的网站都运行在WordPress上,这是一个惊人的数字,以此计算的话,大约有7500万个站点。WordPress是14年前出现的,在此期间,互联网用户数量从6亿已增加到了37亿。WordPress拥有两个状态的组件: MySQL数据库;及文件系统目录(用来保存上传的媒体文件和插件)。

WordPress发布之初,最常见的部署策略在服务器上安装WordPress PHP应用程序,MySQL数据库以及文件存储目录。我们希望能够进行备份,但事实上,我们并不需要考虑“存储”问题,因为事实上已经超出了本地磁盘容量。

在这14年时间里,以及包括新增的31亿用户,我们都明白现如今的互联网环境与WordPress发布时完全不一样。在这7500万个WordPress网站中,总有一部分网站的流量大的惊人,所以单个服务器上的流量访问对于开发者来说是一大头疼的事。

不得不说,总有那么一群人一直在研发很棒的工具来帮助解决这些问题。本文讲述其中的两个:
 Kubernetes
 Portworx

Kubernetes允许WordPress和MySQL容器在许多计算机上运行。这意味着可以横向扩展,同时有足够的能力来应对快速增长的用户群。

Portworx则提供了一个“数据管理层”,这表示能在一个节点上安全地运行MySQL服务器,不用担心节点是否中断。其block layer复制意味着数据已存在另一台机器上,这样便大大减少了故障时转移的时间。

Portworx同时还提供“共享卷”,这是WordPress的一大利器。“共享卷”使WordPress在文件夹中上传文件时拥有“多作者”。,这意味着可以横向扩展WordPress PHP容器,而不用担心在集群中的多个磁盘上分割上传。

将 Portworx的这两个功能与Kubernetes集群相结合,我们得到WordPress实例,它具备以下能力:
 在block层自动复制MySQL数据
 横向扩展WordPress PHP容器,并对文件上传目录使用“多作者”语义
 节点发生故障时自动修复

然而,以上所有这些都使用单个数据管理层!

WordPress 架构

首先,我们来看看没有Kubernetes或Portworx的WordPress的单个节点安装是如何运行的:
文章-2
WordPress容器部署图

可以看到,PHP应用的服务器会处理HTTP请求,处理包含读、写、上传文件及查询后台MySQL数据库。

文件上传

在单个节点设置中,文件上传目录和MySQL数据目录都是本地磁盘上的文件夹,一个块设备上有一个文件系统。如果要扩展WordPress容器,就要在它前面用代理来平衡流量。这样设置的问题是,文件的上传是跨多个服务器分离的。

来看看在两个节点上运行WordPress手动安装的2节点集群:

文章-3

你可以看到,文件上传的整个卷现在跨多个磁盘分离。WordPress对这个并没有一个原生的理解,所以用户能用这个设置来查看定期丢失的文件。

理想情况下,我们需要共享的文件系统;无论从哪里读取或写入什么,抑或是存储,对于每个WordPress容器来说都是一样的。

MySQL数据
数据库存储有一个不同的问题:我们需要确保数据在节点发生故障时是安全的。第一步是确保在另一台电脑上有一个数据副本,以便在出现故障时能重新构建服务器。

MySQL服务器失败的设置:

文章-4

WordPress容器故障图

我们通过在另一台计算机上自动更新数据副本来降低节点故障的风险。然而,这意味着我们必须以某种方式来进行故障自动转移,这样做对用户并不友好。此时,我们可以使用MySQL主从设置,但这并不是最快的转移方式,而且当我们重新同步新旧之间的更改时,性能可能会受到影响。

上面提到的文件上传卷也因为同样的原因需要某种类型的复制(比如,磁盘中断)。

Kubernetes
使用Kubernetes,可以解决故障自动转移的问题。如果一个节点死机,它将自动将MySQL容器重新安排到另一个节点。

但我们也需要数据,所以这个解决方案还不够完整。如果在AWS上,可以用EBS作为解决方案(Kubernetes也有一个EBS插件),但这会导致诸如如EBS 卷卡住的问题。

同样,当横向扩展WordPress PHP容器时,问题并不是由Kubernetes单独解决,而是一个容器管理层。可用NFS 卷,但这增加了一定的复杂性,因为我们正在为项目使用多个存储后端。

我们需要一个数据管理层提供以下功能:

 用于故障转移的块层复制
 用于横向扩展的“多作者”语义

这个解决方案需要原生的Kubernetes集成,一起来具体看看吧。

在kubernetes上的Portworx

Portworx是这个例子的完美解决方案,因为它提供了两种类型的存储(复制和多作者),同时,还具备原生的Kubernetes集成。

以下方式解决了我们的用例:

 运行MySQL的节点可能会死,Kubernetes将使用副本数据集重新安排一个新的MySQL pod到节点 (使用HyperConvergence)。
 横向扩展的WordPress PHP容器都具有单个文件上传磁盘的相同视图(即“多作者”)
 文件上传卷及多作者也会复制,以防止任何节点出现故障

文件上传

因为Portworx可以创建使用“多作者”语义的“共享”卷,我们可以为多个WordPress容器使用相同的Portworx 卷。

由于Portworx知道文件所处在实际节点,并能可视化地代理将该文件加载到节点上的请求,所以写入的每个文件都可用于其他卷。这在块层发生,因此,任何可写入文件系统的都不知道卷的大小,实际上,共享的数据并不是本地的数据。

通过下图可以看到这一点:
文章-5
使用Portworx复制和共享卷

此外,共享卷可以被复制(以防节点故障),它为我们提供了一个解决方案,能解决文件被写入到多个主机的问题。

MySQL数据

这是节点故障前的集群。注意Portworx是如何进行MySQL卷的块层复制的。
文章-6
HA WordPress使用Portworx复制

然后,如果节点出现故障,Kubernetes将把这个pod重新安排到Node B,在那里,MySQL副本准备就绪并等待开始。这样就减少了故障转移的时间,通过将容器和数据迁移到新主机来自动处理故障。

文章-7
服务器故障期间的HA WordPress

MySQL主从

为了简单起见,我们使用单个MySQL pod。在生产中,将使用StatefulSet,因为它允许MySQL在主/从配置中运行。

当然,Portworx 能很好地与StatefulSets 进行集成,在其应用层复制之下MySQL能利用块层更快复制。

额外功能

此外,Portworx不仅仅是一个存储连接器,也是一个数据管理层,以下有用的特性都是免费的:

 能安全地进行生产数据集的快照,而不会停机(这一点对于CI非常有用)
 将底层块设备池存储到一个统一的存储结构中,以此来将存储从计算中分离出来
 用于加密数据的各种选项
 自动将备份的快照发送到各种云存储提供商
 为各种物理后端存储设备提供统一的存储管理层

举例

下面是使用kops工具在AWS的Kubernetes上运行的安装程序的简短介绍。

创建集群

首先使用kops AWS在AWS上创建一个Kubernetes集群。

文章-8

安装etcd

安装一个etcd服务器(Portworx将使用它来保持集群协调)。使用CoreOS etcd来安装etcd。

文章-9

模板卷
然后,创建一个模板卷。’ kops’使用AWS的Auto Scaling Groups,Portworx与之能很好地集成在一起。
文章-10

Portworx Deamonset
这一步,我们将Portworx作为Deamonset运行,这表示一个Portworx容器将在集群中的每个节点上运行。
文章-11

创建卷

安装好了Portworx,我们可以在集群中的任何节点上进行SSH,使用’pxctl’ cli并创建卷。

为MySQL数据创建一个复制卷:
文章-12
上面的卷名称为“mysql-disk”,大小为“5GB”,格式为“ext4”,在集群中有2个副本(故障转移时我们需要复制)。

然后为WordPress PHP容器创建“multi-writer”磁盘。它将有和MySQL磁盘相同的属性,并带有额外的共享标志。它允许卷连接到多个容器,这便是我们需要的横向扩展WordPress容器:

文章-多

卷通过`pxctl`的`list`命令创建:

文章-14

启动MySQL

有一个磁盘ID,用它来运行MySQL pod:

文章-15
以下是YAML的内容,使用`envsubst`来替换新创建的磁盘的ID:

文章-16

启动WordPress
最后运行WordPress PHP pod:
文章-17
与MySQL pod一样,用`envsubst`替换新创建的磁盘的ID:

文章-18

思考
注意我们是如何在Kubernetes“部署”中实际部署WordPress和MySQL的。这就表示我们可以轻松地缩放每个部署运行的容器数量。

单纯地增加MySQL部署的规模是没有意义的。如前所述,我们将为其使用状态设置和主/从概念。

但我们可使用“kubectl规模部署”来增加WordPress容器的数量,因为它们正在使用Portworx的“共享”卷。

以下是将WordPress容器增加到10个的命令行:

文章-19

总结
本文展示了如何在AWS Kubernetes集群上安装和操作WordPress和Portworx。如其他文章所示的一样,使用Portworx还有许多优点,如EBS 卷被卡在附加状态时。

一起使用Kops和Portworx的另一个好处是能与AWS的Auto Scaling Groups集成。这预示着Portworx能管理底层EBS池,并且能在升级/缩小/升级操作之后重用以前的EBS卷。

原文链接:
https://dzone.com/articles/kubernetes-and-wordpress-scalability-and-ha