作者:Stephen Thorn
翻譯:劉玲玲
原文:https://www.percona.com/blog/2020/10/08/the-criticality-of-a-kubernetes-operator-for-databases/
一些剛接觸 Kubernetes 的公司嘗試使用傳統(tǒng)環(huán)境中運(yùn)行數(shù)據(jù)庫(kù)的方法在 Kubernetes 中運(yùn)行數(shù)據(jù)庫(kù)。但是,不建議這樣做。因?yàn)檫@可能會(huì)導(dǎo)致數(shù)據(jù)丟失,并且也不建議這樣管理生產(chǎn)工作負(fù)載。為什么這樣做很危險(xiǎn)?又如何解決這個(gè)問(wèn)題?
適合 Kubernetes 的工作負(fù)載
在考慮將數(shù)據(jù)庫(kù)遷移到 Kubernetes 之前,請(qǐng)確保應(yīng)用程序的其余部分是云原生的,并可以使用 Kubernetes。如果您已經(jīng)開(kāi)始對(duì)數(shù)據(jù)庫(kù)進(jìn)行垂直彈性伸縮和水平彈性伸縮,并需要編排數(shù)據(jù)庫(kù)來(lái)控制成本,將其遷移至 Kubernetes 上就是個(gè)不錯(cuò)的選擇。
將數(shù)據(jù)庫(kù)工作負(fù)載轉(zhuǎn)移到 Kubernetes 上有兩個(gè)理想的使用場(chǎng)景:微服務(wù)和統(tǒng)一抽象層。
龐大的單一數(shù)據(jù)集可能會(huì)阻礙發(fā)揮 Kubernetes 的一些優(yōu)點(diǎn):自修復(fù)和高可用性。這可能是一個(gè)問(wèn)題,因?yàn)樵诩尤霐?shù)據(jù)庫(kù)集群時(shí),需要耗費(fèi)時(shí)間將數(shù)據(jù)物理傳輸?shù)叫?Pod 實(shí)例上。如果數(shù)據(jù)集太大,由于物理限制,這個(gè)過(guò)程會(huì)很慢,并影響性能和數(shù)據(jù)庫(kù)的可用性。而微服務(wù)就非常合適,因?yàn)樗臄?shù)據(jù)集相對(duì)較小,使得 Kubernetes 能很好地進(jìn)行自動(dòng)化處理。
希望充分利用云原生應(yīng)用程序和數(shù)據(jù)庫(kù)的公司也非常適合 Kubernetes。如果想利用統(tǒng)一抽象層在任何地方部署和運(yùn)行數(shù)據(jù)庫(kù),Kubernetes 是一個(gè)很好的選擇。可以將數(shù)據(jù)庫(kù)移動(dòng)到任何運(yùn)行著 Kubernetes 的地方。
我們對(duì)大型非分片數(shù)據(jù)集以及 Kubernetes 在處理這些數(shù)據(jù)集時(shí)的局限性進(jìn)行了討論,但我們還應(yīng)該看看什么樣的工作負(fù)載更適合傳統(tǒng)平臺(tái)。對(duì)吞吐量比較敏感的應(yīng)用程序在 Kubernetes 上表現(xiàn)可能沒(méi)有那么好,或者不是很劃算。Kubernetes 基本是為容器編排而設(shè)計(jì)的,而不是為需要極低延遲的高性能數(shù)據(jù)庫(kù)而設(shè)計(jì)的。也許這能夠?qū)崿F(xiàn),但代價(jià)是什么呢?對(duì)于高性能的分布式數(shù)據(jù)庫(kù)也同樣如此。
如何看待 Pod?
Pets 和 Cattle 是 DevOps 中的一對(duì)概念。Pets 表示在出現(xiàn)問(wèn)題時(shí)需要關(guān)注單個(gè)服務(wù)器的部署方式,Cattle 表示在出現(xiàn)問(wèn)題時(shí)用副本替換服務(wù)器的能力。在 Kubernetes 的運(yùn)作方式中,當(dāng)出現(xiàn)應(yīng)用程序無(wú)法控制的因素時(shí),可以在任何時(shí)候銷(xiāo)毀、創(chuàng)建或移動(dòng) Pod。Kubernetes 使用一個(gè)調(diào)度程序(scheduler),它可以銷(xiāo)毀和重建 Pod,以滿(mǎn)足您的 Kubernetes 集群配置需求。
這對(duì)于無(wú)狀態(tài)應(yīng)用程序非常有用,因?yàn)閼?yīng)用程序中的任何失敗都將導(dǎo)致包含應(yīng)用程序的 Pod 被銷(xiāo)毀和重新創(chuàng)建,而不需要人工交互,并極大地加快了問(wèn)題的解決。這對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō)并不理想,因?yàn)槲覀儾幌M麛?shù)據(jù)庫(kù)突然停止工作,并造成數(shù)據(jù)丟失或損壞。Kubernetes 可以使用 StatefulSet 提供持久標(biāo)識(shí)符來(lái)幫助解決這個(gè)問(wèn)題。這有利于管理有狀態(tài)工作負(fù)載,但是要如何發(fā)揮高可用性和利用 Kubernetes 的自動(dòng)化優(yōu)勢(shì)呢?
如何看待數(shù)據(jù)庫(kù)?
從設(shè)計(jì)上講,數(shù)據(jù)庫(kù)需要保持其身份、信息,最重要的是,數(shù)據(jù)在任何時(shí)候都是安全和可訪問(wèn)的。數(shù)據(jù)庫(kù)是應(yīng)用程序的支柱,因?yàn)樗鼈兪菓?yīng)用程序正常運(yùn)行所依賴(lài)的真實(shí)數(shù)據(jù)來(lái)源。數(shù)據(jù)庫(kù)操作中的任何錯(cuò)誤都將迅速導(dǎo)致應(yīng)用程序無(wú)法運(yùn)行。簡(jiǎn)單來(lái)說(shuō),數(shù)據(jù)庫(kù)很重要。
我們?nèi)绾卧?Kubernetes 中安全地運(yùn)行數(shù)據(jù)庫(kù),并確保數(shù)據(jù)庫(kù)部署是高可用的?
通過(guò)使用 StatefulSet 和持久卷(Persistent Volume),可以保持?jǐn)?shù)據(jù)的完整性,但是我們還需要另外的工具來(lái)承擔(dān)數(shù)據(jù)庫(kù)管理任務(wù),例如確保故障轉(zhuǎn)移、恢復(fù)數(shù)據(jù)庫(kù)成員、重新加入高可用架構(gòu)以及其他特定技術(shù)功能。幸運(yùn)的是,Kubernetes 是可擴(kuò)展的,并且擁有 Operator,用于自動(dòng)執(zhí)行管理服務(wù)的關(guān)鍵任務(wù)。
自動(dòng)化,自動(dòng)化,自動(dòng)化
我們了解了在 Kubernetes 中安全運(yùn)行數(shù)據(jù)庫(kù)的復(fù)雜性,以及一些用來(lái)幫助彌合自動(dòng)化和傳統(tǒng)人工在功能之間差距的概念。在一些數(shù)據(jù)庫(kù) Operator 的幫助下,我們可以按照預(yù)期的方式安全地運(yùn)行數(shù)據(jù)庫(kù)。這些 Operator 能夠?qū)⒁恍┩ǔS蓴?shù)據(jù)庫(kù)管理員完成的任務(wù)自動(dòng)化執(zhí)行,例如:
- 自動(dòng)部署,嚴(yán)格的一致性,無(wú)單點(diǎn)故障
- 自動(dòng)伸縮,通過(guò)更改 size 參數(shù)添加或刪除集群或 ReplicaSet 成員
- 自動(dòng)備份和恢復(fù)
- 自動(dòng)修復(fù),從單個(gè)集群或 ReplicaSet 成員的故障中自動(dòng)恢復(fù)
- 自動(dòng)管理密碼輪換系統(tǒng)用戶(hù)
- 簡(jiǎn)化更新
總結(jié)
由于運(yùn)行數(shù)據(jù)庫(kù)環(huán)境的復(fù)雜性和對(duì)高可用的要求,以及動(dòng)態(tài) Kubernetes 環(huán)境帶來(lái)的風(fēng)險(xiǎn),強(qiáng)烈建議在 Kubernetes 中部署數(shù)據(jù)庫(kù)時(shí),使用 Operator 來(lái)實(shí)現(xiàn)。
歡迎使用 RadonDB MySQL Kubernetes 一款高可用 MySQL 集群 Operator!