編者按:本文轉載自“才云 Caicloud”,作者 Josh Berkus。
目前,幾乎所有關于容器和微服務的談論都跟“無狀態”的應用掛鉤。這完全可以理解,因為無狀態應用程序更簡單。而且容器和編排技術已經成熟到能夠承工作負載的程度:即有狀態的應用。
Kubernetes 是一個用于自動部署、擴展和管理容器化應用程序的開源系統,我之前做過兩次關于 Kubernetes、數據庫以及容器的演講。
什么是“無狀態”應用?
無狀態服務,即 Web 服務器、代理和應用程序代碼這樣的應用程序,它們可以處理數據但不進行存儲。編排過程中,開發者比較喜歡使用它們,因為它們易于部署且易于擴展。如果流量上升,則只需添加更多的負載平衡。更重要的是,它們是“不變動的”;上游容器鏡像和基礎架構中正在運行的容器其實幾乎沒有區別。這意味著它們可以隨時被替代,而且容器實例切換過程中幾乎不需要耗費“切換成本”。
什么是有狀態應用?
有狀態的服務,即路由器、CDN(內容傳送網絡)、streaming 服務器和認證服務器。從部署開始,這些容器就開始與上游鏡像不同了,時間越長它們的差異越大。這種差異就被稱為“state(狀態)”。事實上,每個運行的應用程序都至少有一個小狀態(差異),但對于“無狀態”應用程序來說,狀態(差異)很小,而且可以進行快速替換。
對于有狀態的,那就不是這樣的情況了。雖然狀態可以通過狀態節點進行同步或復制,但是這必須通過應用程序專用的一些方法在業務流程系統之外完成??傊苈闊?。
數據庫和有狀態應用程序
當然,鑒于我在 PostgreSQL 工作18年的歷史,我真正關心的有狀態應用程序是交易型數據庫。數據庫對于大多數應用程序堆棧而言至關重要,而且對于狀態支持來說也是一個很好的測試用例,因為它們可以用有效方式進行狀態化,包括:
Storage
Identity
Session
Cluster Role
例如,PostgreSQL 需要將數據和交易存儲在每個 PostgreSQL 容器(存儲)持久和特有的文件中。每個容器需要被識別為特定的數據庫節點,我們需要能夠通過名稱或地址將流量路由到它。數據庫客戶端連接或會話也有一個狀態,打破它們需要付出一定的代價,所以我們不想隨意移動數據庫節點。最后,每個數據庫節點在其數據庫集群中都有一個角色,集群角色例如 master、replica、shard 等。這些集群角色將持續存在,直到數據庫特定 event 更改它們為止。
在流行的容器云堆棧上實現這些類型的狀態一直是具有挑戰性的。 Docker 和編排框架將大多數類型的狀態視為發生在容器堆棧之外的狀態,迫使數據庫架構師管理存儲、身份、路由以及很多其他的東西。你沒有辦法將數據庫移動到幫助您的容器。因此,盡管很多網頁應用程序已經容器化,但幾乎沒有數據庫或其他有狀態的應用程序能夠容器化。那么,我們在哪里存儲數據?一般來說,可以使用 Amazon RDS。
使用 Kubernetes StatefulSet 的數據庫
Kubernetes 項目一直致力于一個對象和一組功能,去年稱為 StatefulSet 來處理數據庫和其他狀態服務。開發人員最初以“PetSet”的工作名稱發布了此功能,但是他們進行了更改,然后發布到1.5版本中,并且有了一個更合適的名字:StatefulSet。此時,StatefulSet 實現 Storage 和 Identity 有狀態質量。其他兩個可以使用最小粘合代碼使用 Kubernetes 作為資源實現。換句話說,你不必等待部署協調的容器化數據庫。
現在,你可以在 Kubernetes 上的容器中運行數據庫,但是為什么要這樣做呢?答案與容器無關,但是都與編排的好處有關。
我們期望再現代數據庫平臺中高可用性(HA),希望它能夠脫穎而出,但這光靠數據庫軟件是提供不了的。引入群集,替換故障機器上的數據庫節點,重新路由應用程序流量到遷移的節點,以及其他 HA 注意事項需要大量的代碼和許多數據庫外部以及其內部的實用程序。
這樣的代碼很難寫,因為它需要先實現分布式系統。
像其他業務流程系統一樣,Kubernetes 提供了一個簡單易用的分布式系統。數據庫(如 PostgreSQL和MySQL)如果沒有內置的 HA,很容易變成這樣,已經是 HA 的數據庫(如 Cassandra 和 RethinkDB),那就可以實現全自動。從經驗來說,這是比自己從頭開始做更容易。
我創建了一些例子,展示如何在我的 atomicdb 演示 repo 上使用 StatefulSet 來部署 PostgreSQL。以上這些是為了說明如何使用功能,并非完整的生產部署。 Zalando 是 Patroni 集群管理項目的領導者發布了 Helm Chart,它基于 Kubernetes 的群集 PostgreSQL。
(欲了解更多關于作者的演講信息,請點擊“查看原文”)
作者簡介:
Josh Berkus 供職于 RedHat 的 Project Atomic,這個項目需要跟Kubernetes,AtomicHost,Docker,Fedora 以及其它項目近距離接觸。 他之前在 PostgreSQL 核心團隊擁有十幾年工作經驗,為流行的開源數據庫做出貢獻。