如何通過 OpenShfit 運作高可用 MySQL資料庫

Portworx通過RedHat技術認證
我們的文章包括了MySQL on Kubernetes在不同平台不同場景下的情況。相關文章的清單如下:
Running HA MySQL on Amazon Elastic Container Service for Kubernetes (EKS) (
https://portworx.com/ha-mysql-amazon-eks/) Running HA MySQL on Azure Kubernetes Service (AKS) ( https://portworx.com/run-ha-mysql-azure-kubernetes-service/) Running HA MySQL on Google Kubernetes Engine (GKE) ( https://portworx.com/run-ha-mysql-google-kubernetes-engine/) How to Backup and Restore MySQL on Red Hat OpenShift ( https://portworx.com/backup-restore-mysql-red-hat-openshift/) Running HA MySQL on IBM Cloud Kubernetes Service (IKS) ( https://portworx.com/run-ha-mysql-ibm-cloud-kubernetes-service/) Running HA MySQL on Rancher Kubernetes Engine (RKE) ( https://portworx.com/run-ha-mysql-rancher-kubernetes-engine/) Running HA MySQL on IBM Cloud Private ( https://portworx.com/run-ha-mysql-ibm-cloud-private/)OpenShift Container Platform是Red Hat在私有雲/本地部署的應用部署平台。許多使用者使用OpenShift來運作無狀态應用。但是通過OpenShift來運作類似資料庫的有狀态應用仍然是一個很大的挑戰。Red Hat提供了一系列的企業級存儲解決方案。但不論是GlusterFS (RedHat稱之為容器原生存儲),還是Ceph,都并不是被設計來運作高性能/低延遲資料庫的。GlusterFS和Ceph是很不錯的項目,但對于運作資料庫來說都存在較多問題。這些問題使得OpenShift的使用者不得不放棄通過OpenShift來運作資料服務。
但這些問題實際上是可以解決的。本篇文章中,我們将通過使用開源資料庫MySQL為例,來示範,如何通過OpenShift來運作資料庫。
在Openshift上運作資料庫的關鍵,需要一個專為高性能資料庫或其他有狀态應用設計的,雲原生存儲解決方案。
Portworx是根據DevOps的原則,專為在容器中運作有狀态應用和生産系統設計的解決方案。使用Portworx,使用者可以使用任何容器排程器,在任何基礎架構上,管理任何資料庫或有狀态服務。包括:
OpenShift (
https://docs.portworx.com/scheduler/kubernetes/openshift-install.html)
Kubernetes (
https://portworx.com/use-case/kubernetes-storage/) Mesosphere DC/OS ( https://portworx.com/use-case/persistent-storage-dcos/) Docker Swarm ( https://portworx.com/use-case/docker-persistent-storage/)OpenShift釋出的3.7版本支援外部的卷插件,進而使用者能夠使用Portworx的企業級存儲功能來加密、快照、備份、確定高可用,來保護關鍵應用資料庫。
在本篇文章中,我們會示範如何通過5個步驟,在OpenShift上運作高可用的MySQL資料庫。
- 為OpenShift安裝外部卷插件,這樣使用者就可以使用快照、備份、高可用、以及加密功能
- 建立一個Kubernetes存儲類,含有複制因子=2,IO優先級=High,快照間隔=60。這些值也可以根據使用者實際需要來配置
- 在OpenShift裡建立一個MySQL模闆:導入JSON,配置OpenShift MySQL持久卷,包含記憶體上限、MySQL的參數、以及存儲類的大小
- 從這個模闆建立一個MySQL 持久卷,部署OpenShift的Pods來使用這個卷
- 驗證MySQL高可用:通過關閉節點,删除Pod來看MySQL已經被自動重新排程了
如果你希望了解更多如何在OpenShift上運作高性能資料庫,可以檢視Portworx網站上的相關文檔和視訊。
在OpenShift 3.7上安裝Portworx
安裝Portworx
Portworx在OpenShift上作為一個Daemonset被安裝。通路
https://install.portworx.com來建立你的px-spec.yaml檔案,并且運作oc apply –f px-spec.yaml。
在OpenShift上安裝Portworx的詳細操作文檔在這裡:(
一旦Portworx安裝完成,我們就繼續建立一個存儲類,用來為我們的MySQL執行個體做卷的動态部署。
下面是一個存儲類的例子,我們用它來建立我們的卷,
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: px-demo-sc
provisioner: kubernetes.io/portworx-volume
parameters:
repl: “2”
priority_io: “high”
snap_interval: “60”
在這個存儲類例子裡,我們會建立一個叫做px-demo-sc的存儲類,并且會配置一些Portworx的參數,
Replication –
repl: “2”
我們可以配置,在叢集裡我們需要多少份卷的副本。Portworx支援的複制因子包括1/2/3。配置複制因子為2或者3,可以確定Portworx在叢集中同步地把卷複制到2或3個節點裡,同時確定資料的持久性。如果某個節點死掉,Portworx和OpenShift會把Pod重新部署到叢集中存在Portworx卷的另外一個Worker節點上。
IO Priority –
priority_io: “high”
Portworx允許你建立3個存儲池:High、Medium和Low。你可以使用具備SSD、HDD和SATA存儲的伺服器。SSD是High,HDD是Medium,SATA是Low。如果是在雲環境中也可以通過配置不同的IOPS來完成。當選擇High的存儲類,Portworx會把Pod排程到具備SSD存儲的伺服器上。
Snapshots –
snap_interval: “60”
Porworx會每60分鐘建立一個快照。這些快照可以被用來復原資料庫,測試更新,以及做研發測試。
一個完整的存儲類參數說明在這裡:(
https://docs.portworx.com/scheduler/kubernetes/dynamic-provisioning.html注意:Portworx也支援備份你的容器卷到雲中或者本地的對象存儲裡。
(
https://docs.portworx.com/cloud/backups.html)你可以建立備份的排程。這些備份可以被加密和恢複到同一個或者不同的Portworx叢集裡。
在OpenShift裡建立一個MySQL模闆
Portworx已經建立了一個樣例MySQL OpenShift模闆,參見(
https://2.1.docs.portworx.com/samples/k8s/px-mysql-openshift.json?raw=true在OpenShift操作面闆裡選擇導入YAML/JSON,copy和粘貼PortworxMySQL 模闆,點選建立。
這将會出現Portworx MySQL (持久)模闆配置界面。你可以選擇記憶體上限以及其他MySQL參數,或者使用系統預設的參數。你也可以設定卷的大小,以及需要使用的存儲類。確定你使用的存儲類與之前建立的存儲類相比對。
進入項目,通過點選Storage驗證PVC已經被建立并被綁定。
容器需要1到2分鐘來出現,容器開始運作後,驗證存儲已經連上了: 點選Application、Pods;選擇MySQLPod,在終端裡輸入df –H,你可以看到/var/lib/mysql/data目錄已經被mounted到Portworx支援的PX-Volume裡。
登入資料庫并且建立一張表。
确認Pod運作在哪個節點上,
oc get pods -n mysql-openshift -o wide
NAME READY STATUS RESTARTS AGE IP NODE
mysql-1-f4xlw 1/1 Running 0 1h 10.130.0.34 70-0-107-155.pools.spcsdns.net
關閉(Cordon off)正在運作Pod的節點,
oc adm cordon 70-0-107-155.pools.spcsdns.net
驗證節點上的排程已經被disable了,
oc get nodes
NAME STATUS AGE VERSION
70-0-107-155.pools.spcsdns.net Ready,SchedulingDisabled 23d v1.7.6+a08f5eeb62
删除MySQL Pod,
oc delete pod mysql-1-q88qq -n mysql-openshift
pod “mysql-1-q88qq” deleted
驗證Pod已經被重新排程到叢集上的另一個節點裡。
oc get pods -n mysql-openshift -o wide
NAME READY STATUS RESTARTS AGE IP NODE
mysql-1-j97tw 1/1 Running 0 1m 10.128.0.63 70-0-40-193.pools.spcsdns.net
回到OpenShift控制台,選擇你的項目,到Application, Pods,點選新的MySQL Pod, 然後是終端,驗證資料庫表還在。
總結來看,我們通過5個步驟,在OpenShift中運作了高可用的MySQL資料庫。
- 在OpenShift裡建立一個MySQL模闆:導入JSON,配置OpenShiftMySQL持久卷,包含記憶體上限、MySQL的參數、以及存儲類的大小