MySQL Operator容器化方案解讀

danny_2018發表於2022-11-29

與記憶體庫的Redis資料庫比起來,容器化MySQL有著更多的需求,主要有以下三個方面:

MySQL對儲存的要求很高

MySQL Pod的IP需要固定

MySQL需要支援同城災備

MySQL容器化拓撲結構

固定MySQL Pod IP可以在K8S上使用Calico網路外掛實現。儲存方面使用高效能分散式儲存或者直接掛載本地盤都可達到要求,這些不在本文做重點介紹。

MySQL容器化有同城災備需求。對於MySQL部分,我們使用MySQL MGR單主模式,將MGR節點分散在本地/同城執行,正常情況下主節點執行在本地,災備切換時將主節點切換至同城。對於K8S叢集部分,我行K8S叢集沒有進行跨本地/同城部署,所以MySQL MGR節點會分佈在兩個K8S叢集執行。對於MySQL服務暴露部分,在每個K8S叢集上為每個MGR叢集各建立Read、Write Service,透過K8S Service機制對外暴露MySQL 服務。整體拓撲結構如下所示:

MySQL Operator功能邏輯

MySQL Operator的功能包括MGR叢集建立、叢集維護、CPU記憶體資源升級、MGR節點擴縮容、節點遷移等。由於MGR叢集跨K8S部署,所以在Operator的邏輯上不能只管控本地資源,還需關注在同城執行的那一部分MGR節點的情況。

MGR叢集建立

在MySQL MGR叢集CR資源定義中包含以下三個欄位:

flag欄位為primary標識MGR的主應該在本地

ipList定義部署在本地K8S叢集的MGR Pod列表,以及具體的Pod IP和所在K8S節點

remoteList定義部署在同城K8S叢集的MGR Pod列表;本地Operator會透過該欄位中的IP地址嘗試連線同城MGR節點,以判斷同城MGR節點是否連通以及角色是否正常。

在MGR叢集建立流程中,兩邊Operator均需確定ipList和remoteList中的Pod IP地址均可連通,確定MGR叢集所屬的Pod均已啟動後才能執行MGR叢集的建立工作。建立的時候,flag為primary側的Operator會在本K8S叢集中選出一個MGR Pod進行主節點的引導啟動,其餘本地Pod和flag為standby側叢集的Pod均啟動為從節點。

MGR叢集維護

叢集維護功能是為了保證MGR叢集按照預期執行,整合了各種異常場景下處理邏輯,主要包括以下幾個部分:

保證Service、PVC、Configmap等需要的K8S資源按照預期建立

保證MySQL Pod數量和執行狀態正常

保證MySQL Pod的角色標籤和實際的MGR角色一致

維持Pod內的MySQL MGR程式啟動

判斷MGR主節點是否切換,並進行切主後操作等

除了Operator的叢集維護功能,另一個保證服務持續可用的是MySQL自身的MGR機制。在整體設計中,我們對Operator和MGR兩種機制管控範圍的做了清晰的邊界劃分:即Operator只保證MGR執行所需的環境正常,如節點數、程式啟動狀態、配置等正常,但涉及到主節點切換等MGR機制內部的事情,Operator只做觀察並把最新狀態反映到CR的Status欄位中而不去做干預。在Operator的設計中,只有三種情況會進行主節點干預:一是叢集新建的情況;二是在確認所有叢集節點都為從節點的情況,選出gtid最大的節點啟動為主;三是收到災備切換的請求,會將主切到flag=primary的一側。

MGR叢集運維操作

Operator支援對MGR叢集進行一些常規的運維操作,包括本地/同城節點的上線、下線,Pod 記憶體、CPU資源的擴縮容、Pod使用映象的更換以及MySQL的配置檔案更新等。Operator最重要的任務是維持叢集正常執行,對於這些運維操作在設計時採用了一個穩妥的方案:

所有的運維操作必須基於維護流程判斷叢集狀態正常(有且僅有一個主節點,其餘節點均執行正常且為從節點)的情況下才可進行

在狀態轉換流程中設定操作的優先順序,先進行優先順序高的操作,如新加節點的優先順序高於刪除節點的優先順序

如果涉及到類似於多個節點新增的批次操作,Operator會將批次操作拆分為單個操作的順序執行,每步操作完成後確認叢集狀態正常才能繼續下一步操作

整體流程如下圖所示:

MGR叢集災備切換

災備切換包含兩部分:第一部分是MGR叢集的主節點切換到同城叢集;第二部分是客戶端網路流量打到同城叢集。對於第二部分的實現有手動改客戶端訪問地址、更改DNS指向、使用代理轉發等多種方法,本文不做討論。對於第一部分,Operator做了一個便捷化的實現,在檢測到flag欄位由standy變為primary的時候會主動發起一次切主操作,試圖將主切換到現在的primary這邊。要注意的是,雖然flag欄位標識主節點應該在哪一邊,但是Operator不對該預期做強制性保證,MGR內部機制或者手工將主切換到flag=standby一邊也是允許的,Operator只會標識出主位置不符合預期,不會做強制性回切。

來自 “ twt企業IT社群 ”, 原文作者:孟玉立;原文連結:https://mp.weixin.qq.com/s/lumKHLx5gxOfYwGm-umq2g,如有侵權,請聯絡管理員刪除。

相關文章