朱常鵬 李剛
摘要:原生云作為云計(jì)算領(lǐng)域中的最新虛擬化技術(shù),最顯著的優(yōu)勢(shì)是開銷小、易擴(kuò)展、易維護(hù),越來(lái)越多的企業(yè)使用原生云部署它們的應(yīng)用系統(tǒng)。K8s源自于谷歌,是目前最主流的原始云。文章提出實(shí)現(xiàn)一種基于K8s的MySQL服務(wù)系統(tǒng)。該系統(tǒng)將MySQL數(shù)據(jù)庫(kù)遷移到原生云平臺(tái),并充分利用K8s的自動(dòng)伸縮、數(shù)據(jù)持久化和負(fù)載均衡等特性,使得數(shù)據(jù)庫(kù)突破了單機(jī)存儲(chǔ)空間和計(jì)算能力的限制,這不僅可以有效節(jié)約本地服務(wù)器的維護(hù)成本,而且可以按需提升系統(tǒng)的并發(fā)數(shù)據(jù)查詢與操作性能。
關(guān)鍵詞:容器:Docker;云計(jì)算;數(shù)據(jù)庫(kù);Kubernetes
中圖分類號(hào):TP393
文獻(xiàn)標(biāo)志碼:A
1 系統(tǒng)研究背景與意義
目前,云數(shù)據(jù)庫(kù)正在蓬勃發(fā)展,已經(jīng)成為一個(gè)重要的研究方向[1]。它不僅易于管理、方便擴(kuò)展并且用戶無(wú)需維護(hù)數(shù)據(jù)庫(kù)系統(tǒng)、周期性更新數(shù)據(jù)庫(kù)的補(bǔ)丁程序、系統(tǒng)強(qiáng)化和備份等。此外,除了數(shù)據(jù)所需的存儲(chǔ)空間外,集群中的虛擬機(jī)數(shù)量能根據(jù)負(fù)載自動(dòng)增加,從而實(shí)現(xiàn)高可用性和強(qiáng)伸縮性[2]。從服務(wù)角度而言,云數(shù)據(jù)庫(kù)提供了基于Weh的UI界面來(lái)幫助用戶進(jìn)行數(shù)據(jù)庫(kù)操作和實(shí)例控制,同時(shí)也可以幫助用戶進(jìn)行數(shù)據(jù)庫(kù)的備份與恢復(fù),大大地提高了數(shù)據(jù)管理的便捷性與安全性,并且可以在線監(jiān)控和擴(kuò)展數(shù)據(jù)庫(kù)來(lái)滿足不同的應(yīng)用需求??傮w而言,構(gòu)建在云上的數(shù)據(jù)庫(kù)可以快速、低成本且高效率地?cái)U(kuò)展,也可廣泛地用于實(shí)驗(yàn)教學(xué)環(huán)境[3]?;诖耍疚拈_發(fā)并完成了一個(gè)基于Kuhernetes的MySQL服務(wù)系統(tǒng),它可以為每一個(gè)使用該系統(tǒng)的用戶提供一個(gè)MySQL環(huán)境,對(duì)于大規(guī)模彈性部署基于MySQL的應(yīng)用具有重要意義。
2 系統(tǒng)設(shè)計(jì)
2.1 Kubernetes介紹
Kuherneces的主要結(jié)構(gòu)如圖1所示,它采用了典型的主一從架構(gòu)。這種架構(gòu)不僅可以方便集群的日常管理與維護(hù),也易于集群的橫向擴(kuò)展與收縮。它的核心主鍵分別是apiserv er.scheduler.kubelec和kuhe -proxy。在Kuherneces中,apiserver是消息中樞,它是所有其他主組件和輔助組件可以直接通信的唯一組件。因此,它充當(dāng)所有集群通信的接口,與apiserver的所有聯(lián)系均使用安全端口通信。在實(shí)際生成資源并將其保存到數(shù)據(jù)存儲(chǔ)之前apiserver負(fù)責(zé)所有資源創(chuàng)建請(qǐng)求的接口驗(yàn)證。
由于Kuherneces是業(yè)務(wù)流程框架,因此它用于管理Pod調(diào)度的內(nèi)置邏輯。sched uler負(fù)責(zé)這種內(nèi)置的邏輯判斷。調(diào)度決策取決于諸多因素,它們能夠影響甚至阻止Pod的調(diào)度與再調(diào)度,具體包括:應(yīng)用程序?qū)Y源的要求、跨節(jié)點(diǎn)的資源可用性、Pod規(guī)范是否具有親和力標(biāo)簽、要求在特定節(jié)點(diǎn)上進(jìn)行調(diào)度、節(jié)點(diǎn)是否具有某些污點(diǎn)/容差。kuhe - scheduler調(diào)度程序會(huì)量化地綜合考慮上述因素,執(zhí)行對(duì)Pod的調(diào)度。
kuhelec組件是在集群的每個(gè)工作程序節(jié)點(diǎn)上運(yùn)行的代理。以本系統(tǒng)為例,kubelec負(fù)責(zé)管理Pod中運(yùn)行的MySQL容器和PhpMyAdmain容器。它通過(guò)周期性地檢測(cè)容器的當(dāng)前狀態(tài)與存儲(chǔ)在etcd中的期望狀態(tài)是否匹配來(lái)管理容器的運(yùn)行,具體包括容器的終止、重啟或遷移等。podspec可能通過(guò)kube - apiserver傳遞到kuhelec以便在該特定節(jié)點(diǎn)上運(yùn)行Pod.或者通過(guò)命令行工具作為文件傳遞。
kube-proxy組件是在每個(gè)節(jié)點(diǎn)上運(yùn)行的網(wǎng)絡(luò)代理,負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求。該代理比較靈活,可以處理簡(jiǎn)單或循環(huán)的TCP.UDP或SCTP轉(zhuǎn)發(fā)。每個(gè)節(jié)點(diǎn)通過(guò)kube -proxy與Kubernetes服務(wù)進(jìn)行交互。
2.2 系統(tǒng)設(shè)計(jì)
系統(tǒng)模塊如圖2所示。該系統(tǒng)主要分為5個(gè)部分:MySQL部署模塊、MySQL服務(wù)模塊、PhpMyAdmain部署模塊、PhpMyAdmain服務(wù)模塊和lngress模塊(入口控制器模塊)。MySQL部署模塊主要用來(lái)創(chuàng)建MySQL的Pod并且添加相應(yīng)的鏡像到Pod中。除此之外,該模塊還把容器依附到持久卷上面進(jìn)行持久化存儲(chǔ)。MySQL服務(wù)模塊將Service定義為節(jié)點(diǎn)Pod的邏輯集合,它提供了可以訪問(wèn)Pod的IP地址和DNS。使用該模塊可以非常輕松地通過(guò)Pod擴(kuò)展管理負(fù)載平衡。MySQL服務(wù)模塊中的服務(wù)實(shí)質(zhì)上是Kubernetes中的REST對(duì)象,可以通過(guò)Kubernetesapiserver創(chuàng)建。不同服務(wù)之間通過(guò)TCP/IP協(xié)議通信與數(shù)據(jù)傳輸。PhpMyAdmin模塊主要用來(lái)創(chuàng)建負(fù)責(zé)可視化工具的Pod,并且與MySQL容器進(jìn)行連接。為了簡(jiǎn)化PhpMyAdmin的對(duì)外訪問(wèn),入口控制器模塊將PhpMyAdmin連接公共Internet網(wǎng),同時(shí)創(chuàng)建一個(gè)入口資源,將其指向PhpMyAdmin容器的服務(wù)資源。
2.3 系統(tǒng)開發(fā)工具
系統(tǒng)逐漸構(gòu)建并實(shí)現(xiàn)的過(guò)程中,使用了很多不同的工具,這些工具縮短了配置環(huán)境的時(shí)間,同時(shí)也為后續(xù)部署集群和創(chuàng)建節(jié)點(diǎn)提供了支持。系統(tǒng)使用的開發(fā)環(huán)境為MacOS,開發(fā)工具為DockerDesktop,Kuherneces和ZSHshell等。
3系統(tǒng)實(shí)現(xiàn)
系統(tǒng)需要構(gòu)建一個(gè)Kuhernetes集群,集群中擁有一個(gè)Masler集群控制節(jié)點(diǎn),并在集群中創(chuàng)建一個(gè)擁有兩個(gè)Pocl的Node節(jié)點(diǎn),其中第一個(gè)Pod包含一個(gè)MySQL容器,并通過(guò)Persistent Volume Claim持久化數(shù)據(jù)庫(kù)的存儲(chǔ),第二個(gè)Pod里面創(chuàng)建PhpMyAdmain容器,并通過(guò)設(shè)置環(huán)境變量來(lái)連接MySQL,這樣就實(shí)現(xiàn)了運(yùn)行在云中的MySQL服務(wù)系統(tǒng)。本系統(tǒng)的核心功能包含:MySQL的持久卷聲明、MySQLPod創(chuàng)建和PVC的使用和MySQLservice的聲明。下面將逐一介紹它們的具體實(shí)現(xiàn)思路與方法。
3.1
MySQL的持久卷聲明
在持久卷聲明中,首先聲明了PVC類型,然后賦予了名字和讀取的模式,最后為聲明分配了1 Gi的存儲(chǔ)空間,隨后可以掛載到MySQL的Pod上來(lái)實(shí)現(xiàn)持久存儲(chǔ),代碼片段如下:
mysql-persistentVolumeClaim. vaml
apiversion:vl
kind: Persistentvolumec-.laim
metadata:
name:mysql-data-disk
spec.:
accessModes:
-ReadwriteOnceresources:
requests:
storage:1Gi
3.2
MySQL Pod創(chuàng)建和PVC的使用
為了創(chuàng)建Pod.首先應(yīng)聲明資源類型為deployment,然后設(shè)置好相應(yīng)的鏡像名稱、容器端口、數(shù)據(jù)庫(kù)密碼等變量,然后將剛剛聲明好的PVC掛載到這個(gè)Pod上實(shí)現(xiàn)持久化存儲(chǔ)。當(dāng)退出數(shù)據(jù)庫(kù)再次進(jìn)入時(shí),之前的改變都將被保存。代碼片段如下:
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類型資源中,筆者通過(guò)設(shè)定了這個(gè)Pod的端口號(hào)從而確定了IP地址,PhpMyAdmain就是通過(guò)設(shè)定對(duì)應(yīng)于servic.e文件的端口號(hào)來(lái)連接數(shù)據(jù)庫(kù),代碼片段如下所示:
kind:Service
metadata:
name:mysql-service
spec:
selector:
app:mysql
ports:
- prolocol:TCP
port:3306
targetPort:3306
此外,為了解決持久化容器存儲(chǔ)的問(wèn)題,本文引入了兩個(gè)新的API資源-Persiscent Volume和Persiscent Volume Claim。如果Pod是有狀態(tài)的,那么它將始終需要關(guān)聯(lián)一個(gè)持久卷,表示Pod可能消耗的后端存儲(chǔ)實(shí)體將是PersistencVolume。PersistencVolume Claim持久卷聲明則代表特定Pod對(duì)持久卷的專有使用。
4 測(cè)試與驗(yàn)證
為了驗(yàn)證系統(tǒng)的正確性,本節(jié)構(gòu)建了一個(gè)Kuherneles集群。集群中擁有一個(gè)Masler集群控制節(jié)點(diǎn),并通過(guò)在集群中創(chuàng)建一個(gè)擁有兩個(gè)Pod的Node節(jié)點(diǎn),實(shí)現(xiàn)了運(yùn)行在云中的MySQL服務(wù)系統(tǒng)。在第一個(gè)Pod中,筆者通過(guò)docker拉取的鏡像創(chuàng)建了第一個(gè)MySQL容器,并通過(guò)Persislent Volume Claim持久化數(shù)據(jù)庫(kù)的存儲(chǔ),成功部署了第一個(gè)servlce。接下來(lái)在第二個(gè)Pod中,通過(guò)docker拉取了PhpMyAdmain的鏡像,并設(shè)置環(huán)境變量以連接集群中的數(shù)據(jù)庫(kù),實(shí)現(xiàn)了MySQL的可視化管理。
在下面的測(cè)試中,筆者編寫4組不同的soL測(cè)試代碼,首先創(chuàng)建一個(gè)名字為World的數(shù)據(jù)庫(kù),然后每組測(cè)試代碼分別創(chuàng)建一個(gè)table,并向其中插入記錄。筆者對(duì)系統(tǒng)進(jìn)行了5次功能測(cè)試。
(1)創(chuàng)建名字為World的數(shù)據(jù)庫(kù),退出數(shù)據(jù)庫(kù)后再次進(jìn)入,檢查存儲(chǔ)是否持久。
(2)使用SQL語(yǔ)言創(chuàng)建名字為city的表格,并向其中插入25條城市記錄,退出數(shù)據(jù)庫(kù)后再次進(jìn)入,檢查存儲(chǔ)是否持久。
(3)創(chuàng)建名字為Countrv的表格,并向其中插入25條記錄,退出數(shù)據(jù)庫(kù)后再次進(jìn)入,檢查存儲(chǔ)是否持久。
(4)創(chuàng)建名字為Country Language的表格,并向其中插入25條記錄,退出數(shù)據(jù)庫(kù)后再次進(jìn)入,檢查存儲(chǔ)是否持久化。
(5)執(zhí)行選擇SELECT語(yǔ)句,查看數(shù)據(jù)庫(kù)是否可以正常篩選。
測(cè)試結(jié)果表明,本文提出設(shè)計(jì)與實(shí)現(xiàn)的系統(tǒng)能夠正確地完成預(yù)期的功能。
5 結(jié)語(yǔ)
本文提出一種基于Kubernetes的云上MySQL數(shù)據(jù)庫(kù)系統(tǒng)的實(shí)現(xiàn)方法,充分利用基于Kubernetes的原生云的低開銷、集群化、通用性以及靈活的伸縮功能。該系統(tǒng)展示出較好的并發(fā)數(shù)據(jù)查詢、插入和自動(dòng)橫向擴(kuò)展性能。實(shí)驗(yàn)表明該系統(tǒng)具備較好的實(shí)用性,各項(xiàng)性能指標(biāo)符合預(yù)期。本文同時(shí)也展示了該系統(tǒng)的設(shè)計(jì)思想以及關(guān)鍵組件的實(shí)現(xiàn)方式與方法,以期為設(shè)計(jì)實(shí)現(xiàn)基于Kubernetes的其他服務(wù)軟件系統(tǒng)提供借鑒。
參考文獻(xiàn)
[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實(shí)時(shí)大數(shù)據(jù)處理技術(shù)在線開放課程建設(shè)與實(shí)踐[J].現(xiàn)代信息科技,2021(12):195-198.
(編輯王雪芬)