作者:高日耀 資深 MySQL 內(nèi)核研發(fā)
本文源于作者在 KubeSphere & Friends 2021 杭州站 的演講內(nèi)容《基于 Kubernetes 的新一代 MySQL 高可用架構(gòu)實(shí)現(xiàn)方案》。
本文是 MySQL 容器化系列的第三篇文章,主要介紹 MySQL 容器化 Helm 版本[1] 的設(shè)計(jì)思路鸿竖。
Dockerfile 簡(jiǎn)介
首先 RadonDB MySQL 一個(gè) Pod 中的容器角色中沟启,一般包含 MySQL、Xenon皇帮、slowlog 三個(gè)容器。
其中,MySQL 和 Xenon Dockerfile 目錄結(jié)構(gòu)如下所示:
MySQL Dockerfile 解析
啟動(dòng) MySQL 主進(jìn)程前皇筛,需要準(zhǔn)備數(shù)據(jù)庫(kù)配置、初始化等坠七,這些工作要在最終的 MySQL 運(yùn)行之前解決水醋。在制作鏡像時(shí),通過(guò)配置 MySQL Dockerfile 中 ENTRYPOINT
和 CMD
參數(shù)彪置,可提前準(zhǔn)備數(shù)據(jù)庫(kù)配置拄踪、初始化等進(jìn)程。
Docker 是分層的拳魁,每一條命令都會(huì)建一個(gè)鏡像層惶桐,分層太多會(huì)導(dǎo)致快速膨脹。在制作鏡像時(shí),不建議分層太多姚糊。
MySQL Dockerfile
文件中命令示例如下:
MySQL mysql-entry.sh
文件中包含啟動(dòng)命令贿衍,其主要執(zhí)行流程如下:
Xenon Dockerfile 解析
Xenon Dockerfile 比較簡(jiǎn)單,跟 MySQL Dockerfile 流程類似救恨。
Xenon Dockerfile
命令示例如下:
xenon-entry.sh
主要功能:
- 生成 Xenon 配置文件贸辈,在 Xenon 啟動(dòng)的時(shí)候調(diào)用
- ping host
name 生成及環(huán)境變量
name 生成
首先我們看下 chart 目錄下功能文件列表,chart 下包含的文件如下圖所示:
其中肠槽,_helpers.tpl
常需引用 Chart.yaml
和 values.yaml
中定義的變量裙椭,繼而實(shí)現(xiàn)如下能力:
- 生成 app 名字:helm install release <版本名,如 emo> <項(xiàng)目名署浩,如radondb-mysql>
- 生成
serviceAccountName
名字揉燃。- 生成 chart 名字和版本。
通過(guò)命令 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"
環(huán)境變量
環(huán)境變量 主要目的是保存密碼和配置參數(shù)解耦。
-
secrets.yaml 功能
- Opaque
- base64 轉(zhuǎn)碼
- 加密插件
-
configmap.yaml 功能
- 將配置參數(shù)和 docker 鏡像解耦
- 保存一些配置參數(shù)和修改 lable 的腳本
如何識(shí)別集群中 leader弊攘、follower 角色抢腐?
識(shí)別集群節(jié)點(diǎn)角色,需創(chuàng)建一個(gè)服務(wù)賬號(hào)襟交,并授予相應(yīng)的權(quán)限迈倍。通過(guò)執(zhí)行在 config
文件中保存的腳本,調(diào)用相應(yīng)的 API 來(lái)修改對(duì)應(yīng)角色的 lable捣域。
節(jié)點(diǎn)角色修改后啼染,相應(yīng) lable 效果如下。此時(shí)焕梅,通過(guò)服務(wù)標(biāo)簽后綴迹鹅,即可輕松辨別 Leader 和 Follower 角色的節(jié)點(diǎn)。
在 KubeSphere[2] 管理控制臺(tái)贞言,可查看到角色修改后示例如下:
如何實(shí)現(xiàn)讀寫(xiě)分離斜棚?
RadonDB MySQL 讀寫(xiě)分離,通過(guò) Headless service for stable DNS [3] 來(lái)實(shí)現(xiàn)该窗。
分配一個(gè)集群內(nèi)部可以訪問(wèn)的虛擬 IP (VIP)弟蚀,VIP 是固定的,而節(jié)點(diǎn)所綁定的 Pod 的 IP 是可以變化的酗失,每個(gè) Node 上分配一個(gè)端口作為外部訪問(wèn)入口义钉。以此特點(diǎn),可以設(shè)定一個(gè)讀 IP 和一個(gè)寫(xiě) IP级零,來(lái)達(dá)到讀寫(xiě)分離的目的断医,而無(wú)需擔(dān)心新綁定 Pod 致使 IP 發(fā)生變化滞乙。
以 Leader 節(jié)點(diǎn)為例,下圖所示的 ClusterIP 對(duì)應(yīng)寫(xiě) IP(10.111.92.63
)鉴嗤, 其綁定當(dāng)前的 Pod(主)IP 為 172.17.0.10
斩启。
邂逅 KubeShpere
RadonDB MySQL 已經(jīng)登錄 KubeSphere 應(yīng)用商店(3.1.0 版本推出),可以通過(guò) KubeSphere 來(lái)實(shí)現(xiàn)對(duì)集群的查看和管理醉锅。
1兔簇、通過(guò)終端查看集群正常時(shí) gtid 和對(duì)應(yīng)的狀態(tài)
2、模擬 Follower 節(jié)點(diǎn)掛掉場(chǎng)景
kill 掉名為 demo-radondb-mysql-2 的 follower:
從另外一個(gè)節(jié)點(diǎn)登入終端再次查看集群狀態(tài)硬耍,該 follower 節(jié)點(diǎn) MySQL 和 IO/SQL 狀態(tài)都不正常垄琐。
從 KubeSphere 界面查看:
掛掉的節(jié)點(diǎn)重新拉起,集群開(kāi)始重新發(fā)起選舉:
3经柴、Leader (demo-radondb-mysql-0) 節(jié)點(diǎn)掛掉場(chǎng)景
leader 降級(jí)為 follower狸窘,原來(lái)另外兩個(gè)從節(jié)點(diǎn)進(jìn)入候選者狀態(tài):
從 KubeSphere 界面查看,這時(shí)已經(jīng)查不到 leader pod:
等待一段時(shí)間坯认,集群選出新主(demo-radondb-mysql-2):
從 KubeSphere 看到原來(lái)的主(demo-radondb-mysql-0)變?yōu)?follower:
4翻擒、網(wǎng)絡(luò)隔離
將新主(demo-radondb-mysql-2) 隔離。
等待一段時(shí)間牛哺,可以看到新主(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/
關(guān)于 RadonDB
RadonDB 開(kāi)源社區(qū)是一個(gè)面向云原生陋气、容器化的數(shù)據(jù)庫(kù)開(kāi)源社區(qū), 為數(shù)據(jù)庫(kù)技術(shù)愛(ài)好者提供圍繞主流開(kāi)源數(shù)據(jù)庫(kù)(MySQL引润、PostgreSQL巩趁、Redis、MongoDB淳附、ClickHouse 等)的技術(shù)分享平臺(tái)议慰,并提供企業(yè)級(jí) RadonDB 開(kāi)源產(chǎn)品及服務(wù)。
目前 RadonDB 開(kāi)源數(shù)據(jù)庫(kù)系列產(chǎn)品已被 光大銀行燃观、浦發(fā)硅谷銀行褒脯、哈密銀行、泰康保險(xiǎn)缆毁、太平保險(xiǎn)、安盛保險(xiǎn)到涂、陽(yáng)光保險(xiǎn)脊框、百年人壽、安吉物流践啄、安暢物流浇雹、藍(lán)月亮、天財(cái)商龍屿讽、羅克佳華昭灵、升哲科技吠裆、無(wú)錫匯跑體育、北京電信烂完、江蘇交通控股试疙、四川航空、昆明航空抠蚣、國(guó)控生物 等上千家企業(yè)及社區(qū)用戶采用祝旷。
RadonDB 可基于云平臺(tái)與 Kubernetes 容器平臺(tái)交付,不僅提供覆蓋多場(chǎng)景的數(shù)據(jù)庫(kù)產(chǎn)品解決方案嘶窄,而且提供專業(yè)的集群管理和自動(dòng)化運(yùn)維能力怀跛,主要功能特性包括:高可用主從切換、數(shù)據(jù)強(qiáng)一致性柄冲、讀寫(xiě)分離吻谋、一鍵安裝部署、多維指標(biāo)監(jiān)控&告警现横、彈性擴(kuò)容&縮容漓拾、橫向自由擴(kuò)展、自動(dòng)備份&恢復(fù)长赞、同城多活晦攒、異地災(zāi)備 等。RadonDB 僅需企業(yè)及社區(qū)用戶專注于業(yè)務(wù)層邏輯開(kāi)發(fā)得哆,無(wú)需關(guān)注集群高可用選型脯颜、管理和運(yùn)維等復(fù)雜問(wèn)題,幫助企業(yè)及社區(qū)用戶大幅度提升業(yè)務(wù)開(kāi)發(fā)與價(jià)值創(chuàng)新的效率贩据!
GitHub: