MySQL Operator容器化方案解讀
與記憶體庫的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,如有侵權,請聯絡管理員刪除。
相關文章
- 容器化 | 在 K8s 上部署 RadonDB MySQL Operator 和叢集K8SMySql
- 解讀js模組化方案modJSJS
- 精讀《pipe operator for JavaScript》JavaScript
- 容器化 FRP 使用方案FRP
- 容器化redis高可用方案Redis
- Spring Boot 容器化踩坑與解決方案(1)Spring Boot
- mysql 優化方案MySql優化
- Operator-sdk 在 KaiwuDB 容器雲中的使用AI
- 多雲容器編排 Karmada-Operator 實踐
- MySQL 效能優化方案MySql優化
- NET Core+MySql+Nginx 容器化部署MySqlNginx
- .NET Core+MySql+Nginx 容器化部署MySqlNginx
- 容器安全公開課 | 揭秘容器黑產,探討容器安全解決方案
- MySQL 字串索引優化方案MySql字串索引優化
- MySQL最佳化GROUP BY方案MySql
- MySQL大表優化方案MySql優化
- 容器化 | 在 KubeSphere 中部署 MySQL 叢集MySql
- 學習記錄:MySQL碎片化的原因及解決方案?MySql
- Mysql讀寫分離方案-MySQL Proxy環境部署記錄MySql
- mysql壓縮解決方案MySql
- MySQL大表最佳化方案MySql
- Docker最全教程之MySQL容器化 (二十四)DockerMySql
- 深度解讀GaussDB(for MySQL)與MySQL的COUNT查詢並行最佳化策略MySql並行
- Prometheus Operator - 每天5分鐘玩轉 Docker 容器技術(177)PrometheusDocker
- Dubbo原始碼解讀-Dubbo的容器啟動原始碼
- 重讀 Swift 之二:Operator Declaration(運算子過載)Swift
- Portworx – 您的雲原生容器儲存解決方案
- SpringBoot使用外部Web容器的解決方案Spring BootWeb
- 解讀MySQL 8.0資料字典的初始化與啟動MySql
- 容器化|自建 MySQL 叢集遷移到 KubernetesMySql
- mysql cpu 100% 滿 優化方案MySql優化
- MySQL臨時表的優化方案MySql優化
- MySQL 大表優化方案探討MySql優化
- mysql優化之讀寫分離MySql優化
- 多容器動態化方案在遊戲SDK中的實踐遊戲
- 全鏈路風控解決方案深度解讀
- Mysql讀寫分離方案-Amoeba環境部署記錄MySql
- Docker容器啟動時初始化Mysql資料庫DockerMySql資料庫