基于原生云的MySQL服务系统研究与应用
2023-06-22朱常鹏李刚
朱常鹏 李刚
摘要:原生云作为云计算领域中的最新虚拟化技术,最显著的优势是开销小、易扩展、易维护,越来越多的企业使用原生云部署它们的应用系统。K8s源自于谷歌,是目前最主流的原始云。文章提出实现一种基于K8s的MySQL服务系统。该系统将MySQL数据库迁移到原生云平台,并充分利用K8s的自动伸缩、数据持久化和负载均衡等特性,使得数据库突破了单机存储空间和计算能力的限制,这不仅可以有效节约本地服务器的维护成本,而且可以按需提升系统的并发数据查询与操作性能。
关键词:容器:Docker;云计算;数据库;Kubernetes
中图分类号:TP393
文献标志码:A
1 系统研究背景与意义
目前,云数据库正在蓬勃发展,已经成为一个重要的研究方向[1]。它不仅易于管理、方便扩展并且用户无需维护数据库系统、周期性更新数据库的补丁程序、系统强化和备份等。此外,除了数据所需的存储空间外,集群中的虚拟机数量能根据负载自动增加,从而实现高可用性和强伸缩性[2]。从服务角度而言,云数据库提供了基于Weh的UI界面来帮助用户进行数据库操作和实例控制,同时也可以帮助用户进行数据库的备份与恢复,大大地提高了数据管理的便捷性与安全性,并且可以在线监控和扩展数据库来满足不同的应用需求。总体而言,构建在云上的数据库可以快速、低成本且高效率地扩展,也可广泛地用于实验教学环境[3]。基于此,本文开发并完成了一个基于Kuhernetes的MySQL服务系统,它可以为每一个使用该系统的用户提供一个MySQL环境,对于大规模弹性部署基于MySQL的应用具有重要意义。
2 系统设计
2.1 Kubernetes介绍
Kuherneces的主要结构如图1所示,它采用了典型的主一从架构。这种架构不仅可以方便集群的日常管理与维护,也易于集群的横向扩展与收缩。它的核心主键分别是apiserv er.scheduler.kubelec和kuhe -proxy。在Kuherneces中,apiserver是消息中枢,它是所有其他主组件和辅助组件可以直接通信的唯一组件。因此,它充当所有集群通信的接口,与apiserver的所有联系均使用安全端口通信。在实际生成资源并将其保存到数据存储之前apiserver负责所有资源创建请求的接口验证。
由于Kuherneces是业务流程框架,因此它用于管理Pod调度的内置逻辑。sched uler负责这种内置的逻辑判断。调度决策取决于诸多因素,它们能够影响甚至阻止Pod的调度与再调度,具体包括:应用程序对资源的要求、跨节点的资源可用性、Pod规范是否具有亲和力标签、要求在特定节点上进行调度、节点是否具有某些污点/容差。kuhe - scheduler调度程序会量化地综合考虑上述因素,执行对Pod的调度。
kuhelec组件是在集群的每个工作程序节点上运行的代理。以本系统为例,kubelec负责管理Pod中运行的MySQL容器和PhpMyAdmain容器。它通过周期性地检测容器的当前状态与存储在etcd中的期望状态是否匹配来管理容器的运行,具体包括容器的终止、重启或迁移等。podspec可能通过kube - apiserver传递到kuhelec以便在该特定节点上运行Pod.或者通过命令行工具作为文件传递。
kube-proxy组件是在每个节点上运行的网络代理,负责转发请求。该代理比较灵活,可以处理简单或循环的TCP.UDP或SCTP转发。每个节点通过kube -proxy与Kubernetes服务进行交互。
2.2 系统设计
系统模块如图2所示。该系统主要分为5个部分:MySQL部署模块、MySQL服务模块、PhpMyAdmain部署模块、PhpMyAdmain服务模块和lngress模块(入口控制器模块)。MySQL部署模块主要用来创建MySQL的Pod并且添加相应的镜像到Pod中。除此之外,该模块还把容器依附到持久卷上面进行持久化存储。MySQL服务模块将Service定义为节点Pod的逻辑集合,它提供了可以访问Pod的IP地址和DNS。使用该模块可以非常轻松地通过Pod扩展管理负载平衡。MySQL服务模块中的服务实质上是Kubernetes中的REST对象,可以通过Kubernetesapiserver创建。不同服务之间通过TCP/IP协议通信与数据传输。PhpMyAdmin模块主要用来创建负责可视化工具的Pod,并且与MySQL容器进行连接。为了简化PhpMyAdmin的对外访问,入口控制器模块将PhpMyAdmin连接公共Internet网,同时创建一个入口资源,将其指向PhpMyAdmin容器的服务资源。
2.3 系统开发工具
系统逐渐构建并实现的过程中,使用了很多不同的工具,这些工具缩短了配置环境的时间,同时也为后续部署集群和创建节点提供了支持。系统使用的开发环境为MacOS,开发工具为DockerDesktop,Kuherneces和ZSHshell等。
3系统实现
系统需要构建一个Kuhernetes集群,集群中拥有一个Masler集群控制节点,并在集群中创建一个拥有两个Pocl的Node节点,其中第一个Pod包含一个MySQL容器,并通过Persistent Volume Claim持久化数据库的存储,第二个Pod里面创建PhpMyAdmain容器,并通过设置环境变量来连接MySQL,這样就实现了运行在云中的MySQL服务系统。本系统的核心功能包含:MySQL的持久卷声明、MySQLPod创建和PVC的使用和MySQLservice的声明。下面将逐一介绍它们的具体实现思路与方法。
3.1
MySQL的持久卷声明
在持久卷声明中,首先声明了PVC类型,然后赋予了名字和读取的模式,最后为声明分配了1 Gi的存储空间,随后可以挂载到MySQL的Pod上来实现持久存储,代码片段如下:
mysql-persistentVolumeClaim. vaml
apiversion:vl
kind: Persistentvolumec-.laim
metadata:
name:mysql-data-disk
spec.:
accessModes:
-ReadwriteOnceresources:
requests:
storage:1Gi
3.2
MySQL Pod创建和PVC的使用
为了创建Pod.首先应声明资源类型为deployment,然后设置好相应的镜像名称、容器端口、数据库密码等变量,然后将刚刚声明好的PVC挂载到这个Pod上实现持久化存储。当退出数据库再次进入时,之前的改变都将被保存。代码片段如下:
spec:
conrainers:
- name:mysql
image:mnysql:5.7
ports:
- containerPort:3386
voluneMounts:
- mountPaLh:”var/lib/mysql"
subPath:mysql"
name:mysql-data
env:
-name: MYSqL_ROOT_PASSMORD
valueFrom:
secretKeyRef:
name:_mysql-secrets
key:ROOT_PASSNORD
volumes:
- name:mysql-data
persistentNolumec.laim:
claimnName: mysql-data-disk
3.3
MySQL service的声明
在service类型资源中,笔者通过设定了这个Pod的端口号从而确定了IP地址,PhpMyAdmain就是通过设定对应于servic.e文件的端口号来连接数据库,代码片段如下所示:
kind:Service
metadata:
name:mysql-service
spec:
selector:
app:mysql
ports:
- prolocol:TCP
port:3306
targetPort:3306
此外,为了解决持久化容器存储的问题,本文引入了两个新的API资源-Persiscent Volume和Persiscent Volume Claim。如果Pod是有状态的,那么它将始终需要关联一个持久卷,表示Pod可能消耗的后端存储实体将是PersistencVolume。PersistencVolume Claim持久卷声明则代表特定Pod对持久卷的专有使用。
4 测试与验证
为了验证系统的正确性,本节构建了一个Kuherneles集群。集群中拥有一个Masler集群控制节点,并通过在集群中创建一个拥有两个Pod的Node节点,实现了运行在云中的MySQL服务系统。在第一个Pod中,笔者通过docker拉取的镜像创建了第一个MySQL容器,并通过Persislent Volume Claim持久化数据库的存储,成功部署了第一个servlce。接下来在第二个Pod中,通过docker拉取了PhpMyAdmain的镜像,并设置环境变量以连接集群中的数据库,实现了MySQL的可视化管理。
在下面的测试中,笔者编写4组不同的soL测试代码,首先创建一个名字为World的数据库,然后每组测试代码分别创建一个table,并向其中插入记录。笔者对系统进行了5次功能测试。
(1)创建名字为World的数据库,退出数据库后再次进入,检查存储是否持久。
(2)使用SQL语言创建名字为city的表格,并向其中插入25条城市记录,退出数据库后再次进入,检查存储是否持久。
(3)创建名字为Countrv的表格,并向其中插入25条记录,退出数据库后再次进入,检查存储是否持久。
(4)创建名字为Country Language的表格,并向其中插入25条记录,退出数据库后再次进入,检查存储是否持久化。
(5)执行选择SELECT语句,查看数据库是否可以正常筛选。
测试结果表明,本文提出设计与实现的系统能够正确地完成预期的功能。
5 结语
本文提出一种基于Kubernetes的云上MySQL数据库系统的实现方法,充分利用基于Kubernetes的原生云的低开销、集群化、通用性以及灵活的伸缩功能。该系统展示出较好的并发数据查询、插入和自动横向扩展性能。实验表明该系统具备较好的实用性,各项性能指标符合预期。本文同时也展示了该系统的设计思想以及关键组件的实现方式与方法,以期为设计实现基于Kubernetes的其他服务软件系统提供借鉴。
参考文献
[1]ZHU C P, HAN B, ZHAO Y L.A bi-metricautoscaling approaCh for n-Tier web applications onKubernetes[J].Frontiers of Computer ScienCe, 2021(3):1-12.
[2] ZHU C P,HAN B,ZHAO Y L.A comparative studyof spark on the bare metal and kubernetes[ EB/OLl.(2020 - 12 - 27)[2023 - 03 - 20].https://www.researchgaLe. net/publication/350593000一A—Compar -ative_ Study—of—Spark—on—the—bare—metal—and—Kubernetes.
[3]朱常鵬,刘元超,李刚.Spark实时大数据处理技术在线开放课程建设与实践[J].现代信息科技,2021(12):195-198.
(编辑王雪芬)