作者:高日耀 資深 MySQL 內核研發
本文源於作者在 KubeSphere & Friends 2021 上海站的演講內容《MySQL on K8s:開源開放的 MySQL 高可用容器編排方案》。
MySQL 是世界上最流行的開源數據庫,在容器及 K8s 技術出來之前,就已經在各行各業中廣泛的應用。本文將為大家分享 MySQL 容器化方面的一些實踐。
| MySQL 運維有哪些挑戰?
傳統的物理部署方式,即把數據庫部署在物理機上。對運維人員而言,會遇到圖 1 中四個維度的挑戰。
1、成本
自建 MySQL 數據庫集群,需要的硬件設備包括:服務器、網絡交換機、內存、CPU、硬盤等 硬件設備。
硬件設備成本包括:選型、購買、維護、升級、損壞、數據丟失等。
2、傳統部署
每新增一套集群,都要進行操作系統安裝、環境配置、MySQL 數據庫安裝、調試、性能優化、調參,后續還有系統升級,數據庫升級...
3、運維
針對不同對場景,比如一源一副本,一源兩副本,多源多副本(MGR)等,需要編寫對應的運維腳本。
在集群規模不大,MySQL 實例不多的情況下,運維人員尚且能應付,但是當集群不斷增加,MySQL 實例達到成千上萬個的時候,會極大的增加運維人員的負擔,效率也會變得低下。
規模越大,出現誤操作的概率會越高,嚴重的甚至要 “從刪庫跑路”。誤刪除關鍵數據,對於一般企業而言,應對能力較弱,危害很可能是致命的。
4、資源彈性
傳統物理機部署不具備秒級彈性的能力,來針對 MySQL 在高峰或低谷時資源的自動彈性伸縮。例如,在業務高峰擴展 CPU、內存等資源,在低峰期收回閑置資源。
如果設計一次電商秒殺的場景持續時間是 30 分鍾,那么我們可以在 30 分鍾內,將網絡、CPU、內存、磁盤等資源提升到最大。在秒殺結束之后,釋放這些資源,極大節省成本。
主流解決方案
針對如上挑戰,主流的解決方案有兩種:
-
物理機 + 管理平台
通過數據庫管理平台,對數據庫的統一管理,減輕數據庫運維成本,提高數據庫整體的可用性。
-
上雲
將數據庫部署到一個虛擬計算環境中,也就是常說的數據庫上雲。市面上各大雲廠商都提供了 RDS 服務。
數據庫上雲可以實現按需付費、按需擴展、高可用性以及存儲整合等優勢。大大降低運維人員大規模部署和運維數據庫的難度。
那么,還有沒有其它方案來解決這些挑戰呢?接下來為大家介紹數據庫容器化。
| 為什么要做數據庫容器化?
據 CNCF 雲原生產業聯盟發布的《中國雲原生用戶調查報告2020年》[1] 顯示,60% 以上的中國企業已在生產環境中應用容器技術,其中 43% 的企業已將容器技術用於核心生產業務。
容器技術
Docker 橫空出世
-
相當輕量鏡像標准化制作
使安裝部署和交付非常高效。解決了 Pass 服務打包復雜,環境不一致等問題。
-
輕量級虛擬化(rootfs/cgroup/namespace)
有助於資源共享,降級性能損耗
Kubernetes 容器編排的事實標准
依托着 Google Borg 項目的理論優勢,繼承了 Google 的大規模生產環境的經驗。K8s 提供了一套基於容器構建分布式系統的基礎依賴。K8s 也成為容器編排的事實標准。
-
運維能力
路由網關、水平擴展、監控、備份、災難恢復等。
-
聲明式 API
描述容器化業務和容器間關系。
-
容器編排
按照用戶的意願和整個系統的規則,完全自動化地處理好容器之間的各種關系。
通過觀察用戶實際使用 MySQL 時對容器化產品的迫切需求,可以看出 MySQL 容器化進程勢在必行。以 KubeSphere開源社區[2] 為例,在其應用商店呼聲最高的就是高可用版的 MySQL。
| MySQL 容器化探索
RadonDB MySQL 是一款基於 MySQL 的開源、高可用、雲原生集群解決方案。支持一主多從高可用架構,並具備安全、自動備份、監控告警、自動擴容等全套管理功能。目前已經在生產環境中大規模的使用,包含 銀行,保險,傳統大企業 等。
RadonDB MySQL Kubernetes[3] 支持在 Kubernetes 和 KubeSphere 上安裝部署和管理,自動執行與運行 RadonDB MySQL 集群有關的任務。服務高可用由已經開源的 MySQL 集群高可用工具 Xenon 來實現。
架構圖
每一個 Pod 里面的 Xenon 管理當前 Pod 中的 MySQL,主要獲取並保存當前狀態,獲取當前執行的復制狀態信息。
Helm 版
通用的包管理工具,將 K8s 資源模版化,方便共享。主要解決如下問題:
- 部署應用資源,配置分離;
- 管理其生命周期;
- MySQL 的升級更新;
- 資源的刪除。
主要功能:
- MySQL 高可用
- 無中心化領導者自動選舉
- 主從秒級切換
- 數據強一致性
- 集群管理
- 監控告警
- 集群日志管理
- 賬戶管理
KubeSphere 應用管理
可以通過終端執行命令部署回顯信息。
$ xenoncli cluster status
+------------------------------------------------------+-------------------------------+--------+---------+--------------------------+---------------------+----------------+------------------------------------------------------+
| ID | Raft | Mysqld | Monitor | Backup | Mysql | IO/SQL_RUNNING | MyLeader |
+------------------------------------------------------+-------------------------------+--------+---------+--------------------------+---------------------+----------------+------------------------------------------------------+
| demo-radondb-mysql-0.demo-radondb-mysql.default:8801 | [ViewID:1 EpochID:2]@LEADER | UNKNOW | OFF | state:[NONE]
| [ALIVE] [READWRITE] | [true/true] | demo-radondb-mysql-0.demo-radondb-mysql.default:8801 |
| | | | | LastError: | | | |
+------------------------------------------------------+-------------------------------+--------+---------+--------------------------+---------------------+----------------+------------------------------------------------------+
| demo-radondb-mysql-1.demo-radondb-mysql.default:8801 | [ViewID:1 EpochID:2]@FOLLOWER | UNKNOW | OFF | state:[NONE]
| [ALIVE] [READONLY] | [true/true] | demo-radondb-mysql-0.demo-radondb-mysql.default:8801 |
| | | | | LastError: | | | |
+------------------------------------------------------+-------------------------------+--------+---------+--------------------------+---------------------+----------------+------------------------------------------------------+
| demo-radondb-mysql-2.demo-radondb-mysql.default:8801 | [ViewID:1 EpochID:2]@FOLLOWER | UNKNOW | OFF | state:[NONE]
| [ALIVE] [READONLY] | [true/true] | demo-radondb-mysql-0.demo-radondb-mysql.default:8801 |
| | | | | LastError: | | | |
+------------------------------------------------------+-------------------------------+--------+---------+--------------------------+---------------------+----------------+------------------------------------------------------+
$ xenoncli cluster gtid
+------------------------------------------------------+----------+-------+-------------------+--------------------+
| ID | Raft | Mysql | Executed_GTID_Set | Retrieved_GTID_Set |
+------------------------------------------------------+----------+-------+-------------------+--------------------+
| demo-radondb-mysql-1.demo-radondb-mysql.default:8801 | FOLLOWER | ALIVE | | |
+------------------------------------------------------+----------+-------+-------------------+--------------------+
| demo-radondb-mysql-2.demo-radondb-mysql.default:8801 | FOLLOWER | ALIVE | | |
+------------------------------------------------------+----------+-------+-------------------+--------------------+
| demo-radondb-mysql-0.demo-radondb-mysql.default:8801 | LEADER | ALIVE | | |
+------------------------------------------------------+----------+-------+-------------------+--------------------+
| RoadMap
Operator 版
Operator 版針對特定場景做有狀態服務,針對復雜應用的自動化管理。除了滿足 Helm 版的需求之外,主要解決如下問題:
- 監聽 Kubernetes API,在實例創建、伸縮、死亡等各個生命周期中做相應的處理來保證有狀態應用中的數據連續性;
- 指定節點跨機房/異地災備,IP 固定等;
- 主從復制出現異常或者復制延時超過正常范圍自動定位和自動修復等。
借助 Operator 框架,以及對精細粒度操控應用等功能需求。
【即將推出】主要功能:
- 增刪節點
- 自動擴縮容
- 升級集群
- 備份與恢復
- 故障自動轉移
- 自動重建節點
- 自動重啟服務
- 賬戶管理(提供 API 接口)
- 在線遷移
- 自動化運維
- 多節點角色
- 災備集群
- SSL 傳輸加密
- ……
希望有對數據庫容器化感興趣的同學關注 RadonDB開源社區,一個面向雲原生、容器化的數據庫開源社區!
[1]. 2020 年中國雲原生調查報告:https://www.cncf.io/blog/2021/04/28/cncf-cloud-native-survey-china-2020/
[2]. KubeSphere開源社區 : https://kubesphere.com.cn
[3]. RadonDB MySQL Kubernetes:https://github.com/radondb/radondb-mysql-kubernetes
關於 RadonDB
RadonDB 開源社區是一個面向雲原生、容器化的數據庫開源社區, 為數據庫技術愛好者提供圍繞主流開源數據庫(MySQL、PostgreSQL、Redis、MongoDB、ClickHouse 等)的技術分享平台,並提供企業級 RadonDB 開源產品及服務。
目前 RadonDB 開源數據庫系列產品已被 光大銀行、浦發硅谷銀行、哈密銀行、泰康保險、太平保險、安盛保險、陽光保險、百年人壽、安吉物流、安暢物流、藍月亮、天財商龍、羅克佳華、升哲科技、無錫匯跑體育、北京電信、江蘇交通控股、四川航空、昆明航空、國控生物 等上千家企業及社區用戶采用。
RadonDB 可基於雲平台與 Kubernetes 容器平台交付,不僅提供覆蓋多場景的數據庫產品解決方案,而且提供專業的集群管理和自動化運維能力,主要功能特性包括:高可用主從切換、數據強一致性、讀寫分離、一鍵安裝部署、多維指標監控&告警、彈性擴容&縮容、橫向自由擴展、自動備份&恢復、同城多活、異地災備 等。RadonDB 僅需企業及社區用戶專注於業務層邏輯開發,無需關注集群高可用選型、管理和運維等復雜問題,幫助企業及社區用戶大幅度提升業務開發與價值創新的效率!
GitHub:
微信群: 請搜索添加群助手微信號 radondb