作者:高日耀 資深 MySQL 內核研發
本文源於作者在 KubeSphere & Friends 2021 杭州站 的演講內容《基於 Kubernetes 的新一代 MySQL 高可用架構實現方案》。
本文是 MySQL 容器化系列的第三篇文章,主要介紹 MySQL 容器化 Helm 版本[1] 的設計思路。
Dockerfile 簡介
首先 RadonDB MySQL 一個 Pod 中的容器角色中,一般包含 MySQL、Xenon、slowlog 三個容器。
其中,MySQL 和 Xenon Dockerfile 目錄結構如下所示:
MySQL Dockerfile 解析
啟動 MySQL 主進程前,需要准備數據庫配置、初始化等,這些工作要在最終的 MySQL 運行之前解決。在制作鏡像時,通過配置 MySQL Dockerfile 中 ENTRYPOINT
和 CMD
參數,可提前准備數據庫配置、初始化等進程。
Docker 是分層的,每一條命令都會建一個鏡像層,分層太多會導致快速膨脹。在制作鏡像時,不建議分層太多。
MySQL Dockerfile
文件中命令示例如下:
MySQL mysql-entry.sh
文件中包含啟動命令,其主要執行流程如下:
Xenon Dockerfile 解析
Xenon Dockerfile 比較簡單,跟 MySQL Dockerfile 流程類似。
Xenon Dockerfile
命令示例如下:
xenon-entry.sh
主要功能:
- 生成 Xenon 配置文件,在 Xenon 啟動的時候調用
- ping host
name 生成及環境變量
name 生成
首先我們看下 chart 目錄下功能文件列表,chart 下包含的文件如下圖所示:
其中,_helpers.tpl
常需引用 Chart.yaml
和 values.yaml
中定義的變量,繼而實現如下能力:
- 生成 app 名字:helm install release <版本名,如 emo> <項目名,如radondb-mysql>
- 生成
serviceAccountName
名字。- 生成 chart 名字和版本。
通過命令 helm get all demo
,可查看 demo 中所有信息。查看 service 部分 name 示例如下:
104 # Source: radondb-mysql/templates/serviceaccount.yaml
105 apiVersion: v1
106 kind: ServiceAccount
107 metadata:
108 name: demo-radondb-mysql
109 labels:
110 app: demo-radondb-mysql
111 chart: radondb-mysql-1.0.0
112 release: "demo"
113 heritage: "Helm"
環境變量
環境變量 主要目的是保存密碼和配置參數解耦。
-
secrets.yaml 功能
- Opaque
- base64 轉碼
- 加密插件
-
configmap.yaml 功能
- 將配置參數和 docker 鏡像解耦
- 保存一些配置參數和修改 lable 的腳本
如何識別集群中 leader、follower 角色?
識別集群節點角色,需創建一個服務賬號,並授予相應的權限。通過執行在 config
文件中保存的腳本,調用相應的 API 來修改對應角色的 lable。
節點角色修改后,相應 lable 效果如下。此時,通過服務標簽后綴,即可輕松辨別 Leader 和 Follower 角色的節點。
在 KubeSphere[2] 管理控制台,可查看到角色修改后示例如下:
如何實現讀寫分離?
RadonDB MySQL 讀寫分離,通過 Headless service for stable DNS [3] 來實現。
分配一個集群內部可以訪問的虛擬 IP (VIP),VIP 是固定的,而節點所綁定的 Pod 的 IP 是可以變化的,每個 Node 上分配一個端口作為外部訪問入口。以此特點,可以設定一個讀 IP 和一個寫 IP,來達到讀寫分離的目的,而無需擔心新綁定 Pod 致使 IP 發生變化。
以 Leader 節點為例,下圖所示的 ClusterIP 對應寫 IP(10.111.92.63
), 其綁定當前的 Pod(主)IP 為 172.17.0.10
。
邂逅 KubeShpere
RadonDB MySQL 已經登錄 KubeSphere 應用商店(3.1.0 版本推出),可以通過 KubeSphere 來實現對集群的查看和管理。
1、通過終端查看集群正常時 gtid 和對應的狀態
2、模擬 Follower 節點掛掉場景
kill 掉名為 demo-radondb-mysql-2 的 follower:
從另外一個節點登入終端再次查看集群狀態,該 follower 節點 MySQL 和 IO/SQL 狀態都不正常。
從 KubeSphere 界面查看:
掛掉的節點重新拉起,集群開始重新發起選舉:
3、Leader (demo-radondb-mysql-0) 節點掛掉場景
leader 降級為 follower,原來另外兩個從節點進入候選者狀態:
從 KubeSphere 界面查看,這時已經查不到 leader pod:
等待一段時間,集群選出新主(demo-radondb-mysql-2):
從 KubeSphere 看到原來的主(demo-radondb-mysql-0)變為 follower:
4、網絡隔離
將新主(demo-radondb-mysql-2) 隔離。
等待一段時間,可以看到新主(demo-radondb-mysql-0)重新被選出:
[1]. RadonDB MySQL Kubernetes:https://github.com/radondb/radondb-mysql-kubernetes
[2]. KubeSphere:https://kubesphere.com.cn
[3]. Headless service:https://kubesphere.com.cnhttps😕/kubernetes.io/docs/concepts/services-networking/service/
關於 RadonDB
RadonDB 開源社區是一個面向雲原生、容器化的數據庫開源社區, 為數據庫技術愛好者提供圍繞主流開源數據庫(MySQL、PostgreSQL、Redis、MongoDB、ClickHouse 等)的技術分享平台,並提供企業級 RadonDB 開源產品及服務。
目前 RadonDB 開源數據庫系列產品已被 光大銀行、浦發硅谷銀行、哈密銀行、泰康保險、太平保險、安盛保險、陽光保險、百年人壽、安吉物流、安暢物流、藍月亮、天財商龍、羅克佳華、升哲科技、無錫匯跑體育、北京電信、江蘇交通控股、四川航空、昆明航空、國控生物 等上千家企業及社區用戶采用。
RadonDB 可基於雲平台與 Kubernetes 容器平台交付,不僅提供覆蓋多場景的數據庫產品解決方案,而且提供專業的集群管理和自動化運維能力,主要功能特性包括:高可用主從切換、數據強一致性、讀寫分離、一鍵安裝部署、多維指標監控&告警、彈性擴容&縮容、橫向自由擴展、自動備份&恢復、同城多活、異地災備 等。RadonDB 僅需企業及社區用戶專注於業務層邏輯開發,無需關注集群高可用選型、管理和運維等復雜問題,幫助企業及社區用戶大幅度提升業務開發與價值創新的效率!
GitHub:
微信群: 請搜索添加群助手微信號 radondb