摘要:和簡介作為一個開源的分布式數據庫產品,具有多副本強一致性的同時能夠根據業務需求非常方便的進行彈性伸縮,并且擴縮容期間對上層業務無感知。
TiDB Operator 是 TiDB 在 Kubernetes 平臺上的自動化部署運維工具。目前,TiDB Operator 已正式開源(pingcap/tidb-operator)。借助 TiDB Operator,TiDB 可以無縫運行在公有云廠商提供的 Kubernetes 平臺上,讓 TiDB 成為真正的 Cloud-Native 數據庫。
要了解 TiDB Operator,首先需要對 TiDB 和 Kubernetes 有一定了解,相信長期以來一直關注 TiDB 的同學可能對 TiDB 已經比較熟悉了。本文將首先簡單介紹一下 TiDB 和 Kubernetes,聊一聊為什么我們要做 TiDB Operator,然后講講如何快速體驗 TiDB Operator,以及如何參與到 TiDB Operator 項目中來成為 Contributor。
TiDB 和 Kubernetes 簡介TiDB 作為一個開源的分布式數據庫產品,具有多副本強一致性的同時能夠根據業務需求非常方便的進行彈性伸縮,并且擴縮容期間對上層業務無感知。TiDB 包括三大核心組件:TiDB/TiKV/PD。?
TiDB Server:主要負責 SQL 的解析器和優化器,它相當于計算執行層,同時也負責客戶端接入和交互。
TiKV Server:是一套分布式的 Key-Value 存儲引擎,它承擔整個數據庫的存儲層,數據的水平擴展和多副本高可用特性都是在這一層實現。
PD Server:相當于分布式數據庫的大腦,一方面負責收集和維護數據在各個 TiKV 節點的分布情況,另一方面 PD 承擔調度器的角色,根據數據分布狀況以及各個存儲節點的負載來采取合適的調度策略,維持整個系統的平衡與穩定。
上面的這三個組件,每個角色都是一個多節點組成的集群,所以最終 TiDB 的架構看起來是這樣的。
Kubernetes 最早是作為一個純粹的容器編排系統而誕生的,用戶部署好 Kubernetes 集群之后,直接使用其內置的各種功能部署應用服務。?
由于這個 PaaS 平臺使用起來非常便利,吸引了很多用戶,不同用戶也提出了各種不同的需求。有些特性需求 Kubernetes 直接在其核心代碼里面實現了,但是有些特性并不適合合并到主干分支。
為滿足這類需求,Kubernetes 開放出一些 API 供用戶自己擴展,實現自己的需求。當前 Kubernetes 內部的 API 變得越來越開放,使其更像是一個跑在云上的操作系統。用戶可以把它當作一套云的 SDK 或 Framework 來使用,而且可以很方便地開發組件來擴展滿足自己的業務需求。對有狀態服務的支持就是一個很有代表性的例子。
為什么我們要做 TiDB Operator第一,使用傳統的自動化工具帶來了很高的部署和運維成本。TiDB 的分層架構對于分布式系統是比較常見的,各個組件都可以根據業務需求獨立水平伸縮,并且 TiKV 和 TiDB 都可以獨立使用。比如,在 TiKV 之上可以構建兼容 Redis 協議的 KV 數據庫,而 TiDB 也可以對接 LevelDB 這樣的 KV 存儲引擎。
但是,這種多組件的分布式系統增加了手工部署和運維的成本。一些傳統的自動化部署和運維工具如 Puppet/Chef/SaltStack/Ansible,由于缺乏全局狀態管理,不能及時對各種異常情況做自動故障轉移,并且很難發揮分布式系統的彈性伸縮能力。其中有些還需要寫大量的 DSL 甚至與 Shell 腳本一起混合使用,可移植性較差,維護成本比較高。
第二,在云時代,容器成為應用分發部署的基本單位,而谷歌基于內部使用數十年的容器編排系統 Borg 經驗推出的開源容器編排系統 Kubernetes 成為當前容器編排技術事實上的標準。如今各大云廠商都開始提供托管的 Kubernetes 集群,部署在 Kubernetes 平臺的應用可以不用綁定在特定云平臺,輕松實現在各種云平臺之間的遷移,其容器化打包和發布方式也解決了對操作系統環境的依賴。
Kubernetes 項目最早期只支持無狀態服務(Stateless Service)的管理。無狀態服務通過 ReplicationController 定義多個副本,由 Kubernetes 調度器來決定在不同節點上啟動多個 Pod,實現負載均衡和故障轉移。對于無狀態服務,多個副本對應的 Pod 是等價的,所以在節點出現故障時,在新節點上啟動一個 Pod 與失效的 Pod 是等價的,不會涉及狀態遷移問題,因而管理非常簡單。?
但是對于有狀態服務(Stateful Service),由于需要將數據持久化到磁盤,使得不同 Pod 之間不能再認為成等價,也就不能再像無狀態服務那樣隨意進行調度遷移。
Kubernetes v1.3 版本提出 PetSet 的概念,用來管理有狀態服務并于 v1.5 將其更名為 StatefulSet。StatefulSet 明確定義一組 Pod 中每個的身份,啟動和升級都按特定順序來操作。另外使用持久化卷存儲(PersistentVolume)來作為存儲數據的載體,當節點失效 Pod 需要遷移時,對應的 PV 也會重新掛載,而 PV 的底層依托于分布式文件系統,所以 Pod 仍然能訪問到之前的數據。同時 Pod 在發生遷移時,其網絡身份例如 IP 地址是會發生變化的,很多分布式系統不能接受這種情況。所以 StatefulSet 在遷移 Pod 時可以通過綁定域名的方式來保證 Pod 在集群中網絡身份不發生變化。
但是由于有狀態服務的特殊性,當節點出現異常時,出于數據安全性考慮,Kubernetes 并不會像無狀態服務那樣自動做故障轉移。盡管網絡存儲能掛載到不同的節點上供其上的 Pod 使用,但是如果出現節點故障時,簡單粗暴地將網絡 PV 掛載到其它節點上是比較危險的。
Kubernetes 判斷節點故障是基于部署在每個節點上的 Kubelet 服務是否能正常上報節點狀態,Kubelet 能否正常工作與用戶應用并沒有必然聯系,在一些特殊情況下,Kubelet 服務進程可能無法正常啟動,但是節點上的業務容器還在運行,將 PV 再掛載到其它節點可能會出現雙寫問題。
為了在 Kubernetes 上部署和管理 TiDB 這種有狀態的服務,我們需要擴展 StatefulSet 的功能。TiDB Operator 正是基于 Kubernetes 內置的 StatefulSet 開發的 TiDB 集群管理和運維工具。
Kubernetes 直到 v1.7 才試驗性引入本地 PV,在這之前只有網絡 PV,TiKV 自身在存儲數據時就是多副本的,網絡 PV 的多副本會增加數據冗余,降低 TiDB 的性能。在這之前我們基于 Kubernetes 內置的 hostPath volume 實現了本地 PV 滿足 TiKV 對磁盤 IO 的要求。官方本地 PV 方案直到最近的 Kubernetes v1.10 才相對穩定地支持調度功能,滿足用戶對本地 PV 的需求。為了降低用戶的使用和管理成本并且擁抱 Kubernetes 開源社區,我們又重新基于官方的本地 PV 方案實現了對數據的管理。
TiDB Operator 原理解析Operator 本質上是 Kubernetes 的控制器(Controller),其核心思想是用戶給定一個 Spec 描述文件,Controller 根據 Spec 的變化,在 Kubernetes 集群中創建對應資源,并且不斷調整資源使其狀態滿足用戶預期的 Spec。
上圖是 TiDB Operator 工作流程原理圖,其中 TidbCluster 是通過 CRD(Custom Resource Definition)擴展的內置資源類型:
用戶通過 Helm 往 Kubernetes API Server 創建或更新 TidbCluster 對象。
TiDB Operator 通過 watch API Server 中的 TidbCluster 對象創建更新或刪除,維護 PD/TiKV/TiDB StatefulSet, Service 和 Deployment 對象更新。
Kubernetes 根據 StatefulSet, Service 和 Deployment 對象創建更新或刪除對應的容器和服務。
在第 2 步中,TiDB Operator 在更新 StatefulSet 等對象時會參考 PD API 給出的集群狀態來做出 TiDB 集群的運維處理。通過 TiDB Operator 和 Kubernetes 的動態調度處理,創建出符合用戶預期的 TiDB 集群。
快速體驗 TiDB OperatorTiDB Operator 需要運行在 Kubernetes v1.10 及以上版本。TiDB Operator 和 TiDB 集群的部署和管理是通過 Kubernetes 平臺上的包管理工具 Helm 實現的。運行 TiDB Operator 前請確保 Helm 已經正確安裝在 Kubernetes 集群里。?
如果沒有 Kubernetes 集群,可以通過 TiDB Operator 提供的腳本快速在本地啟動一個多節點的 Kubernetes 集群:
git clone https://github.com/pingcap/tidb-operator cd tidb-operator NUM_NODES=3 # the default node number is 2 KUBE_REPO_PREFIX=uhub.ucloud.cn/pingcap manifests/local-dind/dind-cluster-v1.10.sh up
等 Kubernetes 集群準備好,就可以通過 Helm 和 Kubectl 安裝部署 TiDB Operator 和 TiDB 集群了。
安裝 TiDB Operator
kubectl apply -f manifests/crd.yaml helm install charts/tidb-operator --name=tidb-operator --namespace=tidb- admin
部署 TiDB 集群
helm install charts/tidb-cluster --name=demo-tidb --namespace=tidb --set clusterName=demo
集群默認使用 local-storage 作為 PD 和 TiKV 的數據存儲,如果想使用其它持久化存儲,需要修改 charts/tidb-cluster/values.yaml 里面的 storageClassName。
參與 TiDB OperatorTiDB Operator 讓 TiDB 成為真正意義上的 Cloud-Native 數據庫,開源只是一個起點,需要 TiDB 社區和 Kubernetes 社區的共同參與。?
大家在使用過程發現 bug 或缺失什么功能,都可以直接在 GitHub 上面提 issue 或 PR,一起參與討論。要想成為 Contributor 具體可以參考 這個文檔。
作者: 鄧栓
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17778.html
摘要:作為一個開源的分布式數據庫產品,具有多副本強一致性的同時能夠根據業務需求非常方便的進行彈性伸縮,并且擴縮容期間對上層業務無感知。另外本身維護了數據多副本,這點和分布式文件系統的多副本是有重復的。 作者:鄧栓來源:細說云計算 作為一款定位在 Cloud-native 的數據庫,現如今 TiDB 在云整合上已取得了階段性的進展。日前 Cloud TiDB 產品在 UCloud 平臺正式開啟...
閱讀 1671·2021-11-23 09:51
閱讀 2688·2021-11-22 09:34
閱讀 1322·2021-10-14 09:43
閱讀 3665·2021-09-08 09:36
閱讀 3211·2019-08-30 12:57
閱讀 2031·2019-08-30 12:44
閱讀 2522·2019-08-29 17:15
閱讀 3019·2019-08-29 16:08