數(shù)據(jù)庫如何在 Kubernetes 上運(yùn)行贡蓖?如果可以曹鸠,哪些類型的數(shù)據(jù)庫和數(shù)據(jù)最適合使用 K8s?讓我們一起來看看斥铺。
Kubernetes 是用于自動(dòng)部署彻桃、擴(kuò)展和管理容器化應(yīng)用程序的一個(gè)開源的容器編排解決方案。盡管 Kubernetes 最初是為無狀態(tài)應(yīng)用程序設(shè)計(jì)的仅父,但隨著有狀態(tài)工作負(fù)載的日益流行叛薯,Kubernetes 也可以于管理有狀態(tài)應(yīng)用程序。
通常情況下笙纤,容器是無狀態(tài)的耗溜,如果容器崩潰或需要重啟,容器中的數(shù)據(jù)肯定會丟失省容。作為一個(gè)容器編排器抖拴,Kubernetes 會保持定期重啟并在節(jié)點(diǎn)間移動(dòng)容器。無論 Kubernetes 對運(yùn)行應(yīng)用程序的容器做了什么,這對于需要保存數(shù)據(jù)的有狀態(tài)工作負(fù)載來說都是一個(gè)重要的問題阿宅。
眾所周知候衍,數(shù)據(jù)庫服務(wù)器是一個(gè)有狀態(tài)的應(yīng)用程序。
那數(shù)據(jù)庫如何在 Kubernetes 上運(yùn)行洒放?Kubernetes 是否有機(jī)制來管理此類應(yīng)用程序蛉鹿?如果是這樣,什么類型的數(shù)據(jù)庫和數(shù)據(jù)最適合使用它往湿?
在這篇文章中妖异,我們將找到答案。
運(yùn)行數(shù)據(jù)庫的不同方式
以企業(yè)中運(yùn)行數(shù)據(jù)庫服務(wù)器的不同方式為例分為:
- 本地自有數(shù)據(jù)庫:目前許多公司仍然選擇使用虛擬機(jī)在本地或云上托管數(shù)據(jù)庫服務(wù)器领追。企業(yè)負(fù)責(zé)設(shè)置數(shù)據(jù)庫服務(wù)器他膳、設(shè)置其安全性、安裝補(bǔ)丁绒窑、升級棕孙、配置存儲、提供高可用性些膨、擴(kuò)展蟀俊、備份以及執(zhí)行其他的數(shù)據(jù)庫管理員操作。這是手動(dòng)程度最高的方式傀蓉,但這種方式可以完全控制數(shù)據(jù)庫和數(shù)據(jù)欧漱。
- 云上托管數(shù)據(jù)庫:大多數(shù)現(xiàn)代企業(yè)會選擇 Amazon RDS职抡、Azure 數(shù)據(jù)庫葬燎、谷歌云數(shù)據(jù)庫 或 Instaclustr 等在云上部署和擴(kuò)展數(shù)據(jù)庫服務(wù)器更容易的解決方案。供應(yīng)商負(fù)責(zé)存儲缚甩、計(jì)算谱净、網(wǎng)絡(luò)帶寬、安裝擅威、升級和高可用性等壕探。作為消費(fèi)者的企業(yè)只需將數(shù)據(jù)庫托管在供應(yīng)商提供的一個(gè)實(shí)例上,該實(shí)例運(yùn)行你選擇的數(shù)據(jù)庫引擎(如 SQL 或 NoSQL)郊丛。
- Kubernetes 托管數(shù)據(jù)庫:該方式是以上兩種方式的混合體李请。你可以在本地或云端運(yùn)行 Kubernetes 或者使用托管服務(wù)。通過這種方法厉熟,你可以利用 Kubernetes 的許多優(yōu)勢导盅,如自動(dòng)調(diào)度、自修復(fù)或水平伸縮揍瑟。但數(shù)據(jù)庫的使用(如性能調(diào)優(yōu)白翻、備份和恢復(fù))仍需要你注意,并且可能會由于一些容器化特點(diǎn)而略有不同绢片。
持久性存儲和 K8s 的其他特性
盡管開發(fā) Kubernetes 的目的是管理不需要數(shù)據(jù)持久性的容器化應(yīng)用程序滤馍,但它現(xiàn)在也提供了管理有狀態(tài)應(yīng)用程序的解決方案岛琼。持久卷( Persistent volumes 簡稱 PV)[1] 提供了一個(gè) API,允許 Kubernetes 管理員管理卷[2]巢株,它與更多存儲種類[3] 一起提供了一種安全而抽象的方式來存儲和管理數(shù)據(jù)槐瑞。
然而,云是不可預(yù)測的阁苞,Kubernetes 經(jīng)常需要重啟和重新構(gòu)建 pods随珠。因此,持久卷很難在節(jié)點(diǎn)間移動(dòng)數(shù)據(jù)猬错,并同時(shí)確保它們連接到正確的容器窗看。更復(fù)雜的是,一些數(shù)據(jù)庫需要運(yùn)行在多節(jié)點(diǎn)集群配置中倦炒。
Kubernetes 1.5 版本[4] 中引入了一些設(shè)計(jì)來幫助解決這些問題显沈。StatefulSets[5] 確保 pods 基于相同的容器規(guī)范,即使它們被移動(dòng)到另一個(gè)節(jié)點(diǎn)也保持唯一的 ID逢唤。通過唯一 ID 將 pods 與持久卷耦合起來拉讯,即使在重新調(diào)度它們時(shí),也可以維護(hù)工作負(fù)載的狀態(tài)鳖藕。DaemonSets[6] 雖然稍微復(fù)雜一些魔慷,但也是在集群的每個(gè)節(jié)點(diǎn)上運(yùn)行工作副本的一種方式。
分布式有狀態(tài)工作負(fù)載通常需要一系列預(yù)定義資源無法處理的復(fù)雜操作著恩。例如院尔,分布式數(shù)據(jù)庫可能需要在數(shù)據(jù)庫節(jié)點(diǎn)(在 Kubernetes 中,是一個(gè) pod)出現(xiàn)故障時(shí)執(zhí)行一組特定的操作喉誊。這類操作的例子可以是選舉領(lǐng)導(dǎo)者邀摆、平衡數(shù)據(jù)等等。
原生 Kubernetes 功能無法真正處理這些情況伍茄,但其自定義資源(Custom resources)[7] 可以提供幫助栋盹。 Custom resources 允許 Kubernetes API 使用領(lǐng)域特定的邏輯進(jìn)行擴(kuò)展,定義新的資源類型和控制器[8]敷矫。Operator 模式[9] 通過幫助開發(fā)自定義解決方案例获,利用自定義資源來管理應(yīng)用程序及其組件。
OSS 框架曹仗,如 kubebuilder[10]榨汤,或 Operator Framework[11],提供了構(gòu)建塊來創(chuàng)建 Operator整葡,如 Postgres Operator[12]件余、MySQL Operator for Kubernetes[13], Elastic Cloud on Kubernetes (ECK)[14],或 K8ssandra[15]。
分布式數(shù)據(jù)庫的特性
大多數(shù)數(shù)據(jù)庫引擎都提供了一種或多種方式來分發(fā)數(shù)據(jù)并使其具有高可用性啼器。當(dāng)選擇要在 Kubernetes 上運(yùn)行數(shù)據(jù)庫時(shí)旬渠,你需要考慮以下特性:
- 復(fù)制:數(shù)據(jù)庫是否支持復(fù)制?如果支持端壳,它支持什么類型的復(fù)制(如:雙向復(fù)制告丢、事務(wù)復(fù)制和快照)?這將有助于提高可靠性损谦、容錯(cuò)性和可訪問性岖免。
- 分片:數(shù)據(jù)庫是否能夠?qū)?shù)據(jù)進(jìn)行分區(qū),并在不同的實(shí)例(即 pod)中保存不同的片段照捡?這可以幫助優(yōu)化冗余和分散負(fù)載颅湘。
- 故障轉(zhuǎn)移:數(shù)據(jù)庫是否能夠從主節(jié)點(diǎn)、讀寫節(jié)點(diǎn)切換到其他只讀節(jié)點(diǎn)并將只讀節(jié)點(diǎn)提升為主節(jié)點(diǎn)栗精?這也將有助于提高可靠性闯参、容錯(cuò)性和可訪問性。
-
可伸縮性:數(shù)據(jù)庫是否具備可伸縮性(向內(nèi)擴(kuò)展和向外擴(kuò)展)悲立?Kubernetes 為水平擴(kuò)展鋪平了道路鹿寨,但是數(shù)據(jù)庫需要根據(jù)需要添加或刪除實(shí)例。這可以幫助處理增加的負(fù)載或在負(fù)載下降時(shí)降低成本薪夕。
具有這些特性的數(shù)據(jù)庫(例如:MySQL脚草、PostgreSQL、ClickHouse原献、Elasticsearch馏慨、MongoDB 或 Cassandra 等)可以更輕松地應(yīng)對異構(gòu)云環(huán)境的不確定性。
數(shù)據(jù)可用性的考慮
由于 pod 和計(jì)算節(jié)點(diǎn)在本質(zhì)上通常是臨時(shí)的嚼贡,因此熏纯,Kubernetes 更適合于某些類型的數(shù)據(jù)。重要的是要了解數(shù)據(jù)的重要性粤策,以及它必須在多大程度上可用。
為了實(shí)現(xiàn)高可用性误窖,一些數(shù)據(jù)庫引擎使用所謂的最終一致性模型叮盘。最終一致性是一種技術(shù),它確保如果給定的數(shù)據(jù)塊沒有新的更新霹俺,所有對它的訪問都將返回最后更新的值柔吼。它假設(shè),在任何時(shí)間點(diǎn)丙唧,不同節(jié)點(diǎn)的數(shù)據(jù)可能存在一些不一致(取決于從哪里讀取它)愈魏,因?yàn)樗诓粩喔拢且坏└峦瓿桑泄?jié)點(diǎn)都將擁有它的相同副本培漏,并且所有客戶端請求都將獲得相同的數(shù)據(jù)溪厘。當(dāng)你在 Kubernetes 中運(yùn)行數(shù)據(jù)庫系統(tǒng)時(shí),需要從業(yè)務(wù)角度來看這是否可接受牌柄。
一些數(shù)據(jù)庫引擎可以處理故障轉(zhuǎn)移(例如畸悬,當(dāng)運(yùn)行數(shù)據(jù)的主副本的 pod 重新調(diào)度或崩潰時(shí)),但備用節(jié)點(diǎn)恢復(fù)并承擔(dān)主要節(jié)點(diǎn)角色可能需要一些時(shí)間珊佣。你需要考慮在這種情況下蹋宦,可以承受多少數(shù)據(jù)不可用,以及是否可以接受使用舊數(shù)據(jù)咒锻。
如你所見冷冗,這完全取決于業(yè)務(wù)需求。處理瞬態(tài)數(shù)據(jù)(如緩存層)惑艇、只讀數(shù)據(jù)(如查找表)或可輕松重建的數(shù)據(jù)(如 API 輸出)的工作負(fù)載時(shí)贾惦,很顯然更適合在 Kubernetes 上。
總結(jié)
作為一種容器編排技術(shù)敦捧,Kubernetes 簡化了許多常見的操作問題须板,例如調(diào)度、自動(dòng)擴(kuò)展或故障轉(zhuǎn)移兢卵。雖然它非常適用于無狀態(tài)工作負(fù)載习瑰,但有狀態(tài)工作負(fù)載(如數(shù)據(jù)庫)還有其他需要解決的問題。我們已經(jīng)看到:
- 持久卷和存儲類提供了一種安全而抽象的方式來管理數(shù)據(jù)秽荤;
- 通過允許將 pod 與持久數(shù)據(jù)綁定甜奄,可以在這些概念的基礎(chǔ)上構(gòu)建 StatefulSet 和 DaemonSet;
- 自定義資源和 Operator 可以幫助為需要數(shù)據(jù)持久性的應(yīng)用程序提供自定義邏輯窃款。
但是课兄,重要的是要考慮對要在 Kubernetes 上運(yùn)行的數(shù)據(jù)庫引擎的可用支持,以及要存儲的數(shù)據(jù)類型和數(shù)據(jù)的可用性要求晨继。在 Kubernetes 中運(yùn)行服務(wù)需要應(yīng)對一定程度的波動(dòng)性烟阐。
因此,Kubernetes 上更適合部署可以處理復(fù)制紊扬、分片和故障轉(zhuǎn)移的數(shù)據(jù)庫蜒茄。同樣,Kubernetes 托管的理想數(shù)據(jù)是可以輕松快速重新生成的數(shù)據(jù)餐屎。歸根結(jié)底檀葛,這將取決于業(yè)務(wù)需要的容錯(cuò)能力。
原文:https://www.containiq.com/post/should-you-run-a-database-on-kubernetes
引用鏈接
1.持久卷:https://www.containiq.com/post/kubernetes-persistent-volumes
2.卷:https://kubernetes.io/docs/concepts/storage/volumes/
3.存儲種類:https://kubernetes.io/docs/concepts/storage/storage-classes/
4.Kubernetes 1.5:https://kubernetes.io/blog/2016/12/kubernetes-1-5-supporting-production-workloads/
5.StatefulSets:https://www.containiq.com/post/kubernetes-statefulsets
6.DaemonSets:https://www.containiq.com/post/using-kubernetes-daemonsets-effectively
7.自定義資源:https://www.containiq.com/post/kubernetes-crds-custom-resource-definitions
8.控制器:https://www.containiq.com/post/kubernetes-controllers
9.Operator 模式:https://kubernetes.io/docs/concepts/extend-kubernetes/operator/
10.kubebuilder:https://github.com/kubernetes-sigs/kubebuilder
11.Operator Framework:https://operatorframework.io/
12.Postgres Operator:https://github.com/zalando/postgres-operator
13.MySQL Operator:https://github.com/mysql/mysql-operator
14.Elastic Cloud on Kubernetes:https://github.com/elastic/cloud-on-k8s
15.K8ssandra:https://k8ssandra.io/