DOI:10.19850/j.cnki.2096-4706.2021.08.035
摘? 要:為了解決大型應(yīng)用系統(tǒng)中后臺(tái)數(shù)據(jù)庫(kù)讀寫性能瓶頸的問題,在MariaDB數(shù)據(jù)庫(kù)構(gòu)建的主從復(fù)制集群中引入MyCat中間件服務(wù)器,安裝必要的軟件包、修改MyCat配置文件,搭建可讀寫分離的數(shù)據(jù)庫(kù)服務(wù)器集群,從而解決了對(duì)一個(gè)數(shù)據(jù)庫(kù)同時(shí)進(jìn)行寫、讀操作時(shí)性能會(huì)嚴(yán)重下降的問題,并提高了在高并發(fā)環(huán)境下數(shù)據(jù)庫(kù)集群的整體處理性能。
關(guān)鍵詞:MyCat;讀寫分離;中間件;MariaDB
中圖分類號(hào):TP311.1? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A ? ?文章編號(hào):2096-4706(2021)08-0125-03
Research and Application of Database Read-Write Separation Technology?Based on MyCat
ZHANG Qingtao
(Hebei Petroleum University of Technology,Chengde? 067000,China)
Abstract:In order to solve the problem of the bottleneck of read and write performance of background database in large application system,MyCat middleware server is introduced into the master-slave replication cluster which is built in MariaDB database. The necessary software package is installed,the configuration file of MyCat is modified,and the database server cluster with read-write separation is built. Thus,the problem that the performance will be seriously degraded when carrying out writing and reading operation to a database at the same time is solved,and the overall processing performance of database cluster in high concurrent environment is improved.
Keywords:MyCat;read-write separation;middleware;MariaDB
0? 引? 言
每學(xué)期末,筆者單位都會(huì)出現(xiàn)大量學(xué)生集中在教務(wù)系統(tǒng)進(jìn)行成績(jī)查詢、課程查詢、選課等操作,致使后臺(tái)數(shù)據(jù)庫(kù)服務(wù)器不堪重負(fù)、出現(xiàn)性能下降甚至崩潰的情況。這一方面是因?yàn)榇罅康臄?shù)據(jù)庫(kù)并發(fā)操作超出了單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的最大處理能力;另一方面是因?yàn)樵趯?duì)數(shù)據(jù)庫(kù)進(jìn)行寫操作時(shí),讀性能會(huì)嚴(yán)重下降。
單位系統(tǒng)前臺(tái)和應(yīng)用系統(tǒng)業(yè)務(wù)邏輯本身采用反向代理技術(shù)實(shí)現(xiàn)Web服務(wù)器負(fù)載均衡,可以解決高并發(fā)訪問問題;但唯獨(dú)系統(tǒng)的后臺(tái)基石——數(shù)據(jù)庫(kù)服務(wù)器在解決高并發(fā)訪問難題上可用手段一直較少。在存儲(chǔ)層面直接采用水平分割、垂直分割等分布式技術(shù)來增強(qiáng)數(shù)據(jù)庫(kù)系統(tǒng)吞吐性能,可謂困難重重,后臺(tái)數(shù)據(jù)庫(kù)的性能瓶頸亟需解決。
MyCat中間件的使用就是解決上述問題的方法之一。
1? 原理
MyCat是一個(gè)開源的數(shù)據(jù)庫(kù)中間件產(chǎn)品,在高并發(fā)的企業(yè)應(yīng)用中可以用于搭建大型數(shù)據(jù)庫(kù)集群,和開源的MariaDB配合可以作為Oracle集群的一種免費(fèi)替代方案。在集群中部分節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)寫入,部分節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)讀出,可以分擔(dān)高并發(fā)環(huán)境對(duì)數(shù)據(jù)庫(kù)服務(wù)器的訪問壓力。
MyCat中間件引入邏輯庫(kù)(Schema)的概念。在系統(tǒng)構(gòu)架中,一個(gè)邏輯庫(kù)和數(shù)據(jù)庫(kù)集群中多個(gè)數(shù)據(jù)節(jié)點(diǎn)(DataNode)中的物理數(shù)據(jù)庫(kù)相對(duì)應(yīng)。在這種映射關(guān)系中,可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行水平分割或垂直分割。在比較簡(jiǎn)單的讀寫分離模型下,MyCat讀寫分離模型架構(gòu)如圖1所示。
該簡(jiǎn)單模型包括一個(gè)主數(shù)據(jù)節(jié)點(diǎn)和一個(gè)從數(shù)據(jù)節(jié)點(diǎn)。配置數(shù)據(jù)庫(kù)讀寫分離,需要以數(shù)據(jù)庫(kù)主從復(fù)制為基礎(chǔ)。因?yàn)樽x寫分離的操作,必然引起集群中數(shù)據(jù)節(jié)點(diǎn)中數(shù)據(jù)的不一致,需要借助后臺(tái)主從復(fù)制機(jī)制實(shí)現(xiàn)數(shù)據(jù)節(jié)點(diǎn)間數(shù)據(jù)的自動(dòng)同步。在集群中主數(shù)據(jù)庫(kù)作為寫數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)作為讀數(shù)據(jù)庫(kù)。
2? 部署MyCat服務(wù)器
2.1? 基本環(huán)境準(zhǔn)備
在讀寫分離的基本服務(wù)器拓?fù)渲校渴鹆丝梢詫?shí)現(xiàn)主從復(fù)制的主數(shù)據(jù)節(jié)點(diǎn)和從數(shù)據(jù)節(jié)點(diǎn)——db_m和db_s。
db_m和db_sIP地址分別為192.168.10.1/24和192.168.10.2/ 24,這兩個(gè)數(shù)據(jù)節(jié)點(diǎn)均需要安裝mariadb和mariadb-server兩個(gè)rpm軟件包,并啟動(dòng)mariadb服務(wù)。建立員工示例數(shù)據(jù)庫(kù)staff,然后授權(quán)mariadb的root管理員賬戶可以本地和遠(yuǎn)程訪問staff數(shù)據(jù)庫(kù):
MariaDB [(none)]> grant all privileges on staff.* to root@localhost identified by "000000";
MariaDB [(none)]> grant all privileges on staff.* to root@'%' identified by "000000";
Grant為MariaDB的用戶創(chuàng)建和授權(quán)語句。和MySQL數(shù)據(jù)庫(kù)一樣,MariaDB的用戶是區(qū)分本地訪問和遠(yuǎn)程訪問的,授權(quán)需要分開設(shè)置。“all privileges”表示所有訪問權(quán)限,“root@'%'”中的“%”用于匹配所有客戶端主機(jī)。
為了簡(jiǎn)便,這里設(shè)置密碼為“000000”,在生產(chǎn)環(huán)境下不能使用這種簡(jiǎn)單密碼,會(huì)帶來很高的安全風(fēng)險(xiǎn),尤其是在root用戶可以遠(yuǎn)程登錄的情況下。
然后配置MariaDB,配置db_m為主數(shù)據(jù)庫(kù),db_s為從數(shù)據(jù)庫(kù)。為了實(shí)現(xiàn)讀寫分離繼續(xù)增加第三個(gè)節(jié)點(diǎn)——MyCat服務(wù)器。配置其IP地址為192.168.10.3/24,服務(wù)器名為db_mycat。
2.2? 安裝MyCat軟件包
目前MyCat軟件包的最新版本是2.0,這里使用的是較為成熟的1.6版本,使用的MyCat軟件包格式為一個(gè)“.tar.gz”壓縮包,可以直接使用下面命令進(jìn)行解壓縮:
tar –zxvf Mycat-server-*.tar.gz –C /opt/mycat
這里使用-C選項(xiàng)指定解壓縮后文件存儲(chǔ)路徑為/opt/mycat,Linux命令、選項(xiàng)和文件名都區(qū)分大小寫。
修改文件的權(quán)限,開放其對(duì)所有用戶的讀、寫、執(zhí)行權(quán)限:
chmod -R a=rwx /opt/mycat/
這里的-R選項(xiàng)表示遞歸修改目錄下所有子目錄和文件的權(quán)限。“a=rwx”表示設(shè)置所有用戶(屬主、屬組和其他用戶)權(quán)限為讀、寫、執(zhí)行,該選項(xiàng)也可以用數(shù)字模式“777”代替。
2.3? 編輯邏輯庫(kù)配置文件
在配置文件/opt/mycat/conf/schema.xml中定義了用戶可以訪問的邏輯庫(kù),這是外層應(yīng)用看到的數(shù)據(jù)庫(kù)名。邏輯庫(kù)對(duì)應(yīng)了用于實(shí)現(xiàn)讀寫分離的主、從數(shù)據(jù)節(jié)點(diǎn)中的真實(shí)數(shù)據(jù)庫(kù)。這里對(duì)應(yīng)兩個(gè)節(jié)點(diǎn)的物理數(shù)據(jù)庫(kù)staff,建立一個(gè)邏輯數(shù)據(jù)庫(kù)STAFF。下面修改邏輯庫(kù)配置文件schema.xml實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫分離:
vi /opt/mycat/conf/schema.xml
…
<!--可以有多個(gè)writeHost-->
<!--可以有多個(gè)readHost-->
…
對(duì)邏輯庫(kù)STAFF的寫操作會(huì)被MyCat分流到db_m節(jié)點(diǎn),對(duì)STAFF的讀操作會(huì)被分流到db_s節(jié)點(diǎn)。balance="3"表示所有讀操作全部分配到readHost指定的數(shù)據(jù)庫(kù)進(jìn)行,writeHost只負(fù)責(zé)寫。這里的readHost和wiriteHost有隸屬關(guān)聯(lián),其中“host”指定的數(shù)據(jù)庫(kù)服務(wù)器名和實(shí)際的服務(wù)器計(jì)算機(jī)名并不是一個(gè)概念。
如果balance取值為0表示不啟用讀寫分離機(jī)制,讀寫操作都在writeHost上進(jìn)行。如果取值為2,表示writeHost和readHost都參與讀的負(fù)載均衡,所有select語句都會(huì)被隨機(jī)分配到這些主機(jī)上。
writeType參數(shù)可以取“0”或者“1”,取0表示寫操作只發(fā)給第一臺(tái)writeHost,取2表示隨機(jī)發(fā)送給所有writeHost。
MariaDB和MySQL數(shù)據(jù)庫(kù)一樣,默認(rèn)的服務(wù)端口號(hào)是3306。
“ 2.4? 配置邏輯庫(kù)訪問用戶 下面配置針對(duì)邏輯庫(kù)的訪問方式(用戶名和密碼)。 /opt/mycat/conf/server.xml文件中包含MyCat的系統(tǒng)配置信息。為了使得特定用戶可以訪問特定的邏輯庫(kù),需要在配置文件最后配置訪問邏輯庫(kù)的用戶名、密碼及邏輯庫(kù)名。下面通過修改server.xml文件配置訪問邏輯庫(kù)的用戶名、密碼: 這里可以配置用戶名為“root”,密碼為“000000”,邏輯庫(kù)名為STAFF。生產(chǎn)環(huán)境下應(yīng)該使用滿足密碼復(fù)雜性的密碼。 2.5? 指定jdk路徑并啟動(dòng)MyCat服務(wù) 修改MyCat啟動(dòng)腳本/opt/mycat/bin/startup_nowrap.sh,在文件中添加如下代碼指定jdk路徑: JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk/ 這里指定的JDK路徑要以本機(jī)實(shí)際環(huán)境為準(zhǔn)。 啟動(dòng)mycat: bash/opt/mycat/bin/startup_nowrap.sh 使用“bash”命令執(zhí)行一個(gè)程序不需要程序文件有可執(zhí)行權(quán)限。如果文件已經(jīng)具備了可執(zhí)行權(quán)限,也可以直接在Shell中輸入程序文件的絕對(duì)路徑,如“/opt/mycat/bin/startup_nowrap.sh”,進(jìn)行執(zhí)行。如果當(dāng)前目錄是“/opt/mycat/bin/”,也可以使用相對(duì)路徑“./startup_nowrap.sh”。即便位于程序所在目錄下,也不能僅輸入文件名去執(zhí)行一個(gè)自定義用戶程序,除非已經(jīng)把該程序文件所在路徑提前加入了系統(tǒng)的環(huán)境變量。 3? 結(jié)? 論 在大型的企業(yè)級(jí)應(yīng)用中,后臺(tái)數(shù)據(jù)庫(kù)的數(shù)據(jù)吞吐量往往成為整個(gè)系統(tǒng)的性能瓶頸。為了解決數(shù)據(jù)庫(kù)性能瓶頸問題,這里使用了開源的MyCat數(shù)據(jù)庫(kù)中間件和MariaDB數(shù)據(jù)庫(kù)構(gòu)建了完全免費(fèi)的讀寫分離的數(shù)據(jù)庫(kù)服務(wù)器集群,使得對(duì)數(shù)據(jù)庫(kù)的寫操作和讀操作分別由不同的數(shù)據(jù)庫(kù)服務(wù)器承擔(dān)。從而成倍地提高了數(shù)據(jù)庫(kù)服務(wù)器的可用性和吞吐性能。因?yàn)椴捎玫淖x節(jié)點(diǎn)和寫節(jié)點(diǎn)數(shù)量較少,性能提升比較有限,后續(xù)應(yīng)該根據(jù)企業(yè)業(yè)務(wù)規(guī)模去擴(kuò)展讀節(jié)點(diǎn)和寫節(jié)點(diǎn)的數(shù)量,構(gòu)建規(guī)模更大的讀寫分離的數(shù)據(jù)庫(kù)集群。 參考文獻(xiàn): [1] 劉進(jìn)京.MySQL主從復(fù)制讀寫分離 [J].網(wǎng)絡(luò)安全和信息化,2016(8):64-69. [2] 范新民.高并發(fā)環(huán)境下MySQL軟硬件配置優(yōu)化 [J].福建師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2013,29(6):49-54. [3] 施瓦茨,扎伊采夫,特卡琴科.高性能MySQL:第3版 [M].寧海元,周振興,彭立勛,等譯.北京:電子工業(yè)出版社,2013. [4] 郭建偉.實(shí)現(xiàn)MySQL群集讀寫分離 [J].網(wǎng)絡(luò)安全和信息化,2020(5):89-93. [5] 劉建宏.MySQL數(shù)據(jù)庫(kù)優(yōu)化與集群 [J].數(shù)字通信世界,2017(7):47. [6] 谷偉,陳蓮君.基于MySQL查詢優(yōu)化技術(shù)研究 [J].微型電腦應(yīng)用,2013,30(7):48-50. [7] 劉建臣.處理MySQL訪問異常故障 [J].網(wǎng)絡(luò)安全和信息化,2019(12):160-161. [8] 趙曦,李穎,徐江.利用垂直分割技術(shù)的分布式數(shù)據(jù)庫(kù)設(shè)計(jì)研究 [J].控制工程,2018,25(1):154-159. 作者簡(jiǎn)介:張清濤(1980.01—),男,漢族,河北邯鄲人,講師,碩士,研究方向:計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)和云計(jì)算技術(shù)。 收稿日期:2021-03-20