容器化 | 基於 Kubernetes 的新一代 MySQL 高可用架構實現方案


作者:高日耀 資深 MySQL 內核研發

本文源於作者在 KubeSphere & Friends 2021 杭州站 的演講內容《基於 Kubernetes 的新一代 MySQL 高可用架構實現方案》。

本文是 MySQL 容器化系列的第三篇文章,主要介紹 MySQL 容器化 Helm 版本[1] 的設計思路。

Dockerfile 簡介

首先 RadonDB MySQL 一個 Pod 中的容器角色中,一般包含 MySQL、Xenon、slowlog 三個容器。
Alt text

其中,MySQL 和 Xenon Dockerfile 目錄結構如下所示:

Alt text

MySQL Dockerfile 解析

啟動 MySQL 主進程前,需要准備數據庫配置、初始化等,這些工作要在最終的 MySQL 運行之前解決。在制作鏡像時,通過配置 MySQL Dockerfile 中 ENTRYPOINTCMD 參數,可提前准備數據庫配置、初始化等進程。

Docker 是分層的,每一條命令都會建一個鏡像層,分層太多會導致快速膨脹。在制作鏡像時,不建議分層太多。

MySQL Dockerfile 文件中命令示例如下:
Alt text

MySQL mysql-entry.sh 文件中包含啟動命令,其主要執行流程如下:

Alt text

Xenon Dockerfile 解析

Xenon Dockerfile 比較簡單,跟 MySQL Dockerfile 流程類似。

Xenon Dockerfile 命令示例如下:

Alt text

xenon-entry.sh 主要功能:

  1. 生成 Xenon 配置文件,在 Xenon 啟動的時候調用
  2. ping host

name 生成及環境變量

name 生成

首先我們看下 chart 目錄下功能文件列表,chart 下包含的文件如下圖所示:

Alt text

其中,_helpers.tpl 常需引用 Chart.yamlvalues.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 的腳本

Alt text

如何識別集群中 leader、follower 角色?

識別集群節點角色,需創建一個服務賬號,並授予相應的權限。通過執行在 config 文件中保存的腳本,調用相應的 API 來修改對應角色的 lable。

Alt text

節點角色修改后,相應 lable 效果如下。此時,通過服務標簽后綴,即可輕松辨別 Leader 和 Follower 角色的節點。
Alt text

在 KubeSphere[2] 管理控制台,可查看到角色修改后示例如下:

Alt text

如何實現讀寫分離?

RadonDB MySQL 讀寫分離,通過 Headless service for stable DNS [3] 來實現。

Alt text

分配一個集群內部可以訪問的虛擬 IP (VIP),VIP 是固定的,而節點所綁定的 Pod 的 IP 是可以變化的,每個 Node 上分配一個端口作為外部訪問入口。以此特點,可以設定一個讀 IP 和一個寫 IP,來達到讀寫分離的目的,而無需擔心新綁定 Pod 致使 IP 發生變化。

以 Leader 節點為例,下圖所示的 ClusterIP 對應寫 IP(10.111.92.63), 其綁定當前的 Pod(主)IP 為 172.17.0.10

Alt text

邂逅 KubeShpere

RadonDB MySQL 已經登錄 KubeSphere 應用商店(3.1.0 版本推出),可以通過 KubeSphere 來實現對集群的查看和管理。

1、通過終端查看集群正常時 gtid 和對應的狀態

Alt text

2、模擬 Follower 節點掛掉場景

kill 掉名為 demo-radondb-mysql-2 的 follower:

Alt text

從另外一個節點登入終端再次查看集群狀態,該 follower 節點 MySQL 和 IO/SQL 狀態都不正常。

Alt text

從 KubeSphere 界面查看:

Alt text

掛掉的節點重新拉起,集群開始重新發起選舉:

Alt text

3、Leader (demo-radondb-mysql-0) 節點掛掉場景

leader 降級為 follower,原來另外兩個從節點進入候選者狀態:

Alt text

從 KubeSphere 界面查看,這時已經查不到 leader pod:

Alt text

等待一段時間,集群選出新主(demo-radondb-mysql-2):

Alt text

從 KubeSphere 看到原來的主(demo-radondb-mysql-0)變為 follower:

Alt text

4、網絡隔離

將新主(demo-radondb-mysql-2) 隔離。

Alt text

等待一段時間,可以看到新主(demo-radondb-mysql-0)重新被選出:

Alt text

[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:

https://github.com/radondb

微信群: 請搜索添加群助手微信號 radondb


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM