背景
據(jù)統(tǒng)計(jì),全球28%的網(wǎng)站都運(yùn)行在WordPress上,這是一個(gè)驚人的數(shù)字,以此計(jì)算的話,大約有7500萬個(gè)站點(diǎn)。WordPress是14年前出現(xiàn)的,在此期間,互聯(lián)網(wǎng)用戶數(shù)量從6億已增加到了37億。WordPress擁有兩個(gè)狀態(tài)的組件: MySQL數(shù)據(jù)庫;及文件系統(tǒng)目錄(用來保存上傳的媒體文件和插件)。
WordPress發(fā)布之初,最常見的部署策略在服務(wù)器上安裝WordPress PHP應(yīng)用程序,MySQL數(shù)據(jù)庫以及文件存儲(chǔ)目錄。我們希望能夠進(jìn)行備份,但事實(shí)上,我們并不需要考慮“存儲(chǔ)”問題,因?yàn)槭聦?shí)上已經(jīng)超出了本地磁盤容量。
在這14年時(shí)間里,以及包括新增的31億用戶,我們都明白現(xiàn)如今的互聯(lián)網(wǎng)環(huán)境與WordPress發(fā)布時(shí)完全不一樣。在這7500萬個(gè)WordPress網(wǎng)站中,總有一部分網(wǎng)站的流量大的驚人,所以單個(gè)服務(wù)器上的流量訪問對于開發(fā)者來說是一大頭疼的事。
不得不說,總有那么一群人一直在研發(fā)很棒的工具來幫助解決這些問題。本文講述其中的兩個(gè):
lKubernetes
lPortworx
Kubernetes允許WordPress和MySQL容器在許多計(jì)算機(jī)上運(yùn)行。這意味著可以橫向擴(kuò)展,同時(shí)有足夠的能力來應(yīng)對快速增長的用戶群。
Portworx則提供了一個(gè)“數(shù)據(jù)管理層”,這表示能在一個(gè)節(jié)點(diǎn)上安全地運(yùn)行MySQL服務(wù)器,不用擔(dān)心節(jié)點(diǎn)是否中斷。其block layer復(fù)制意味著數(shù)據(jù)已存在另一臺(tái)機(jī)器上,這樣便大大減少了故障時(shí)轉(zhuǎn)移的時(shí)間。
Portworx同時(shí)還提供“共享卷”,這是WordPress的一大利器?!肮蚕砭怼笔筗ordPress在文件夾中上傳文件時(shí)擁有“多作者”。,這意味著可以橫向擴(kuò)展WordPress PHP容器,而不用擔(dān)心在集群中的多個(gè)磁盤上分割上傳。
將 Portworx的這兩個(gè)功能與Kubernetes集群相結(jié)合,我們得到WordPress實(shí)例,它具備以下能力:
l在block層自動(dòng)復(fù)制MySQL數(shù)據(jù)
l橫向擴(kuò)展WordPress PHP容器,并對文件上傳目錄使用“多作者”語義
l節(jié)點(diǎn)發(fā)生故障時(shí)自動(dòng)修復(fù)
然而,以上所有這些都使用單個(gè)數(shù)據(jù)管理層!
WordPress架構(gòu)
首先,我們來看看沒有Kubernetes或Portworx的WordPress的單個(gè)節(jié)點(diǎn)安裝是如何運(yùn)行的:
可以看到,PHP應(yīng)用的服務(wù)器會(huì)處理HTTP請求,處理包含讀、寫、上傳文件及查詢后臺(tái)MySQL數(shù)據(jù)庫。
文件上傳
在單個(gè)節(jié)點(diǎn)設(shè)置中,文件上傳目錄和MySQL數(shù)據(jù)目錄都是本地磁盤上的文件夾,一個(gè)塊設(shè)備上有一個(gè)文件系統(tǒng)。如果要擴(kuò)展WordPress容器,就要在它前面用代理來平衡流量。這樣設(shè)置的問題是,文件的上傳是跨多個(gè)服務(wù)器分離的。
來看看在兩個(gè)節(jié)點(diǎn)上運(yùn)行WordPress手動(dòng)安裝的2節(jié)點(diǎn)集群:
你可以看到,文件上傳的整個(gè)卷現(xiàn)在跨多個(gè)磁盤分離。WordPress對這個(gè)并沒有一個(gè)原生的理解,所以用戶能用這個(gè)設(shè)置來查看定期丟失的文件。
理想情況下,我們需要共享的文件系統(tǒng);無論從哪里讀取或?qū)懭胧裁矗只蚴谴鎯?chǔ),對于每個(gè)WordPress容器來說都是一樣的。
MySQL數(shù)據(jù)
數(shù)據(jù)庫存儲(chǔ)有一個(gè)不同的問題:我們需要確保數(shù)據(jù)在節(jié)點(diǎn)發(fā)生故障時(shí)是安全的。第一步是確保在另一臺(tái)電腦上有一個(gè)數(shù)據(jù)副本,以便在出現(xiàn)故障時(shí)能重新構(gòu)建服務(wù)器。
MySQL服務(wù)器失敗的設(shè)置:
我們通過在另一臺(tái)計(jì)算機(jī)上自動(dòng)更新數(shù)據(jù)副本來降低節(jié)點(diǎn)故障的風(fēng)險(xiǎn)。然而,這意味著我們必須以某種方式來進(jìn)行故障自動(dòng)轉(zhuǎn)移,這樣做對用戶并不友好。此時(shí),我們可以使用MySQL主從設(shè)置,但這并不是最快的轉(zhuǎn)移方式,而且當(dāng)我們重新同步新舊之間的更改時(shí),性能可能會(huì)受到影響。
上面提到的文件上傳卷也因?yàn)橥瑯拥脑蛐枰撤N類型的復(fù)制(比如,磁盤中斷)。
Kubernetes
使用Kubernetes,可以解決故障自動(dòng)轉(zhuǎn)移的問題。如果一個(gè)節(jié)點(diǎn)死機(jī),它將自動(dòng)將MySQL容器重新安排到另一個(gè)節(jié)點(diǎn)。
但我們也需要數(shù)據(jù),所以這個(gè)解決方案還不夠完整。如果在AWS上,可以用EBS作為解決方案(Kubernetes也有一個(gè)EBS插件),但這會(huì)導(dǎo)致諸如如EBS 卷卡住的問題。
同樣,當(dāng)橫向擴(kuò)展WordPress PHP容器時(shí),問題并不是由Kubernetes單獨(dú)解決,而是一個(gè)容器管理層。可用NFS 卷,但這增加了一定的復(fù)雜性,因?yàn)槲覀冋跒轫?xiàng)目使用多個(gè)存儲(chǔ)后端。
我們需要一個(gè)數(shù)據(jù)管理層提供以下功能:
l用于故障轉(zhuǎn)移的塊層復(fù)制
l用于橫向擴(kuò)展的“多作者”語義
這個(gè)解決方案需要原生的Kubernetes集成,一起來具體看看吧。
在kubernetes上的Portworx
Portworx是這個(gè)例子的完美解決方案,因?yàn)樗峁┝藘煞N類型的存儲(chǔ)(復(fù)制和多作者),同時(shí),還具備原生的Kubernetes集成。
以下方式解決了我們的用例:
l運(yùn)行MySQL的節(jié)點(diǎn)可能會(huì)死,Kubernetes將使用副本數(shù)據(jù)集重新安排一個(gè)新的MySQL pod到節(jié)點(diǎn) (使用HyperConvergence)。
l橫向擴(kuò)展的WordPress PHP容器都具有單個(gè)文件上傳磁盤的相同視圖(即“多作者”)
l文件上傳卷及多作者也會(huì)復(fù)制,以防止任何節(jié)點(diǎn)出現(xiàn)故障
文件上傳
因?yàn)镻ortworx可以創(chuàng)建使用“多作者”語義的“共享”卷,我們可以為多個(gè)WordPress容器使用相同的Portworx 卷。
由于Portworx知道文件所處在實(shí)際節(jié)點(diǎn),并能可視化地代理將該文件加載到節(jié)點(diǎn)上的請求,所以寫入的每個(gè)文件都可用于其他卷。這在塊層發(fā)生,因此,任何可寫入文件系統(tǒng)的都不知道卷的大小,實(shí)際上,共享的數(shù)據(jù)并不是本地的數(shù)據(jù)。
通過下圖可以看到這一點(diǎn):
此外,共享卷可以被復(fù)制(以防節(jié)點(diǎn)故障),它為我們提供了一個(gè)解決方案,能解決文件被寫入到多個(gè)主機(jī)的問題。
MySQL數(shù)據(jù)
這是節(jié)點(diǎn)故障前的集群。注意Portworx是如何進(jìn)行MySQL卷的塊層復(fù)制的。
然后,如果節(jié)點(diǎn)出現(xiàn)故障,Kubernetes將把這個(gè)pod重新安排到Node B,在那里,MySQL副本準(zhǔn)備就緒并等待開始。這樣就減少了故障轉(zhuǎn)移的時(shí)間,通過將容器和數(shù)據(jù)遷移到新主機(jī)來自動(dòng)處理故障。
MySQL主從
為了簡單起見,我們使用單個(gè)MySQL pod。在生產(chǎn)中,將使用StatefulSet,因?yàn)樗试SMySQL在主/從配置中運(yùn)行。
當(dāng)然,Portworx 能很好地與StatefulSets 進(jìn)行集成,在其應(yīng)用層復(fù)制之下MySQL能利用塊層更快復(fù)制。
額外功能
此外,Portworx不僅僅是一個(gè)存儲(chǔ)連接器,也是一個(gè)數(shù)據(jù)管理層,以下有用的特性都是免費(fèi)的:
l能安全地進(jìn)行生產(chǎn)數(shù)據(jù)集的快照,而不會(huì)停機(jī)(這一點(diǎn)對于CI非常有用)
l將底層塊設(shè)備池存儲(chǔ)到一個(gè)統(tǒng)一的存儲(chǔ)結(jié)構(gòu)中,以此來將存儲(chǔ)從計(jì)算中分離出來
l用于加密數(shù)據(jù)的各種選項(xiàng)
l自動(dòng)將備份的快照發(fā)送到各種云存儲(chǔ)提供商
l為各種物理后端存儲(chǔ)設(shè)備提供統(tǒng)一的存儲(chǔ)管理層
舉例
下面是使用kops工具在AWS的Kubernetes上運(yùn)行的安裝程序的簡短介紹。
創(chuàng)建集群
首先使用kops AWS在AWS上創(chuàng)建一個(gè)Kubernetes集群。
安裝etcd
安裝一個(gè)etcd服務(wù)器(Portworx將使用它來保持集群協(xié)調(diào))。使用CoreOS etcd來安裝etcd。
模板卷
然后,創(chuàng)建一個(gè)模板卷?!?kops’使用AWS的Auto Scaling Groups,Portworx與之能很好地集成在一起。
Portworx Deamonset
這一步,我們將Portworx作為Deamonset運(yùn)行,這表示一個(gè)Portworx容器將在集群中的每個(gè)節(jié)點(diǎn)上運(yùn)行。
創(chuàng)建卷
安裝好了Portworx,我們可以在集群中的任何節(jié)點(diǎn)上進(jìn)行SSH,使用'pxctl' cli并創(chuàng)建卷。
為MySQL數(shù)據(jù)創(chuàng)建一個(gè)復(fù)制卷:
上面的卷名稱為“mysql-disk”,大小為“5GB”,格式為“ext4”,在集群中有2個(gè)副本(故障轉(zhuǎn)移時(shí)我們需要復(fù)制)。
然后為WordPress PHP容器創(chuàng)建“multi-writer”磁盤。它將有和MySQL磁盤相同的屬性,并帶有額外的共享標(biāo)志。它允許卷連接到多個(gè)容器,這便是我們需要的橫向擴(kuò)展WordPress容器:
卷通過`pxctl`的`list`命令創(chuàng)建:
啟動(dòng)MySQL
有一個(gè)磁盤ID,用它來運(yùn)行MySQL pod:
以下是YAML的內(nèi)容,使用`envsubst`來替換新創(chuàng)建的磁盤的ID:
啟動(dòng)WordPress
最后運(yùn)行WordPress PHP pod:
與MySQL pod一樣,用`envsubst`替換新創(chuàng)建的磁盤的ID:
發(fā)散
注意我們是如何在Kubernetes“部署”中實(shí)際部署WordPress和MySQL的。這就表示我們可以輕松地縮放每個(gè)部署運(yùn)行的容器數(shù)量。
單純地增加MySQL部署的規(guī)模是沒有意義的。如前所述,我們將為其使用狀態(tài)設(shè)置和主/從概念。
但我們可使用“kubectl規(guī)模部署”來增加WordPress容器的數(shù)量,因?yàn)樗鼈冋谑褂肞ortworx的“共享”卷。
以下是將WordPress容器增加到10個(gè)的命令行:
總結(jié)
本文展示了如何在AWS Kubernetes集群上安裝和操作WordPress和Portworx。如其他文章所示的一樣,使用Portworx還有許多優(yōu)點(diǎn),如EBS 卷被卡在附加狀態(tài)時(shí)。
一起使用Kops和Portworx的另一個(gè)好處是能與AWS的Auto Scaling Groups集成。這預(yù)示著Portworx能管理底層EBS池,并且能在升級/縮小/升級操作之后重用以前的EBS卷。
譯者簡介
Ghostcloud(中文名:精靈云)坐落于成都天府軟件園,是成都高新區(qū)重點(diǎn)扶持企業(yè),國內(nèi)首批從事容器虛擬化研發(fā)的企業(yè),是西南地區(qū)唯一一家基于Docker的云計(jì)算服務(wù)商,為企業(yè)級行業(yè)客戶提供針對互聯(lián)網(wǎng)化、私有云管理平臺(tái)、大數(shù)據(jù)業(yè)務(wù)基礎(chǔ)架構(gòu)的平臺(tái)服務(wù)。
Ghostcloud因容器技術(shù)而生,以最新容器技術(shù)Docker為基礎(chǔ),為適應(yīng)不同行業(yè)客戶需求,全自主研發(fā)了一套調(diào)度引擎框架Newben,且全方位適配Kubernetes主流開源調(diào)度引擎,也是國內(nèi)率先實(shí)現(xiàn)雙調(diào)度引擎的企業(yè),是一流的企業(yè)級容器云服務(wù)專家。Ghostcloud推出了企業(yè)級容器云PaaS/CaaS平臺(tái),命名為EcOS(EnterpriseContainer Operation System)。Ghostcloud將EcOS平臺(tái)與微服務(wù)/DevOps相融合,運(yùn)用至企業(yè)IT系統(tǒng)的全生命周期的開發(fā)、測試、運(yùn)維及發(fā)布流程中,致力于為多個(gè)領(lǐng)域企業(yè)向“互聯(lián)網(wǎng)+”轉(zhuǎn)型提供針對互聯(lián)網(wǎng)化、私有云管理平臺(tái)、大數(shù)據(jù)業(yè)務(wù)基礎(chǔ)架構(gòu)的平臺(tái)服務(wù),幫助企業(yè)級客戶降低成本、提升效率、簡化運(yùn)維及產(chǎn)品部署,并提升系統(tǒng)的可靠性和安全性。
聯(lián)系客服