楊志宇
摘要:分布式數(shù)據(jù)庫在性能、擴展性和可用性上有許多優(yōu)點,構(gòu)建分布式數(shù)據(jù)庫要解決數(shù)據(jù)一致、位置透明和負載均衡等問題。針對構(gòu)建分布式MySQL數(shù)據(jù)庫系統(tǒng)的應用場景,利用MySQL復制構(gòu)建了一主多從的數(shù)據(jù)庫集群,提供了解決主從數(shù)據(jù)一致的方法,設(shè)計了一種基于Ice的分布式數(shù)據(jù)庫中間件,實現(xiàn)了數(shù)據(jù)庫訪問服務(wù)的位置透明,利用IceGrid特性實現(xiàn)了數(shù)據(jù)庫訪問的負載均衡,具有良好的擴展性和可用性,提高了開發(fā)效率。
關(guān)鍵詞:Ice;中間件;分布式數(shù)據(jù)庫;MySQL
中圖分類號:TP392 文獻標識碼:A 文章編號:1009-3044(2016)11-0012-03
Abstract: Distributed database system has many advantages on the performance, scalability and availability, while it also has problems such as data consistency, location transparency and load balancing to be solved. A middleware which based on ICE has been designed, using IceGrid features for database access load balancing and distribution services and using MySQL replication mechanism for data consistency. The distributed database cluster within one-master-multi-slave architect and Ice middleware implemented the location transparency and load balancing. The experimental data shows that, the distributed database architecture has good scalability and availability, significantly improved the development efficiency.
Key words: Ice; middleware; distributed database; MySQL
隨著互聯(lián)網(wǎng)業(yè)務(wù)的不斷增長,傳統(tǒng)的集中式數(shù)據(jù)庫難以滿足企業(yè)級應用的需求。首先,在讀寫流量增長到一定水平時,集中式數(shù)據(jù)庫會產(chǎn)生性能瓶頸問題;其次,集中式數(shù)據(jù)庫部署在一臺服務(wù)器上,一旦該服務(wù)器發(fā)生故障,則整個系統(tǒng)不可用;再次,集中式數(shù)據(jù)庫的規(guī)模和配置都不夠靈活,難以應對頻繁的業(yè)務(wù)變動。
因此,為解決集中式數(shù)據(jù)庫難以滿足的需求,分布式數(shù)據(jù)庫的應用越發(fā)重要。分布式數(shù)據(jù)庫是指使用多臺服務(wù)器共同提供數(shù)據(jù)存儲、查詢服務(wù)的數(shù)據(jù)庫系統(tǒng)。相比集中式數(shù)據(jù)庫,分布式數(shù)據(jù)庫有以下優(yōu)點:1)分布式數(shù)據(jù)庫能夠滿足更高的性能要求。2)分布式數(shù)據(jù)庫有更高的可靠性,分布式數(shù)據(jù)庫將數(shù)據(jù)分布在不同的機器上,同時有冗余存儲,可以有效避免單節(jié)點故障,提高系統(tǒng)可靠性。3)分布式數(shù)據(jù)庫具有良好的可擴展性,可以根據(jù)業(yè)務(wù)規(guī)模的變化靈活配置,使系統(tǒng)維持在高效率狀態(tài)。
分布式數(shù)據(jù)庫可以將數(shù)據(jù)分片,然后保存在不同的節(jié)點上,每個節(jié)點的數(shù)據(jù)不完全一致;數(shù)據(jù)也可以不分片,即每個節(jié)點都擁有完整的數(shù)據(jù)集,節(jié)點之間數(shù)據(jù)一致。對于各節(jié)點數(shù)據(jù)不完全一致的系統(tǒng),需要管理數(shù)據(jù)與節(jié)點的對應關(guān)系。無論數(shù)據(jù)是否分片存儲,只要存在冗余,就需要解決數(shù)據(jù)一致的問題。
分布式數(shù)據(jù)庫通常通過復制實現(xiàn)數(shù)據(jù)更新,將數(shù)據(jù)從一臺主服務(wù)器拷貝至一臺或多臺從服務(wù)器上。由于復制是異步的,主從數(shù)據(jù)庫在一定的時間段內(nèi)存在同步延遲,分布式數(shù)據(jù)庫在處理讀請求時必須保證主從數(shù)據(jù)庫的數(shù)據(jù)一致。針對這一問題,本文以MySQL數(shù)據(jù)庫為例,提出合理化的解決方案。
同時,分布式數(shù)據(jù)庫的實現(xiàn)還要解決位置透明性和負載均衡的問題:分布式數(shù)據(jù)庫應作為一個整體為客戶端提供統(tǒng)一的接口,即數(shù)據(jù)存儲的物理位置對客戶端是透明的;分布式數(shù)據(jù)庫內(nèi)部應該將讀寫操作合理地分配給各服務(wù)器,以提高整體效率。在分布式數(shù)據(jù)庫的實際應用中,通常通過使用數(shù)據(jù)庫中間件的方式來解決這兩個問題,本文采用ICE中間件實現(xiàn)分布式數(shù)據(jù)庫。
本文的結(jié)構(gòu)如下:第1章介紹目前已有的分布式數(shù)據(jù)庫中間件,比較幾種中間件開發(fā)的平臺;第2章針對構(gòu)建分布式MySQL數(shù)據(jù)庫,提供了保持主從數(shù)據(jù)一致的解決方法;第3章介紹了Ice中間件平臺的基本概念和特性;第四章詳細介紹如何基于Ice構(gòu)建一種分布式MySQL數(shù)據(jù)庫的中間件,使整個數(shù)據(jù)庫集群能夠?qū)崿F(xiàn)位置透明和負載均衡;最后,總結(jié)這種構(gòu)建分布式數(shù)據(jù)庫服務(wù)解決方案的特點。
1 相關(guān)工作
為了實現(xiàn)高可用的分布式數(shù)據(jù)庫系統(tǒng),企業(yè)需要選擇合適的DBMS以及數(shù)據(jù)庫中間件。首先,在DBMS(數(shù)據(jù)庫管理系統(tǒng))的選擇上,MySQL因為開源和良好的可擴展性,一直是構(gòu)建分布式數(shù)據(jù)庫集群的流行解決方案之一。其次,在數(shù)據(jù)庫中間件的選擇上,有許多為MySQL擴展提供支持的開源項目可以作為參考。Amoeba項目于2008年發(fā)布了Amoeba for MySQL,該中間件在應用層訪問MySQL時充當SQL路由,專注于分布式數(shù)據(jù)庫代理層開發(fā)。阿里巴巴于2012年正式對外開源了數(shù)據(jù)庫中間件Cobar。Cobar前身源于Amoeba,在穩(wěn)定性、性能和可靠性上做出了改進。Mycat是另一款源于Cobar的分布式數(shù)據(jù)庫中間件。
Ice是ZeroC公司提供的一套開源中間件平臺,是目前最流行的分布式應用解決方案之一。在主要的幾種分布式解決方案中,.Net只支持windows平臺,COBRA的實現(xiàn)復雜,學習和實施成本高,WebService在性能和安全性上均有缺陷。Ice源于解決其他中間件的不足,它不僅支持不同的系統(tǒng),如windows、Linux,還支持不同的開發(fā)語言,如C++、Java、Python等。Ice為分布式應用提供了一整套強大的特性和功能支持,如負載均衡、軟件分發(fā)、數(shù)據(jù)同步等,同時,在性能和安全性方面也十分出色。
因此,本文基于Ice,提供一種構(gòu)建分布式MySQL數(shù)據(jù)庫服務(wù)的解決方案:基于MySQL搭建一主多從的數(shù)據(jù)庫集群,同時為解決數(shù)據(jù)一致性問題提供方案;基于IceGrid的特性開發(fā)數(shù)據(jù)庫中間件,使客戶端可以通過統(tǒng)一的接口讀寫數(shù)據(jù)庫集群,實現(xiàn)位置透明,將客戶端請求合理分配到集群內(nèi)的各個節(jié)點,實現(xiàn)負載均衡。
2 構(gòu)建分布式MySQL數(shù)據(jù)庫應用
MySQL支持一臺主服務(wù)器同時向多臺從服務(wù)器進行復制,利用MySQL復制可以構(gòu)建一主多從的數(shù)據(jù)庫集群。MySQL復制的過程如下:
(1) 主庫(master)執(zhí)行更新操作、提交事務(wù)(commit)、記錄二進制日志(binlog)、標記事務(wù)成功,同時將binlog發(fā)送給從庫(salve);
(2) slave的IO線程接收binlog,轉(zhuǎn)存至中繼日志(relay log);
(3) slave 的SQL線程讀取relay log,重做更新操作。
在構(gòu)建企業(yè)級的分布式數(shù)據(jù)庫應用時,MySQL復制有可能出現(xiàn)同步延時和主從不一致的問題。原因在于, MySQL復制在主庫上執(zhí)行(1)和在從庫上執(zhí)行(3)是異步的。有數(shù)據(jù)顯示,master的QPS達到1萬左右時,slave重做relay log的QPS只有2000,產(chǎn)生延遲的主要瓶頸在slave重做relog log上。
MySQL為了保證主從一致,提供了半同步復制。使用半同步復制后,master在寫入binlog后,通知所有slave接收該事務(wù),等待至少一個slave寫入relay log并成功刷新到磁盤后,再標記事務(wù)成功。這樣master可以保證集群內(nèi),至少有一臺slave的數(shù)據(jù)是和master是一致的。
為了解決主從延遲問題,MySQL5.6開始支持多線程復制,slave上的SQL線程作為協(xié)調(diào)者將重做relay log任務(wù)分配給多個worker。MySQL5.7開始支持并行復制,一個組提交的事務(wù)可以并行回放,大大減少了同步延時。
在構(gòu)建分布式MySQL數(shù)據(jù)庫應用時,保證數(shù)據(jù)庫集群的數(shù)據(jù)一致的解決方案如下:
(1) 對于MySQL5.7版本的系統(tǒng),使用并行復制;
(2) 對于MySQL5.6版本的系統(tǒng),在復制時使用GTID;
(3) 對實時性要求高的數(shù)據(jù)在主數(shù)據(jù)庫上查詢,實時性要求不高的數(shù)據(jù)在從數(shù)據(jù)庫上查詢;
(4) 使用半同步復制,使用SSD硬盤等優(yōu)化方法。
3 Ice中間件
Ice是一種構(gòu)建面向?qū)ο蟮目蛻舳?服務(wù)器應用的中間件開發(fā)平臺。Ice將實現(xiàn)某種功能的應用稱為IceObject,將應用在服務(wù)端的實現(xiàn)稱為服務(wù)Servant。IceObject與Servant通過Adapter關(guān)聯(lián),Adapter包含通信端點等信息,屏蔽了遠程調(diào)用過程中的底層通信,即:IceObject包含了業(yè)務(wù)實現(xiàn)Servant和通信信息Adapter。客戶端通過服務(wù)代理Proxy調(diào)用IceObject內(nèi)的方法。
IceGrid是Ice提供的分布式解決方案,包含文件分發(fā)、負載均衡、快捷部署等功能。一個IceGrid域由一個Registry(注冊表)和任意數(shù)量的Node(節(jié)點)構(gòu)成。Node節(jié)點負責裝載和啟停服務(wù)實例,采集node節(jié)點的負載信息等;Registry負責維護各節(jié)點的信息和任務(wù)調(diào)度,并將這些信息持久化。
利用IceGrid的支持,可以實現(xiàn)分布式數(shù)據(jù)庫服務(wù)的負載均衡。IceGrid創(chuàng)建復制組replica-group,每個replica-group與多個相同的Ice服務(wù)實例綁定??蛻舳苏{(diào)用服務(wù)時,根據(jù)一定的策略將服務(wù)請求分發(fā)到Ice實例。負載均衡的策略分為4種:1、Random(隨機方式),Registry隨機選擇一個服務(wù)實例,不檢查實例的負載。2、Adaptive(自適應方式),Registry從所有實例中選擇一個負載最輕的實例供客戶端調(diào)用。3、Round-Robin(最近最少使用方式),Registry返回最近的最少被調(diào)用的實例。4、Ordered(順序方式):Registry根據(jù)實例優(yōu)先級,從高到低順序選擇一個實例返回。
利用Ice的間接代理,可以實現(xiàn)分布式數(shù)據(jù)庫服務(wù)的位置透明??蛻舳苏{(diào)用服務(wù)時,不會直接訪問某個服務(wù)實例,而是先訪問Register服務(wù)。Register記錄所有實例的通信端點,Register按一定的策略將一個可用的服務(wù)實例返回給客戶端代理。客戶端根據(jù)Register返回的端點跟遠程服務(wù)實例建立連接,實現(xiàn)調(diào)用。因此,客戶端在調(diào)用數(shù)據(jù)庫服務(wù)時,并不需要知道自己調(diào)用的是哪臺服務(wù)器上的哪個實例,可以將服務(wù)本身作為一個整體使用。
4 基于Ice的分布式MySQL數(shù)據(jù)庫訪問服務(wù)
4.1 服務(wù)的總體架構(gòu)
總體架構(gòu)如圖1所示:
(1) 數(shù)據(jù)庫訪問服務(wù)客戶端
客戶端首先獲得數(shù)據(jù)庫訪問服務(wù)的代理Proxy,然后通過代理Proxy提供的方法遠程調(diào)用數(shù)據(jù)庫訪問服務(wù)。
(2) 數(shù)據(jù)庫訪問服務(wù)
a) 監(jiān)聽客戶端的數(shù)據(jù)庫訪問請求,連接MySQL數(shù)據(jù)庫,執(zhí)行查詢或更新操作,將結(jié)果集返回客戶端。
b) 維護MySQL連接池,對于同一客戶端的請求,復用數(shù)據(jù)庫連接,減少建立數(shù)據(jù)庫連接的次數(shù)。
c) 緩存查詢結(jié)果,對于重復查詢直接返回查詢結(jié)果,提高查詢效率。
根據(jù)Ice的Slice語法,定義數(shù)據(jù)庫訪問服務(wù)DBOperator的接口如下:
客戶端通過代理連接數(shù)據(jù)庫,可以像使用本地方法一樣,使用數(shù)據(jù)庫訪問服務(wù)實例上的方法,進行數(shù)據(jù)庫操作。數(shù)據(jù)庫訪問服務(wù)實現(xiàn)了MySQL集群的讀寫分離。通過讀配置文件,找到Master數(shù)據(jù)庫的端口信息,將寫操作(數(shù)據(jù)庫更新)重新定向到Master節(jié)點所在的數(shù)據(jù)庫訪問服務(wù)上。對于讀操作,則直接訪問本地的MySQL數(shù)據(jù)庫。同時,在數(shù)據(jù)庫服務(wù)中實現(xiàn)了MySQL連接池和緩存,提高了數(shù)據(jù)庫訪問服務(wù)的性能。
(3) MySQL數(shù)據(jù)庫
MySQL數(shù)據(jù)庫被配置為“一主多從”的數(shù)據(jù)庫集群。主服務(wù)器Master負責處理服務(wù)端發(fā)來的更新操作,并將更新操作復制到從服務(wù)器Slave上;從服務(wù)器Slave負責響應服務(wù)端實例發(fā)來的查詢操作,重做Master發(fā)來的數(shù)據(jù)更新,保持主從數(shù)據(jù)一致。
(4) Node節(jié)點
a) 負責裝載和啟停服務(wù)。
b) 負責采集當前Node節(jié)點的負載信息,上報至Register,為負載均衡提供信息。
(5) Register(注冊表)、集群的管理、監(jiān)控和日志等
a) Register負責客戶端請求到服務(wù)端實例的路由,按照某種負載均衡策略,為客戶端的數(shù)據(jù)庫服務(wù)代理返回一個可用的服務(wù)端實例。
b) Register收集Node節(jié)點上報的負載信息,將負載信息持久化。
c) 監(jiān)控和管理IceGrid域內(nèi)的每個Node和Server的狀態(tài)。
d) 收集與分析各節(jié)點的日志。
4.2. 服務(wù)的處理時序
(1) 客戶端訪問數(shù)據(jù)庫服務(wù),向register請求獲得數(shù)據(jù)庫服務(wù)的代理Proxy。
(2) Register根據(jù)當前負載均衡策略,選擇一個合適的數(shù)據(jù)庫服務(wù)實例,將實例的端點(endpoint)信息返回給客戶端的代理,供業(yè)務(wù)模塊調(diào)用。
(3) 業(yè)務(wù)模塊在獲得代理Proxy后,根據(jù)Proxy的接口調(diào)用服務(wù)實例的數(shù)據(jù)庫訪問方法,如:建立數(shù)據(jù)庫連接,執(zhí)行查詢或更新,關(guān)閉數(shù)據(jù)庫連接等。
(4) 數(shù)據(jù)庫服務(wù)實例響應Proxy的請求。如果當前查詢結(jié)果在緩存中存在,數(shù)據(jù)庫服務(wù)實例直接返回結(jié)果集。否則,服務(wù)實例連接MySQL,執(zhí)行查詢或更新操作。
(5) 數(shù)據(jù)庫服務(wù)實例將MySQL的結(jié)果集加入緩存,返回給客戶端。
(6) 業(yè)務(wù)模塊由代理Proxy得到結(jié)果集。
4.3 服務(wù)的分布部署
Host1服務(wù)器部署Register、MySQL數(shù)據(jù)庫的Master實例、數(shù)據(jù)庫服務(wù)實例、Node節(jié)點等。Host2上的Registry作為Host1上的主Register的備份,在主Registry失效后工作。Host3是一個典型的處理讀操作的服務(wù)節(jié)點。根據(jù)業(yè)務(wù)量的需求,可以通過增加和Host3一樣的服務(wù)器來提高整個分布式數(shù)據(jù)庫的性能,可以根據(jù)服務(wù)器的資源,在Host上增加數(shù)據(jù)庫服務(wù)實例。
5 結(jié)語
針對構(gòu)建分布式MySQL數(shù)據(jù)庫的應用場景,本文提供了一種基于Ice中間件平臺的分布式數(shù)據(jù)庫服務(wù)解決方案,具有以下特點:
(1) 基于MySQL,搭建一主多從的數(shù)據(jù)庫集群,給出了保證數(shù)據(jù)一致的解決方案。
(2) 基于Ice跨平臺、跨語言的特性,數(shù)據(jù)庫服務(wù)的客戶端和服務(wù)端程序可以使用不同語言實現(xiàn),提高了靈活性和兼容性。
(3) 基于Ice的間接代理和IceGrid提供的動態(tài)配置,數(shù)據(jù)庫訪問服務(wù)可以實現(xiàn)位置透明。
(下轉(zhuǎn)第16頁)
(上接第14頁)
(4) 基于IceGrid提供的負載均衡策略,使數(shù)據(jù)庫訪問請求合理分配到各節(jié)點,是一種簡捷高效的分布式數(shù)據(jù)庫訪問服務(wù)的實現(xiàn)手段。
(5) 數(shù)據(jù)庫訪問服務(wù)提供的接口,使開發(fā)人員可以專注于業(yè)務(wù)邏輯的實現(xiàn),簡化了數(shù)據(jù)庫訪問操作。
從系統(tǒng)運行的效果來看,這種分布式MySQL數(shù)據(jù)庫服務(wù)可以適應頻繁的增減設(shè)備和業(yè)務(wù)邏輯變更,有效提高了開發(fā)效率,降低了維護成本。
參考文獻:
[1]Henning M, Spruiell M. Distributed Programming with Ice[M].2009.
[2]蔣躍軍,郭建康.基于ICE中間件的分布式搜索服務(wù)[J].電腦知識與技術(shù),2009,5(22).
[3]張俊軍,章旋.ICE中間件技術(shù)及其應用研究[J].計算機與現(xiàn)代化,2012(5):168.
[4]盧罡,徐勤良,許南山,郭俊霞.復雜網(wǎng)絡(luò)松耦合分布式計算框架的設(shè)計和實現(xiàn)[J].計算機工程,2015,41(11).
[5]丁云亮,谷利澤,楊榆.基于分布式中間件ICE的應用架構(gòu)研究[J].計算機應用,2009,29(28).
[6]丁東京,周明天.基于ICE的局域網(wǎng)監(jiān)控設(shè)計與實現(xiàn)[J].計算機工程與設(shè)計,2007,28(10):2466.
[7]吳治輝.ZeroC Ice權(quán)威指南[M].北京:電子工業(yè)出版社,2015.6.
[8]張偉麗,江春華,魏勁超.MySQL復制技術(shù)的研究及應用[J].計算機科學,2012,39(11A):168.
[9]張飛,姜勁磊,李慶虎.利用MySQL構(gòu)建分布式應用[J].計算機工程與應用,2001,37(18):102.