馬亞敏,李守鵬,王 鵬,夏 真
(濟(jì)南市房產(chǎn)測繪研究院,山東 濟(jì)南 250001)
近幾年來,隨著互聯(lián)網(wǎng)不斷推廣與普及,移動通訊網(wǎng)絡(luò)不斷完善和提速,使得數(shù)據(jù)訪問量和數(shù)據(jù)體量爆炸式增長,大數(shù)據(jù)和云計(jì)算為“智慧住建”建設(shè)帶來了契機(jī),濟(jì)南市“住建一張圖”平臺建設(shè)也在向信息化和智慧化轉(zhuǎn)變。隨著民眾對方便快捷地獲取公共服務(wù)的需求日益迫切,住建系統(tǒng)的業(yè)務(wù)量、訪問量和數(shù)據(jù)流量快速增長,而傳統(tǒng)單機(jī)數(shù)據(jù)庫所支持的并發(fā)數(shù)、吞吐量難以滿足這一現(xiàn)狀。因此,亟需尋找一種新的數(shù)據(jù)庫模式來實(shí)現(xiàn)系統(tǒng)的高并發(fā)、高吞吐率、高可用性[1-4]。
結(jié)合濟(jì)南市“智慧住建”建設(shè)方案,決定采用MySQL NDB分布式存儲引擎和負(fù)載均衡技術(shù),使用一組普通性能服務(wù)器,搭建一套高吞吐、高并發(fā)和可動態(tài)擴(kuò)展的MySQL NDB 集群數(shù)據(jù)庫。MySQL NDB 集群采用分布式部署,由多臺服務(wù)器存儲數(shù)據(jù),提高數(shù)據(jù)完整性和可用性;由多臺服務(wù)器提供SQL客戶端,有效提高并發(fā)訪問數(shù)量;通過負(fù)載均衡技術(shù),可實(shí)現(xiàn)讀寫分離,有效提高吞吐數(shù)據(jù)量[5]。
本文提出一套詳細(xì)的MySQL NDB 集群解決方案,以普通服務(wù)器組建高吞吐、高并發(fā)和高可用的集群數(shù)據(jù)庫,以及數(shù)據(jù)庫集群負(fù)載均衡方法和數(shù)據(jù)庫集群性能的具體測試方案。
濟(jì)南市“住建一張圖”管理系統(tǒng)邏輯框架共五層,分別為硬件支撐層、數(shù)據(jù)存儲層、GIS分析層、接口層、應(yīng)用系統(tǒng)層。其中,“住建一張圖”系統(tǒng)“數(shù)據(jù)層”可以劃分為兩大類數(shù)據(jù):空間地理數(shù)據(jù)和住建業(yè)務(wù)數(shù)據(jù)。濟(jì)南市住房和城鄉(xiāng)建設(shè)局主管全市住房建設(shè)工作,所需整合的地理空間數(shù)據(jù)包括全市的二維地圖數(shù)據(jù)、房屋圖層數(shù)據(jù)約100萬房屋幢圖斑、各業(yè)務(wù)專題圖數(shù)據(jù)2 TB等;所需整合的業(yè)務(wù)專題數(shù)據(jù)包括項(xiàng)目報(bào)建、圖審、工程監(jiān)理、竣工驗(yàn)收、房產(chǎn)交易、維修資金、征收拆遷、物業(yè)管理、房屋安全、城市更新、老舊小區(qū)、直管公房、房改房、住房保障、房屋租賃等數(shù)據(jù),數(shù)據(jù)量約9 000余萬條,涉及數(shù)據(jù)種類繁多,數(shù)據(jù)繁雜,數(shù)據(jù)量巨大。
當(dāng)前濟(jì)南市住房和城鄉(xiāng)建設(shè)局多系統(tǒng)獨(dú)立并存的工作模式,造成各類業(yè)務(wù)數(shù)據(jù)資源數(shù)據(jù)指標(biāo)不一、條塊分割、壁壘嚴(yán)重,喪失了信息應(yīng)有的流動性;數(shù)據(jù)存在重復(fù)存儲、重復(fù)更新問題且信息不能橫向互聯(lián)互通,難以提供有效的科學(xué)分析和決策支持;信息研判多停留在對單項(xiàng)業(yè)務(wù)信息的分析、判斷,未能充分整合數(shù)據(jù)資源,進(jìn)行全方位、多角度的剖析和提取,沒有深層次挖掘大數(shù)據(jù)的價(jià)值以輔助各部門科學(xué)決策。因此,根據(jù)濟(jì)南市“智慧住建”的規(guī)劃方案和大數(shù)據(jù)中心建設(shè)需求,將數(shù)據(jù)和業(yè)務(wù)進(jìn)行集成,建設(shè)全市統(tǒng)一的住建信息數(shù)據(jù)庫,提供高效海量數(shù)據(jù)存儲、快速訪問和更新、全業(yè)務(wù)綜合分析應(yīng)用等數(shù)據(jù)服務(wù)。
1.2.1 邏輯架構(gòu)
MySQL集群采用NDB Cluster高冗余的存儲引擎,以保證數(shù)據(jù)的完整性,集群采用的是MySQL Cluster + MySQL Router的四層集群負(fù)載均衡部署方案,集群邏輯架構(gòu)圖如圖1所示。
圖1 集群邏輯架構(gòu)圖
該MySQL集群系統(tǒng)由客戶端應(yīng)用程序、Router節(jié)點(diǎn)、SQL節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)和管理節(jié)點(diǎn)五部分組成??蛻舳耸紫仍L問負(fù)載均衡的Router節(jié)點(diǎn),而Router節(jié)點(diǎn)循環(huán)連接各SQL節(jié)點(diǎn)來訪問數(shù)據(jù)節(jié)點(diǎn)[6-7],各個(gè)節(jié)點(diǎn)由管理節(jié)點(diǎn)統(tǒng)一管理。
(1)Router節(jié)點(diǎn)
Router節(jié)點(diǎn)代理流量轉(zhuǎn)發(fā),實(shí)現(xiàn)負(fù)載均衡。多客戶端可并發(fā)訪問Router節(jié)點(diǎn)時(shí),該節(jié)點(diǎn)循環(huán)連接各SQL節(jié)點(diǎn),如果其中一個(gè)SQL斷開,Router節(jié)點(diǎn)會自動尋找下一SQL節(jié)點(diǎn),確保集群正常使用。
(2)SQL節(jié)點(diǎn)
SQL節(jié)點(diǎn)提供客戶端訪問集群數(shù)據(jù)的接口,存儲集群數(shù)據(jù)的表結(jié)構(gòu),并且每次插入數(shù)據(jù),所有數(shù)據(jù)節(jié)點(diǎn)均同步保存。
(3)數(shù)據(jù)節(jié)點(diǎn)
MySQL集群中,數(shù)據(jù)節(jié)點(diǎn)用于存儲集群中的數(shù)據(jù),NDB引擎會根據(jù)數(shù)據(jù)節(jié)點(diǎn)數(shù)目將數(shù)據(jù)進(jìn)行分布式存儲,確保各數(shù)據(jù)節(jié)點(diǎn)上數(shù)據(jù)分片的完整性。
(4)管理(MGM)節(jié)點(diǎn)
它負(fù)責(zé)對集群中各節(jié)點(diǎn)進(jìn)行管理,包括對各類節(jié)點(diǎn)的啟動、停止、維護(hù)等操作,并記錄集群的操作日志。
1.2.2 部署架構(gòu)
根據(jù)濟(jì)南市智慧“住建一張圖”的建設(shè)需求,構(gòu)建了MySQL NDB 集群數(shù)據(jù)庫,并部署在浪潮政務(wù)云上,部署架構(gòu)圖如圖2所示。
圖2 集群部署架構(gòu)圖
其中,4臺服務(wù)器部署SQL節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn),2臺服務(wù)器部署2個(gè)管理節(jié)點(diǎn)。通過負(fù)載均衡技術(shù),將SQL節(jié)點(diǎn)地址路由映射為政務(wù)云內(nèi)網(wǎng)IP地址,再通過Nginx代理,將政務(wù)云IP地址代理為外網(wǎng)虛擬IP地址。負(fù)載均衡節(jié)點(diǎn)與管理節(jié)點(diǎn)均采用主從配置,可有效減少宕機(jī)風(fēng)險(xiǎn),提高集群可用性。每個(gè)SQL節(jié)點(diǎn)均獨(dú)立部署,避免單點(diǎn)故障;4個(gè)數(shù)據(jù)節(jié)點(diǎn)分為兩個(gè)Group和四個(gè)分區(qū),每個(gè)分區(qū)都在同一個(gè)Group里面有多個(gè)拷貝,確保數(shù)據(jù)的完整性[8-9]。
使用MySQL Router中間件代理流量轉(zhuǎn)發(fā),實(shí)現(xiàn)負(fù)載均衡,具體解決方案如圖3所示。
圖3 負(fù)載均衡邏輯架構(gòu)圖
負(fù)載均衡節(jié)點(diǎn)采用主從配置,若主節(jié)點(diǎn)出現(xiàn)故障,副節(jié)點(diǎn)會主動接管,主從節(jié)點(diǎn)之間采用心跳監(jiān)測確保有效通信。
MySQL Router實(shí)現(xiàn)了流量分發(fā),避免了只向一個(gè)SQL節(jié)點(diǎn)導(dǎo)入流量,如果當(dāng)前的實(shí)例宕機(jī)了,就會向集群的下一個(gè)SQL導(dǎo)入流量。同時(shí),MySQL Router實(shí)現(xiàn)了讀寫分離,根據(jù)集群使用場景讀寫任務(wù)的輕重,合理分配讀寫SQL節(jié)點(diǎn)數(shù)量[10]。
本次數(shù)據(jù)庫集群搭建使用了七臺浪潮云服務(wù)器,其中一臺在政務(wù)外網(wǎng),可登錄Internet訪問該服務(wù)器,其它六臺在政務(wù)內(nèi)網(wǎng),Internet不能直接訪問,二者之間通過網(wǎng)閘控制連通實(shí)現(xiàn)隔離。部署環(huán)境為CentOS8.0和64位處理器架構(gòu),MySQL集群數(shù)據(jù)庫版本為mysql-cluster-8.0.22-el7-x86_64.tar.gz,MySQL負(fù)載均衡版本為mysql-router-cluster-8.0.22-el7-x86_64.tar.gz。
2.1.1 集群管理
集群數(shù)據(jù)庫安裝版本為 MySQL NDB Cluster 8.0,集群節(jié)點(diǎn)部署在六臺服務(wù)器上,各節(jié)點(diǎn)IP分配如表1所示。
表1 節(jié)點(diǎn)IP與Port
其中,11和12兩臺服務(wù)器是管理節(jié)點(diǎn);13~16四臺服務(wù)器為數(shù)據(jù)節(jié)點(diǎn)和SQL節(jié)點(diǎn),需要配置大內(nèi)存,其配置內(nèi)存是數(shù)據(jù)量的2倍時(shí),集群運(yùn)行效率較佳。
2.1.2 Router配置
啟用兩臺服務(wù)器作為負(fù)載均衡節(jié)點(diǎn),分別安裝負(fù)載均衡軟件MySQL-Router 8.0,安裝版本與MySQL數(shù)據(jù)庫版本一致。負(fù)載均衡節(jié)點(diǎn)配置的主要文件為mysqlrouter.conf,主要配置負(fù)載均衡規(guī)則、負(fù)載均衡綁定IP地址、Port端口和需負(fù)載均衡SQL節(jié)點(diǎn)地址,具體配置如表2所示。
表2 負(fù)載均衡節(jié)點(diǎn)IP與Port
MySQL Router有兩種路由規(guī)則:循環(huán)訪問與優(yōu)先訪問,此實(shí)例中,7001端口對應(yīng)循環(huán)訪問,7002端口對應(yīng)優(yōu)先訪問。負(fù)載均衡SQL節(jié)點(diǎn)地址為:172.20.99.13: 3306, 172.20.99.14:3306, 172.20.99.15:3306, 172.20.99.16:3306。
2.1.3 Nginx代理
政務(wù)外網(wǎng)上服務(wù)器使用Nginx代理政務(wù)內(nèi)網(wǎng)上的數(shù)據(jù)庫集群,將負(fù)載均衡生成的虛擬IP和Port代理為政務(wù)外網(wǎng)地址,進(jìn)一步隔離內(nèi)網(wǎng)數(shù)據(jù),提高數(shù)據(jù)安全。其中,Nginx的配置文件為nginx.conf文件,主要完成代理IP端口和目標(biāo)URL的配置,一個(gè)Nginx服務(wù)可以代理多個(gè)URL,具體Nginx服務(wù)器IP地址為:172.20.99.10,其具體配置如表3所示。
表3 Nginx代理IP與端口號
將浪潮云內(nèi)網(wǎng)上的數(shù)據(jù)集群訪問地址,均通過Nginx服務(wù)器代理為浪潮云外網(wǎng)地址,端口也可以重新映射,將內(nèi)網(wǎng)集群數(shù)據(jù)有效隔離在內(nèi)網(wǎng)中。
MySQL NDB集群可創(chuàng)建兩種類型的表,分別為內(nèi)存表和磁盤表。磁盤表僅將主鍵、索引字段保存在內(nèi)存中,其他字段數(shù)據(jù)皆保存至磁盤文件中,因此,磁盤表檢索效率比較低。內(nèi)存表將所有字段和索引數(shù)據(jù)都保存在內(nèi)存中,同時(shí),也在磁盤上保存一份數(shù)據(jù)文件,數(shù)據(jù)節(jié)點(diǎn)會在啟動的時(shí)候把數(shù)據(jù)加載到內(nèi)存,因此,內(nèi)存表的檢索效率較高。
2.2.1 創(chuàng)建內(nèi)存表
MySQL集群默認(rèn)創(chuàng)建內(nèi)存表,創(chuàng)建過程如下:
drop table if exists zjjdb.tb_test1;
create table zjjdb.tb_test1 (
f_id int(10)not null auto_increment,
f_addr varchar(255)default null,
primary key(f_id) using btree
)
engine=ndbcluster auto_increment=1 ;
2.2.2 創(chuàng)建磁盤表
MySQL Cluster磁盤表有以下三種:
Undo log files:存儲事務(wù)進(jìn)行回滾需要的信息。
Tablespaces:表空間,作為磁盤表的容器。
Data files:是與表空間相關(guān)聯(lián)的數(shù)據(jù)文件。
2.2.3 數(shù)據(jù)表的分片存儲
MySQL集群中的NDB表默認(rèn)自動分片,分片的數(shù)量等于數(shù)據(jù)節(jié)點(diǎn)數(shù)目,也可手動分庫分表進(jìn)行分片。
在數(shù)據(jù)導(dǎo)入之前,首先,創(chuàng)建好要導(dǎo)入的數(shù)據(jù)庫及數(shù)據(jù)表結(jié)構(gòu),以規(guī)避不同數(shù)據(jù)庫之間數(shù)據(jù)類型及編碼差異造成數(shù)據(jù)導(dǎo)入的失敗。有以下三種常用數(shù)據(jù)導(dǎo)入方式。
2.3.1 數(shù)據(jù)包導(dǎo)入
對接的業(yè)務(wù)科室,如果不在同一網(wǎng)段,則需要對方提供靜態(tài)的數(shù)據(jù),包括Excel文件、oracle數(shù)據(jù)庫導(dǎo)出的dmp數(shù)據(jù)包、MySQL Migration Toolkit工具生產(chǎn)的sql文件等,將這些靜態(tài)的數(shù)據(jù)包導(dǎo)入到集群數(shù)據(jù)庫。
2.3.2 Navicat數(shù)據(jù)傳輸
對接的業(yè)務(wù)科室,如果可以相互ping通,則用Navicat直連,用其自帶的“數(shù)據(jù)傳輸”工具,進(jìn)行數(shù)據(jù)導(dǎo)入。
2.3.3 Kettle增量傳輸
如果對接的業(yè)務(wù)數(shù)據(jù)每天都有新增,則需要用Kettle每天增量抽取,在抽取之前,應(yīng)與相關(guān)業(yè)務(wù)部門商榷,規(guī)定好時(shí)間戳字段,以便日后維護(hù)使用。
根據(jù)業(yè)務(wù)需要,主要測試MySQL Cluster數(shù)據(jù)庫并發(fā)讀寫能力、并發(fā)事務(wù)處理能力和吞吐能力,以及數(shù)據(jù)庫的可用性和穩(wěn)定性,得到集群較優(yōu)配置,來滿足用戶對數(shù)據(jù)庫的應(yīng)用需求,為公司大型應(yīng)用的去IOE提供科學(xué)依據(jù)。
本次測試使用的服務(wù)器CPU參數(shù)為 Intel Core i7-9700K 3.60 GHz,運(yùn)行內(nèi)存為32 G。
2.4.1 并發(fā)寫能力測試
將數(shù)據(jù)節(jié)點(diǎn)的水平擴(kuò)展,選擇了百萬和千萬兩種量級的數(shù)據(jù)規(guī)模,進(jìn)行對數(shù)據(jù)庫的并發(fā)寫測試,以考察擴(kuò)展數(shù)據(jù)節(jié)點(diǎn)對集群連續(xù)寫性能的影響,測試結(jié)果如表4所示。
表4 2~4個(gè)數(shù)據(jù)節(jié)點(diǎn)并發(fā)寫能力測試結(jié)果匯總表/s
2.4.2 吞吐能力測試
將數(shù)據(jù)節(jié)點(diǎn)的水平擴(kuò)展,測試MySQL集群在百萬和十萬兩種量級的高并發(fā)請求下吞吐能力的變化趨勢,以考察數(shù)據(jù)節(jié)點(diǎn)的擴(kuò)展對吞吐能力的影響,測試結(jié)果如表5所示。
表5 2~4個(gè)數(shù)據(jù)節(jié)點(diǎn)吞吐能力測試結(jié)果匯總表/(請求數(shù)/s)
2.4.3 并發(fā)事務(wù)處理能力測試
采用對比測試方案, 橫向擴(kuò)展SQL節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn),對比集群并發(fā)事務(wù)處理能力,數(shù)據(jù)規(guī)模維持在百萬量級,由5個(gè)SQL客戶端,測試多個(gè)用例在同一時(shí)刻并發(fā)執(zhí)行。
在4個(gè)SQL數(shù)據(jù)節(jié)點(diǎn)情況下,橫向擴(kuò)展NDB數(shù)據(jù)節(jié)點(diǎn),其測試結(jié)果如表6所示。
在4個(gè)NDB數(shù)據(jù)節(jié)點(diǎn)情況下,橫向擴(kuò)展SQL節(jié)點(diǎn),其測試結(jié)果如表7所示。
2.4.4 可用性測試
測試MySQL集群的管理節(jié)點(diǎn)、SQL節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)是否存在單點(diǎn)故障,強(qiáng)制某一節(jié)點(diǎn)服務(wù)器關(guān)機(jī),測試集群依然能正常運(yùn)行。
2.4.5 穩(wěn)定性測試
MySQL集群運(yùn)行10 d以上,訪問十億余次,表現(xiàn)穩(wěn)定。
2.4.6 測試結(jié)論
(1)橫向擴(kuò)展SQL節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn),集群性能近似線性增長。
(2)MySQL集群的可用性高。
(3)MySQL集群有較高的穩(wěn)定性。
(4)MySQL集群橫向擴(kuò)展成本低,易動態(tài)擴(kuò)展。
(5)擴(kuò)展內(nèi)存對數(shù)據(jù)節(jié)點(diǎn)性能影響較明顯;提高CPU頻率對SQL節(jié)點(diǎn)性能影響較明顯。
已優(yōu)化SQL語句及索引,且單臺數(shù)據(jù)庫服務(wù)器難以滿足訪問需求時(shí),需建立集群數(shù)據(jù)庫,將通信壓力分?jǐn)偟礁鱾€(gè)集群節(jié)點(diǎn),可初步解決數(shù)據(jù)通信瓶頸問題。
面對千萬級別訪問量,且單機(jī)數(shù)據(jù)庫服務(wù)器性能無法顯著提高時(shí),可使用多臺普通性能服務(wù)器架構(gòu)數(shù)據(jù)庫集群,以應(yīng)對數(shù)據(jù)庫高并發(fā)、高負(fù)載,提高數(shù)據(jù)庫可用性。
訪問量越大,請求響應(yīng)速度越慢;更新或插入數(shù)據(jù)量較大時(shí),會出現(xiàn)鎖表和線程阻塞等。以上問題可以通過限制訪問數(shù)量或者更新數(shù)據(jù)量進(jìn)行規(guī)避,目前并未找到更好的解決辦法。
本文針對濟(jì)南市“住建一張圖”項(xiàng)目的具體應(yīng)用需求,提出一套基于NDB引擎的MySQL集群數(shù)據(jù)庫高性能解決方案。該方案集群系統(tǒng)可由普通性能設(shè)備組建,由MySQL Router中間件代理流量轉(zhuǎn)發(fā),實(shí)現(xiàn)系統(tǒng)高并發(fā)和高吞吐,且同步更新每個(gè)數(shù)據(jù)節(jié)點(diǎn)上的分片,確保各數(shù)據(jù)節(jié)點(diǎn)的完整性,基本能夠滿足項(xiàng)目需要。目前,集群已完成部署測試,初步達(dá)到預(yù)期效果,且運(yùn)行穩(wěn)定,實(shí)現(xiàn)負(fù)載均衡、數(shù)據(jù)同步及故障切換。